技术文档|打通与ROS的通信,扩展自动驾驶系统生态
概述
新版本Cyber RT对框架进行了改造,支持了Cyber RT与ROS的通信。具有以下功能亮点:
实现常用消息的转换功能,低成本即开即用:
新版本的cyber打通了部分常用传感器的消息通信,实现了相应消息转换功能,包括点云、IMU等消息格式,关心这部分消息通信的用户只需在配置中对齐两端的channel,启动即可使用。
插件化的消息转换框架,提升开发效率:
如果用户还想实现除上述消息以外的消息通信,新版本cyber还提供了基于插件化的消息转换框架,用户无需关心cyber和ros的通信接口,只需实现消息转换函数,配置好对应的channel,就能在Apollo各模块中接收由ros发送出来的消息,进一步提升开发效率。
技术说明
打平通信屏障
ROS 使用 rclcpp 的通信接口,而 Cyber RT 本身也有一套通信接口,由于消息中间件的底层版本/应用层接口的巨大差异,两者互不兼容,并且迁移和适配成本会相当高。
因此,在新的 Cyber RT 版本中,我们打平了通信中间件的版本,开发了 ros-bridge 适配了 ros 2 的通信接口,实现了 消息从 cyber 到 ros_bridge 到 ros 的通路,以及从 ros 到 ros_bridge 到 cyber 的通路:
插件化的消息转换框架,更低开发成本
除了依赖打平和接口适配以外,由于 Apollo 的消息与 ROS 消息定义的不同,开发者使用 ros bridge 的时候是逃不开相互之间的消息转换逻辑的。而这部分消息转换代码与 Cyber RT 的通信接口、ROS 的 rclcpp 接口强耦合,学习成本高,易用性低,并且难以维护。因此,我们基于 Apollo 9.0 中的 Cyber RT 插件机制,解耦消息转换逻辑与 ros_bridge 内部运行逻辑:
开发者只需关注消息如何转换,开发消息转换的插件即可,无需关注各类型通信接口的处理。
- 此处的 ROS 特指 ROS 2 的 foxy - iron 发行版,目前不支持 ROS 1
- 目前 Apollo 环境中,由于 ROS 的环境限制,ROS bridge只支持在 ubuntu 20.04 和 22.04 的镜像上运行,不支持在 18.04 镜像上运行
使用方式
1.前序工作:部署Apollo
要使用新版本Cyber RT的性能分析功能,只需部署最新版本的Apollo即可
源码
源码
- clone Apollo最新代码切换到preview分支
git clone https://github.com/ApolloAuto/apollo.git && git checkout preview
- 使用工程中的aem启动并进入容器
./aem/aem start
- 编译 Apollo
buildtool build
- 配置ros环境
如果需要实现非ros官方的消息通信,用户需要使用 -p 参数指明非标准消息的源码路径,一般指定用户已有的ros工程中的src路径即可
- source ros的脚本
- 编译 ros bridge
包管理
包管理
- clone 最新Apollo工程,切换到preview分支
git clone https://github.com/ApolloAuto/application-core.git && git checkout preview
- 使用工程中的aem启动并进入容器
./aem/aem start
- 安装 Apollo 软件包
buildtool build
- 安装cyber源码
- 配置ros环境
如果需要实现非ros官方的消息通信,用户需要使用 -p 参数指明非标准消息的源码路径,一般指定用户已有的ros工程中的src路径即可
- source ros的脚本
- 编译 ros bridge
2.分场景使用 Cyber RT 中的 ros_bridge 程序
注意事项:
- 由于 fatsrtps 限制,目前 ros_bridge 与 ros 程序的通信只支持 rmw_cyclonedds_cpp 中间件进行通信,如果使用默认 fastrtps 通信会导致程序崩溃,所以请在运行 ros_bridge 的窗口配置以下环境变量指定使用cyclonedds:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
- ros的软件包可以在apollo环境下或者在同一台域控制器内的非apollo环境下运行:
- (推荐)假如 ros_bridge 与 ros 程序不在同一个环境中,需要配置 DOMAIN_ID,请在 ros 工程中的shell窗口以及运行 ros_bridge 的窗口配置以下环境变量,使得ros能够跨环境通信:
export ROS_DOMAIN_ID=0
- 假如 ros_bridge 与 ros 程序在 Apollo 环境中,可以直接拷贝 ros 程序的源码到 Apollo 工程目录的 ros_ws 路径下,然后使用 rosdep、colcon 安装依赖和编译
基础驱动消息通信
2.1 基础驱动消息通信
假设您的域控制器内已存在一个 ROS 工程,如果您的需求只是单纯打通 ros 中的 lidar 驱动、gnss 驱动或者定位算法与 Apollo 各模块的通信,ros_bridge 程序已经内置这些基础消息的转换逻辑,只需在相应的配置文件中修改两方的 channel 即可:
- lidar 消息转换插件
配置文件:
其中,apollo_channel_name_0 指的是 apollo 读取 lidar 消息的 channel,ros_topic_name_0 指的是 ros 程序发送 lidar 消息的 topic。设置完毕后,输入:
启动 ros_bridge 程序,ros_bridge 将会从 "/ros/lidar/pointcloud2" 读取 lidar 的消息,进行一定规则转换,发送到 "/apollo/lidar/pointcloud2" channel 中,供下游 Apollo 模块使用
- gnss 消息转换插件
lidar 消息转换是一对一的关系,而 gnss 部分则相对复杂,涉及到多对多才能完成 ros 的 gnss 消息转换到 apollo 的过程
配置文件:
配置文件的 channel 配置与 lidar 消息转换插件类似,此处不再过多叙述
- 定位消息转换插件
定位消息插件 ros odometry 的消息类型转换成 apollo 的 localization_estimate 以及 transform,此处定位输出的消息必须是世界坐标系的消息,或者能够对应的上 apollo 地图的坐标
自行开发消息转换插件
2.2 自行开发消息转换插件
除上述消息以外,如果您想实现其他消息的转换,可以自行实现消息转换插件,具体逻辑可以参考 lidar 消息转换插件:
完成开发后,还需为 ros_bridge 指定加载这个新插件:
假设新插件类型名为:SamplePlugin
修改完毕使用 buildtool build -p cyber 编译,然后正常启动 ros_bridge即可