【ROS2】ROS2-至今,ROS2多机通讯无法读到树莓派Jetson等ROS2的话题和消息
一.ROS2在使用从Foxy到humble,jazzy等版本,发现存在一个问题:
ROS2双机通讯时,虚拟机端有时无法读到来自树莓派Jetson等ROS2上的话题,尽管重新启动或者重新打开终端也无法解决。
(重新启动设备是可以的,比较麻烦。)
正常情况是能在虚拟机端读出下位机端的话题(在同一个domain作用域,同一个WIFI局域网下),如下图所示。
1.复现问题
在虚拟机端输入ros2 topic list,没有任何话题
在下位机设备(这里选用树莓派5跑ROS2 jazzy)启动基础节点,然后输入ros2 topic list,话题包括陀螺仪、里程计、摄像头等等(当然有,因为它是话题者发布者)

二.分析原因
1.检查作用域(domain)是否相同
使用echo命令打印当前作用域值:echo $ROS_DOMAIN_ID
虚拟机端:
下位机端:
作用域是相同的,所以不是这个的问题。
2.是否Ubuntu的防火墙阻挡
使用sudo ufw disable关闭两个端的防火墙,然后重启机器。
发现没有效果,不是这个问题。
3.其他方法比如设置组播,发现范围配置
尝试多种办法后发现都没有效果。
4.DDS层的问题
DDS层通讯出现了问题,主要表现在默认qos不匹配,导致话题无法发现
将qos改成可靠通讯,发现没有用。
5.最后想到,默认DDS层FastDDS的问题
从FastDDS组件的源码出发,查阅代码后,发现是:
间歇性话题发现主要源于 FastDDS 发现协议的非可靠 UDP 传输和定时机制,在双机网络不稳定时放大。PDP 中的公告丢失(源码:非可靠发送 + 有限重试)和 EDP 中的序列号不一致(源码:Heartbeat 处理)
三.解决方法
既然是DDS组件层的问题,尝试修改源码发现工作量过于庞大。
那么就更换DDS组件层!比如Cyclone DDS
1.安装Cyclone组件↓
# 安装Cyclone DDS
sudo apt update
sudo apt install ros-${ROS_DISTRO}-rmw-cyclonedds-cpp
2.设置DDS组件为Cyclone
暂时使用(每次打开终端时,export变量):
# 使用Cyclone DDS
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
永久使用:
# 打开文本编辑.bashrc
sudo vim ~/.bashrc
在source /opt/ros/jazzy/setup.bash上面增加一行:export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
添加完成后,source ~/.bashrc 一下,或者重启两台机器。
重启后,发现虚拟机端能看到下位机端的话题和消息了:

四.存在问题
1.有时依然会存在搜不到的情况。
这种情况下,关闭虚拟机端和下位机端的所有Terminal(终端,包括SSH)和正在运行的ROS2节点。然后重新打开。
2.测试后发现换成cyclone后ROS2版本gmapping的run save_map service无法使用(可以建图但无法正常保存)。
这主要是ROS2 gmapping的版本过老(最后一次更新6-7年前),不支持cyclone DDS导致的。
建议换成cartographer或者slam_toolbox进行建图,亲测save_map完全可用。
五.感谢点赞
谢谢大家的点赞。有问题可以发送到我的邮箱 davidwang01@yeah.net
更多推荐
所有评论(0)