ROS2替换中间件为Cyclone_DDS
1.一些介绍:)
上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编写
ros1和ros2还有一个很重要的区别就是底层通信框架,ros1采用的是xmlRPC, ros2采用的是DDS。
DDS 是一种端到端中间件,提供与 ROS 系统相关的功能,例如分布式发现(不像 ROS 1 中那样集中式)和对传输的不同“服务质量”选项的控制。也就是去中心化,ros2使用DDS后不再依赖roscore。DDS的实现又有很多种例如: RTI 的Connext DDS、eProsima 的Fast DDS、Eclipse 的Cyclone DDS或 GurumNetworks 的GurumDDS。ubuntu20.04 Foxy 默认的是FastDDS无需额外安装即可使用。
2.不同DDS的RMW实现
为了将 DDS/RTPS 实现与 ROS 2 结合使用,需要一个桥梁(又称接口或rmw简称rmw)包,该包使用 DDS 或 RTPS 实现的 API 和工具来实现抽象的 ROS 中间件接口。
名称许可证RMW实现维护状态eProsima Fast DDSApache 2rmw_fastrtps_cppFull support. Default RMW. Packaged with binary releases.Eclipse Cyclone DDSEclipse Public License v2.0rmw_cyclonedds_cppFull support. Packaged with binary releases.RTI Connextcommercial,researchrmw_connext_cppFull support. Support included in binaries, but Connext installed separately.GurumNetworks GurumDDScommercialrmw_gurumdds_cppCommunity support. Support included in binaries, but GurumDDS installed separately.
大多情况下,使用不同 RMW 实现的节点能够进行通信,但这并非在所有情况下都是如此。
Fast DDS <–> Connext
WString 使用Fast DDS 发布后无法被 macOS 上的 Connext 正确接收
Connext <–> Cyclone DDS
不支持发布/订阅通信WString
Connext Dynamic <–> Connext Dynamic
不支持 C 服务
3.默认的FastDDS替换为Cyclone DDS
i.安装依赖
sudoaptinstall ros-foxy-rmw-cyclonedds-cpp
sudoaptinstall ros-foxy-rosidl-generator-dds-idl
ii.编译 cyclone-dds
编译 cyclonedds 前请确保在启动终端时没有 source ros2 相关的环境变量,否则会导致 cyclonedds 编译报错。如果安装 ROS2 时在~/.bashrc中添加了 " source /opt/ros/foxy/setup.bash ",需要修改 ~/.bashrc 文件将其删除:
sudovi ~/.bashrc
# source /opt/ros/foxy/setup.bash
开始编译cyclone-dds
cd ~/ros2_workspace/cyclonedds_ws/src
#克隆cyclonedds仓库git clone https://github.com/ros2/rmw_cyclonedds -b foxy
git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x
cd..
colcon build --packages-select cyclonedds #编译cyclonedds
编译完成后重新打开ros2的环境变量并执行source
4.配置网络
使用 ifconfig 查看网络信息,确认ros组网的以太网网卡。(例如如图中的enp0s31f6,以实际为准)
打开~/.bashrc编辑
#!/bin/bashecho"setup ros2 environment"source /opt/ros/foxy/setup.bash
source$HOME/ros2_workspace/cyclonedds_ws/install/setup.bash
exportRMW_IMPLEMENTATION=rmw_cyclonedds_cpp
exportCYCLONEDDS_URI='<CycloneDDS><Domain><General><Interfaces>
<NetworkInterface name="enp0s31f6" priority="default" multicast="default" />
</Interfaces></General></Domain></CycloneDDS>'
保存后
source ~/.bashrc
测试连接效果:
ros2 topic list
如果出现了你发布的那些话题,那么恭喜你成功咯 :)
当然了如果你没发现目标topic,也可能是domain ID 的问题,默认是0,俩边通信这个值需要一致,我们后面再着重探讨下domain ID的配置。
作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正
版权归原作者 费码程序猿 所有, 如有侵权,请联系我们删除。