Apollo Auto:Cyber RT 与 ROS 通信
1.背景
完成dreamView的启动后,我们需要定制化的录制和debug我们自己的车辆,此时需要修改他们之间的通信,Apollo Auto新版本cyber对框架进行了改造,支持了cyber与ros的通信。具有以下功能亮点:
实现常用消息的转换功能,低成本即开即用:
新版本的cyber打通了部分常用传感器的消息通信,实现了相应消息转换功能,包括点云、IMU等消息格式,关心这部分消息通信的用户只需在配置中对齐两端的channel,启动即可使用
插件化的消息转换框架,提升开发效率:
如果用户还想实现除上述消息以外的消息通信,新版本cyber还提供了基于插件化的消息转换框架,用户无需关心cyber和ros的通信接口,只需实现消息转换函数,配置好对应的channel,就能在Apollo各模块中接收由ros发送出来的消息,进一步提升开发效率
在新的 cyberRT 版本中,打平了通信中间件的版本,开发了 ros-bridge 适配了 ros 2 的通信接口,实现了 消息从 cyber 到 ros_bridge 到 ros 的通路,以及从 ros 到 ros_bridge 到 cyber 的通路:
除了依赖打平和接口适配以外,由于 Apollo 的消息与 ros 消息定义的不同,用户使用 ros bridge 的时候是逃不开相互之间的消息转换逻辑的。而这部分消息转换代码与 cyber 的通信接口、ros 的 rclcpp 接口强耦合,学习成本高,易用性低,并且难以维护。因此,我们基于 Apollo 9.0 中的 cyber 插件机制,解耦消息转换逻辑与 ros_bridge 内部运行逻辑:
下面我们先把ros bridge部署起来
2.ros bridge部署
首先要求我们能够正常的将Apollo Auto10.0安装好,未安装的请移步至:《Apollo Auto10.0安装教程》
安装cyber源码
buildtool install cyber
配置ros环境
buildtool rosenv -t # -t 指的是使用清华源
如果没有安装清华源的可以使用以下指令:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main" > /etc/apt/sources.list.d/ros2.list'
执行source ros的脚本,这一步你会遇到第一个坑
source /opt/ros/iron/setup.sh # 如果您的ubuntu是22.04
source /opt/ros/galactic/setup.sh # 如果您的ubuntu是20.04
具体是执行source /opt/ros/iron/setup.sh 还是source /opt/ros/humble/setup.sh
需要先通过指令:
ls /opt/ros
注意:如果你这里像我一样有两个不同的版本,推荐卸载掉humble,因为我已经通过iron执行成功,humble我还未尝试
卸载方法:
sudo apt remove --purge ros-humble-*
sudo rm -rf /opt/ros/humble
sudo apt autoremove
source /opt/ros/iron/setup.sh
如果不卸载的话,其源码里(/apollo_workspace/application-core/tools/ros/ros_configure.bzl)会强制失败
执行编译:
sudo buildtool build -p cyber
如果出现:[WARNNING] missing dynamic library in ld, try refreash ld cache
那是因为环境变量不对,可以执行:
echo "/opt/ros/$ROS_DISTRO/lib" | sudo tee /etc/ld.so.conf.d/ros-iron.conf
然后把之前编译的资源清掉
sudo buildtool clean
sudo rm -rf ~/.cache/bazel/
再次编译:
sudo buildtool build -p cyber
3.分场景使用 cyber 中的 ros_bridge 程
这块我还没去跟着走一遍,所以后面再回来更新,如果有跟着做完的大佬们,可以在评论区教我一下,感谢