第三方中间件 ROS2¶
注意
文件在【SimOne 安装路径】\SimOneAPI\ROS2
SimOne 提供 ROS2(Robot Operating System 2)中间件支持,通过 trans_ros(ROS2 Bridge)将 SimOne 仿真平台与 ROS2 生态连接,实现传感器数据的发布与车辆控制指令的订阅。开发者可在 ROS2 环境中直接接收仿真场景的 GPS、真值、雷达等传感器数据,并通过 ROS2 Topic 下发控制指令驱动仿真主车,适用于基于 ROS2 的自动驾驶算法开发与验证场景。
注意
ROS2 中间件的数据交互流程与接口与 第三方中间件 ROS 基本一致,主要差异在于运行环境、编译工具链和节点 API。如需了解整体数据流设计,可先参考 ROS 文档。
1. 软件环境¶
| 项目 | 要求 |
|---|---|
| 编程语言 | C++ 14 |
| ROS2 发行版 | Eloquent |
| Python 版本 | Python 3 |
| 操作系统 | Ubuntu |
2. 编译环境¶
2.1 安装系统依赖¶
sudo apt-get install uuid-dev libx11-dev libxrandr-dev libsdl2-dev clang libc++-dev libc++abi-dev
2.2 配置 ROS2 环境¶
在 ~/.bashrc 中添加(或每次手动执行):
source /opt/ros/eloquent/setup.bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
2.3 编译工程¶
与 ROS1 使用 catkin_make 不同,ROS2 Bridge 使用 CMake 直接构建:
cd [SimOne 安装目录]/SimOneAPI/ROS2
mkdir build_release
cd build_release
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
make -j$(nproc)
编译产物位于 run/ 目录下的 trans_node 可执行文件。
3. 配置文件¶
运行前需配置 config.ini,主要参数如下:
| 配置项 | 说明 |
|---|---|
[BridgeIO] BridgeIO_IP |
SimOne 服务端 IP 地址 |
[HostVehicle] Vehicle_ID |
主车 ID,默认0 |
[Sensor] ENABLED |
是否启用物理传感器(摄像头/点云),1 启用 |
[Sensor] IMG_IP / IMG_PORT |
摄像头流接收地址与端口 |
[Sensor] PCD_IP / PCD_PORT / PCD_PORT_INFO |
点云流接收地址与端口 |
[ROS] GPS_Topic |
GPS 数据发布 Topic 名称 |
[ROS] GroundTruth_Topic |
障碍物真值发布 Topic 名称 |
[ROS] SensorDetection_Topic |
传感器感知结果 Topic 名称 |
[ROS] Image_Topic |
摄像头图像 Topic 名称 |
[ROS] PointCloud_Topic |
激光雷达点云 Topic 名称 |
[ROS] Radar_Topic |
毫米波雷达 Topic 名称 |
[ROS] LaneInfo_Topic |
车道线信息 Topic 名称 |
[MapBase] BASE_LATITUDE |
地图基准点纬度 |
[MapBase] BASE_LONGITUDE |
地图基准点经度 |
[MapBase] BASE_ALTITUDE |
地图基准点高度 |
[ROS] CTL_Topic |
主车控制指令订阅 Topic(离散点控制) |
[ROS] POSE_CTL_Topic |
主车控制指令订阅 Topic(油门/刹车/方向控制) |
[ROS] ESP_CTL_Topic |
主车控制指令订阅 Topic(ESP 控制) |
4. 数据通信接口¶
4.1 SimOne → ROS2(发布)¶
通过 SimOneAPI 回调注册后,trans_node 将仿真数据转换为 ROS2 消息并发布至对应 Topic:
// 注册 GPS 回调,发布至 GPS Topic
SimOneAPI::SetGpsUpdateCB(pub_gps_cb);
// 注册障碍物真值回调,发布至 GroundTruth Topic
SimOneAPI::SetGroundTruthUpdateCB(pub_ground_truth_cb);
// 注册传感器感知结果回调
SimOneAPI::SetSensorDetectionsUpdateCB(&trans::pub_sensor_detections_cb);
// 注册毫米波雷达回调
SimOneAPI::SetRadarDetectionsUpdateCB(pub_radar_detections_cb);
// 注册车道线信息回调
SimOneAPI::SetSensorLaneInfoCB(pub_sensor_laneInfo_cb);
// 启用物理传感器时,注册摄像头和点云回调
SimOneAPI::SetStreamingImageUpdateCB(img_ip.c_str(), img_port, pub_image_cb);
SimOneAPI::SetStreamingPointCloudUpdateCB(pcd_ip.c_str(), pcd_port, pcd_port_info, pub_point_cloud_cb);
支持的消息类型(msg_gen 包):
| ROS2 消息类型 | 对应仿真数据 |
|---|---|
msg_gen::gps |
主车 GPS / 位姿 |
msg_gen::obstacle |
障碍物真值 |
msg_gen::sensordetections |
传感器感知结果 |
msg_gen::radardetection |
毫米波雷达目标 |
msg_gen::laneinfo |
车道线信息 |
sensor_msgs::Image |
摄像头图像(物理传感器) |
sensor_msgs::PointCloud2 |
激光雷达点云(物理传感器) |
4.2 ROS2 → SimOne(订阅)¶
trans_node 订阅控制 Topic,将 ROS2 控制消息转发至 SimOneAPI 驱动仿真主车:
// 设置离散点控制(SetPose)
pose_ctl = &SimOneAPI::SetPose;
// 设置油门/刹车/方向控制(SetDrive)
drive_ctl = &SimOneAPI::SetDrive;
5. 与 ROS1 的主要差异¶
| 对比项 | ROS(ROS1) | ROS2 |
|---|---|---|
| 发行版 | Melodic / Noetic | Eloquent |
| 编译工具 | catkin_make |
CMake 直接构建 |
| 节点基类 | ros::NodeHandle |
rclcpp::Node |
| 节点初始化 | ros::init() |
rclcpp::init() |
| 日志输出 | ROS_INFO(...) |
RCLCPP_INFO(this->get_logger(), ...) |
| 消息依赖中间件 | rosidl(ROS1) | rosidl + Fast-RTPS(DDS) |
| 工程结构 | catkin workspace | 独立 CMake 工程 |
6. 运行流程¶
6.1 启动仿真¶
(1)SimOne 仿真端操作
- 启动 SimOne,新建测试用例
- 新建测试主车(加载相关传感器,配置控制系统为手动 / API 控制)
- 运行用例(选择主车)
(2)ROS2 端操作
cd [SimOne 安装目录]/SimOneAPI/ROS2/run
./trans_node
6.2 数据验证¶
- 使用
ros2 topic echo /gps查看实时 GPS 数据输出; - 使用 RViz2 订阅
PointCloud2 Topic,观察点云实时更新; - 使用 RViz2 订阅
Image Topic,显示摄像头实时图像。