1. 课程导入
在机器人系统中,单台计算机往往难以同时承担感知、定位、规划、控制与可视化等全部任务。当机器人本体算力有限、传感器数量增多,或需要多台机器人协同作业时,就必须把计算任务分散到多台设备上,并通过网络让它们像一台机器一样交换数据。这正是 ROS2 多机网络与分布式通信要解决的核心问题。
本课程的目标,是让你从"单机跑通节点"进阶到"多机稳定协同"。学完后,你应当能够:理解 DDS 在 ROS2 中的角色,规划多机网络拓扑,正确配置 ROS_DOMAIN_ID 与中间件,排查跨机通信故障,并在真实的多机器人场景中部署分布式系统。
一、核心概念:从节点到分布式图
ROS2 的计算图由节点(Node)、话题(Topic)、服务(Service)、动作(Action)和参数(Parameter)构成。与 ROS1 最大的不同在于,ROS2 默认不依赖中心化的 Master,而是基于 DDS(Data Distribution Service)实现去中心化的发现与通信。每个节点既是数据的发布者,也是潜在的发现参与者。
在多机环境中,几个关键概念必须分清:
- 域(Domain):由
ROS_DOMAIN_ID标识的逻辑隔离空间,同一域内的节点才能互相发现。 - 发现(Discovery):节点自动寻找同域内其他节点的过程,分为简单发现和端点发现。
- QoS:服务质量策略,决定可靠性、历史深度、持久性等,跨机通信中 QoS 不匹配是常见故障源。
- RMW:ROS Middleware 抽象层,屏蔽不同 DDS 实现的差异,如 Fast DDS、Cyclone DDS。
分布式通信的本质,是让"发现"和"传输"两件事在多台主机之间正确发生。发现失败,节点就互相看不见;传输受阻,话题就收不到数据。
二、整体框架:一张图看清多机通信链路
下图展示了 ROS2 多机通信的整体结构:两台主机各自运行节点,通过 RMW 层接入 DDS,再经由网络完成发现与数据传输。理解这张图,是后续所有配置与排障的基础。
三、典型应用场景
多机分布式通信并非"为了分布式而分布式",它对应着几类真实需求:
| 场景 | 通信需求 | 关键配置 |
|---|---|---|
| 机器人本体 + 上位机 | 传感器数据上传、控制指令下发 | 同域、QoS 可靠传输 |
| 多机器人协同 | 位姿共享、任务分配、避障协商 | 统一域、时间同步 |
| 边缘 + 云端 | 大模型推理、远程监控 | 跨网段、单播发现 |
| 仿真与实机联调 | Gazebo 与真实节点混合运行 | 域隔离、命名空间 |
四、方法流程:多机通信的搭建步骤
无论场景如何变化,多机通信的搭建都遵循一条主线:
- 确认各主机网络互通,能互相 ping 通。
- 统一
ROS_DOMAIN_ID,避免与其他团队冲突。 - 选择并统一 RMW 实现,避免不同 DDS 混用。
- 配置发现方式:组播可用则默认,不可用则改单播发现。
- 检查 QoS 是否匹配,尤其是可靠性与持久性。
- 用
ros2 node list与ros2 topic echo验证跨机通信。
# 主机 A 与主机 B 均执行
export ROS_DOMAIN_ID=42
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# 验证发现
ros2 node list
ros2 topic list
ros2 topic echo /camera/image_raw --once
五、常见误区与复盘
误区一:以为"能 ping 通就能通信"。ROS2 依赖组播发现,很多企业网络或 Wi-Fi 会屏蔽组播,导致节点互相不可见。
误区二:忽略
误区三:QoS 不匹配。发布者用 Best Effort,订阅者要求 Reliable,数据会静默丢失,且不一定报错。
误区二:忽略
ROS_DOMAIN_ID。不同域之间完全隔离,看似"节点消失",实为域不一致。误区三:QoS 不匹配。发布者用 Best Effort,订阅者要求 Reliable,数据会静默丢失,且不一定报错。
排障顺序建议:先看域,再看 RMW,再看发现,最后看 QoS。这个顺序能覆盖绝大多数跨机通信问题。