# sim_smart_car_bridge ROS2 桥接中转节点:将 [Origincar 仿真](https://github.com/mxxxdev/motrixsim) 的 HTTP API(端口 8765)全面桥接到 ROS2 话题。 ## 数据流 ``` origincar_bridge 仿真机 HTTP API ←──── HTTP ────→ ←── ROS2 ──→ 你的其他节点 GET /image ──→ cv_bridge 解码 ──→ sensor_msgs/Image /image GET /imu ──→ 填充字段 ──→ sensor_msgs/Imu /imu/data_raw GET /scan ──→ 填充字段 ──→ sensor_msgs/LaserScan /scan GET /odom ──→ 填充字段 ──→ nav_msgs/Odometry /odom GET /power ──→ Float32 ──→ std_msgs/Float32 /PowerVoltage POST /cmd ←── vx / wz ←── geometry_msgs/Twist /cmd_vel ``` | 方向 | 话题 | 消息类型 | HTTP 端点 | 频率 | |------|------|----------|-----------|------| | 上行 | `/image` | `sensor_msgs/Image` | `GET /image` | 10 Hz(可配) | | 上行 | `/imu/data_raw` | `sensor_msgs/Imu` | `GET /imu` | 30 Hz sync | | 上行 | `/scan` | `sensor_msgs/LaserScan` | `GET /scan` | 30 Hz sync | | 上行 | `/odom` | `nav_msgs/Odometry` | `GET /odom` | 30 Hz sync | | 上行 | `/PowerVoltage` | `std_msgs/Float32` | `GET /power` | 30 Hz sync | | 下行 | `/cmd_vel` | `geometry_msgs/Twist` | `POST /cmd` | 事件驱动 | > **帧 ID**: `camera_front`(图像)、`gyro_link`(IMU)、`laser`(雷达)、`odom`→`base_link`(里程计) ## 依赖 | 依赖 | 用途 | |------|------| | `rclpy` | ROS2 Python 客户端 | | `sensor_msgs` | Image / Imu / LaserScan | | `nav_msgs` | Odometry | | `geometry_msgs` | Twist / Quaternion | | `std_msgs` | Float32 (PowerVoltage) | | `cv_bridge` | OpenCV ↔ ROS Image | | `opencv-python` | JPEG 解码 | | `numpy` | 图像数组 | | `requests` | HTTP 客户端 | ## 安装 ```bash cd git clone http://106.14.170.56:57575/cyy/sim_smart_car_bridge.git src/origincar_bridge colcon build --packages-select origincar_bridge --symlink-install source install/setup.bash ``` ## 使用 ```bash # launch 启动(推荐) ros2 launch origincar_bridge bridge.launch.py http_host:=192.168.11.159 # 直接运行 ros2 run origincar_bridge bridge_node --ros-args -p http_host:=192.168.11.159 ``` ### 运行时调参 ```bash ros2 param set /origincar_bridge image_rate 15.0 ros2 param set /origincar_bridge sync_rate 20.0 ros2 param set /origincar_bridge timeout 2.0 ``` ## 可配置参数 | 参数 | 默认值 | 说明 | |------|--------|------| | `http_host` | `192.168.11.159` | 仿真机 IP | | `http_port` | `8765` | HTTP API 端口 | | `timeout` | `1.0` | HTTP 请求超时 (s) | | `sync_rate` | `30.0` | scan/odom/imu/power 统一同步频率 (Hz) | | `image_rate` | `10.0` | 图像独立拉取频率 (Hz) | | `image_topic` | `/image` | 图像发布话题 | | `imu_topic` | `/imu/data_raw` | IMU 发布话题 | | `scan_topic` | `/scan` | 激光雷达发布话题 | | `odom_topic` | `/odom` | 里程计发布话题 | | `power_topic` | `/PowerVoltage` | 电池电压发布话题 | | `cmd_vel_topic` | `/cmd_vel` | 控制指令订阅话题 | ## 上游 HTTP API | 端点 | 方法 | 返回 | 说明 | |------|------|------|------| | `/image` | GET | JPEG bytes | 前置摄像头图像 | | `/imu` | GET | JSON | IMU 数据(MPU6050 噪声) | | `/scan` | GET | JSON | LSLIDAR N10 2D 激光雷达(360°, 450 点) | | `/odom` | GET | JSON | 里程计(位置/姿态/速度) | | `/power` | GET | JSON | 电池电压 `{"voltage": 12.0}` | | `/state` | GET | JSON | 小车完整状态 | | `/cmd` | POST | — | 控制指令 `{"vx": vx, "wz": wz}` | ### /cmd 控制模式 HTTP `/cmd` 使用差速模式 `{"vx": vx, "wz": wz}`(匹配串口协议,与 `Twist` 语义一致),服务端内部通过 bicycle model 将 `wz` 转为阿克曼转向角。 ```json {"vx": 1.0, "wz": 0.5} ``` ## 项目结构 ``` origincar_bridge/ ├── README.md ├── .gitignore ├── package.xml # ROS2 包清单 ├── setup.py # ament_python 构建入口 ├── setup.cfg ├── resource/ │ └── origincar_bridge # 包标记 ├── launch/ │ └── bridge.launch.py # 启动文件 └── origincar_bridge/ ├── __init__.py └── bridge_node.py # ★ 全功能桥接节点 ```