跳转至

第三方中间件 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,显示摄像头实时图像。