Ubuntu22.04系统下ROS2 Humble的通信 📅 2026/7/1 2:40:24 任务通过HDMI线连接开发板和另一台笔记本可实现在笔记本上订阅到开发板的所有话题主要是用来rviz2的可视化由于开发板上没有显示器。一、ROS1与ROS2的区别ROS1通信机制ROS1采用中心化架构ROS Master | ---------------- | | Node A Node B所有节点启动后都需要向Master注册发布哪些Topic订阅哪些Topic提供哪些Service因此ROS1需要配置export ROS_MASTER_URIhttp://192.168.1.100:11311ROS2通信机制ROS2取消了Master节点。采用DDSData Distribution Service作为通信中间件Node A ------- Node B ^ ^ | | Node C ------- Node D所有节点通过DDS自动发现彼此。因此ROS2不再需要ROS_MASTER_URI只需要网络互通即可。二、DDS自动发现机制当ROS2节点启动时DDS会自动广播自己的信息。例如机器人B启动ros2 run demo_nodes_cpp talkerDDS会周期性发送我是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跨机器通信的第一步是保证两台设备能够进行网络通信。例如监控电脑A192.168.100.100 机器人B192.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 配置里的不是保存在网线里也不是保存在开发板里所以这个网线插在别的笔记本不会有这个名字。例如电脑A192.168.100.197 电脑B192.168.100.198测试连通性ping 192.168.100.198出现64 bytes from ...说明网络正常。第二步检查ROS环境两台电脑执行env | grep ROS确认ROS_DISTROhumble ROS_LOCALHOST_ONLY0第三步统一Domain在笔记本的终端执行export ROS_DOMAIN_ID2检查echo $ROS_DOMAIN_ID输出2需要与开发板的DOMAIN保持一致会这开发板与笔记本保持一致。注意该方法仅仅是在该终端临时生效在其他终端无效。第四步永久生效编辑nano ~/.bashrc添加export ROS_DOMAIN_ID2 export ROS_LOCALHOST_ONLY0执行source ~/.bashrc