一.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

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐