Ubuntu22.04系统下ROS2 Humble的通信

任务:通过HDMI线连接开发板和另一台笔记本,可实现在笔记本上订阅到开发板的所有话题,主要是用来rviz2的可视化(由于开发板上没有显示器)。

一、ROS1与ROS2的区别

ROS1通信机制

ROS1采用中心化架构:

复制代码
        ROS Master
             |
      ----------------
      |              |
   Node A         Node B

所有节点启动后都需要向Master注册:

  • 发布哪些Topic
  • 订阅哪些Topic
  • 提供哪些Service

因此ROS1需要配置:

复制代码
export ROS_MASTER_URI=http://192.168.1.100:11311

ROS2通信机制

ROS2取消了Master节点。

采用DDS(Data Distribution Service)作为通信中间件:

复制代码
Node A <-------> Node B
   ^                ^
   |                |
Node C <-------> Node D

所有节点通过DDS自动发现彼此。

因此ROS2不再需要:

复制代码
ROS_MASTER_URI

只需要网络互通即可。

二、DDS自动发现机制

当ROS2节点启动时,DDS会自动广播自己的信息。

例如机器人B启动:

复制代码
ros2 run demo_nodes_cpp talker

DDS会周期性发送:

复制代码
我是Participant
Domain = 2

我发布:
/chatter

同时监控电脑A也会广播:

复制代码
我是Participant
Domain = 2

我希望发现其它节点

双方收到广播后:

  1. 发现彼此
  2. 交换Topic信息
  3. 交换QoS信息
  4. 建立DataWriter和DataReader
  5. 开始传输数据

整个过程完全自动完成。


三、为什么ROS_DOMAIN_ID必须一致

这是ROS2跨机器通信中最容易忽略的问题,DDS内部使用Domain进行网络隔离。

可以把Domain理解成:聊天室编号

例如:三者可以互相发现。

复制代码
Domain 0

机器人A
机器人B
监控电脑

另一组设备:

复制代码
Domain 2

AGV1
AGV2
AGV3

也可以互相发现。


但是:

复制代码
Domain 0
     ×
Domain 2

无法互相发现。

即使:

复制代码
Ping正常
网线正常
IP正常

DDS也会直接忽略对方。


四、配置步骤

第一步:连接网络

电脑A与电脑B通过网线连接。

ROS2跨机器通信的第一步是保证两台设备能够进行网络通信。

例如:

复制代码
监控电脑A:192.168.100.100
机器人B:192.168.100.198
子网掩码:255.255.255.0

两台设备需要位于同一网段(192.168.100.xxx),这样才能通过网线直接通信。

  • IP地址 负责解决两台设备能否通信的问题;
  • ROS_DOMAIN_ID 负责解决两台设备能否发现ROS2节点的问题。

两者关系如下:

复制代码
网线
  ↓
IP通信(Ping正常)
  ↓
DDS发现(ROS_DOMAIN_ID一致)
  ↓
ROS2 Topic通信

因此,即使两台设备能够互相Ping通,如果 ROS_DOMAIN_ID 不一致,仍然无法发现对方的ROS2话题。

通过在 设置 中手动更改ipv4的地址,将两个设备位于同一个局域网192.168.100.XX.

同时可以给该网址命名:这个名称实际上是 你的Ubuntu笔记本给这条网络连接起的名字 ,方便你识别这根网线是接鲁班猫开发板的。这个名字是保存在你当前这台笔记本的 NetworkManager 配置里的,不是保存在网线里,也不是保存在开发板里,所以这个网线插在别的笔记本不会有这个名字。

例如:

复制代码
电脑A:192.168.100.197
电脑B:192.168.100.198

测试连通性:

复制代码
ping 192.168.100.198

出现:

复制代码
64 bytes from ...

说明网络正常。


第二步:检查ROS环境

两台电脑执行:

复制代码
env | grep ROS

确认:

复制代码
ROS_DISTRO=humble
ROS_LOCALHOST_ONLY=0

第三步:统一Domain

在笔记本的终端执行

复制代码
export ROS_DOMAIN_ID=2

检查:

复制代码
echo $ROS_DOMAIN_ID

输出:

复制代码
2

需要与开发板的DOMAIN保持一致,会这开发板与笔记本保持一致。

注意:该方法仅仅是在该终端临时生效,在其他终端无效。


第四步:永久生效

编辑:

复制代码
nano ~/.bashrc

添加:

复制代码
export ROS_DOMAIN_ID=2
export ROS_LOCALHOST_ONLY=0

执行:

复制代码
source ~/.bashrc