2. ROS2通信基础回顾

在进入多机网络与分布式通信之前,必须先把 ROS2 的通信骨架重新梳理清楚。很多初学者把 ROS2 理解为“话题、服务、动作、参数”四件套,但在多机场景下,真正决定通信能否跨主机、能否被网络发现、能否稳定传输的,是它们背后统一的 DDS 中间件。理解这一层关系,是后续配置多播、单播发现、QoS 与网络隔离的前提。

一、核心原理:五种通信对象与统一中间件

ROS2 的通信对象可以分成两类:一类是“参与者角色”,即节点(Node);另一类是“通信语义”,即话题(Topic)、服务(Service)、动作(Action)和参数(Parameter)。节点是运行实体,其余四者是节点之间交换数据的方式。它们并不是各自独立的传输通道,而是全部建立在 DDS(Data Distribution Service)之上。

DDS 是一种以数据为中心的发布/订阅中间件标准。ROS2 通过 RMW(ROS Middleware Interface)抽象层对接不同的 DDS 实现,例如 Fast DDS、Cyclone DDS、RTI Connext 等。节点在创建发布者、订阅者、服务端、客户端时,RMW 会把它们映射为 DDS 的 DataWriter、DataReader、Topic 以及 QoS 策略。因此,ROS2 的通信能力上限,很大程度上由底层 DDS 的发现机制和 QoS 决定。

关键结论:话题、服务、动作、参数在 ROS2 中不是四套独立协议,而是同一套 DDS 发布/订阅模型上的不同“使用模式”。服务是双向请求/响应,动作是带反馈和取消的长时服务,参数是带服务接口的配置数据。

二、五种对象的关系与映射

下面这张图展示了节点、话题、服务、动作、参数与 DDS 中间件之间的层次关系。可以看到,所有通信语义最终都落到 DDS 的发布/订阅与 QoS 机制上。

ROS2 通信对象与 DDS 中间件层次关系 节点 Node(进程/运行实体) 每个节点可创建多个发布者、订阅者、服务端、客户端、动作端与参数接口 话题 Topic 发布/订阅 单向、多对多 服务 Service 请求/响应 同步、一对一 动作 Action 目标/反馈/结果 长时、可取消 参数 Parameter 配置数据 服务化读写 RMW 抽象层(ROS Middleware Interface) 统一接口,屏蔽不同 DDS 实现差异 DDS 中间件(Fast DDS / Cyclone DDS / Connext 等) DataWriter · DataReader · Topic · QoS · 发现机制 · 网络传输 跨主机通信、多播/单播发现、可靠性、历史、截止时间等策略在此生效

三、方法流程:从节点到 DDS 的创建链路

以创建一个话题发布者为例,ROS2 内部的调用链路大致如下:

  1. 节点调用 create_publisher<MsgT>(topic_name, qos)。
  2. RMW 根据当前选定的 DDS 实现,创建对应的 DDS Publisher 与 DataWriter。
  3. DDS 为该 Topic 注册数据类型,并按照 QoS 配置进行匹配。
  4. DDS 的发现机制在局域网内广播/交换端点信息,寻找匹配的 DataReader。
  5. 匹配成功后,数据通过 DDS 的传输层发送,ROS2 层只负责序列化与回调分发。

服务、动作、参数的创建也遵循类似路径,只是映射的 DDS 实体和 QoS 不同。例如服务通常使用 Reliable QoS,动作在服务基础上增加了反馈话题,参数则通过 /node_name/get_parameters 等服务接口暴露。

# 查看当前节点与话题映射
ros2 node list
ros2 topic list -t
ros2 topic info /chatter --verbose

# 查看底层 RMW 实现
ros2 doctor --report | grep rmw
echo $RMW_IMPLEMENTATION

四、案例场景:多机下同一话题为何“看不见”

假设两台主机 A 和 B 都运行了 ROS2 节点,A 发布 /scan,B 订阅 /scan,但 B 始终收不到数据。排查时常见原因并不是话题名写错,而是 DDS 发现没有成功。此时可以按以下顺序检查:

  • 两台主机的 ROS_DOMAIN_ID 是否一致,不同域 ID 默认互相隔离。
  • 是否处于同一网段,多播是否被交换机或防火墙阻断。
  • QoS 是否兼容,例如发布者 Best Effort、订阅者 Reliable 可能无法匹配。
  • RMW 实现是否一致,混用 Fast DDS 与 Cyclone DDS 时发现行为可能不同。
在多机调试中,先确认“发现”再确认“传输”。ros2 topic list 能看到话题,说明发现成功;能 list 但收不到数据,才需要继续查 QoS 与网络带宽。

五、对比清单:五种通信对象的关键差异

通信对象 通信模式 典型 QoS 多机关注点
话题 Topic 发布/订阅,单向,多对多 Reliable 或 Best Effort 发现、带宽、丢包、多播
服务 Service 请求/响应,同步,一对一 Reliable 服务端可达性、超时
动作 Action 目标/反馈/结果,长时 Reliable + 反馈话题 反馈频率、取消、网络抖动
参数 Parameter 服务化读写配置 Reliable 远程配置、权限、一致性
节点 Node 运行实体,承载以上接口 — 命名空间、域 ID、发现范围

六、误区与复盘

常见误区一:认为“话题、服务、动作、参数”是四套独立协议。实际上它们都跑在 DDS 上,QoS 和发现机制是共通的。
常见误区二:只改话题名就以为能跨机通信。跨机通信的前提是 DDS 发现成功,域 ID、网络、多播、QoS 缺一不可。
常见误区三:忽略 RMW 实现差异。不同 DDS 在默认发现、传输和 QoS 支持上并不完全一致,多机部署应统一 RMW 或明确验证兼容性。

复盘时可以记住一条主线:节点是载体,话题/服务/动作/参数是语义,DDS 是底座。多机网络问题,绝大多数最终都会落到 DDS 的发现与 QoS 上。把这一层关系理顺,后续配置 ROS2 多机通信时就不会只停留在“改环境变量”的层面,而能定位到真正的网络与中间件行为。