
任务:通过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
我希望发现其它节点
双方收到广播后:
- 发现彼此
- 交换Topic信息
- 交换QoS信息
- 建立DataWriter和DataReader
- 开始传输数据
整个过程完全自动完成。
三、为什么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