2. ROS2通信基础

在进入 SROS2 安全机制之前,必须先厘清 ROS2 的通信模型。ROS2 与 ROS1 最大的差异之一,是它不再自建 TCP/UDP 传输层,而是把通信底座交给 DDS(Data Distribution Service)。节点、话题、服务、动作、参数这些概念,本质上都是构建在 DDS 的发布/订阅与请求/应答能力之上的“上层抽象”。理解这层映射关系,是后续配置安全域、密钥、访问控制的前提。

一、核心原理:五类对象与 DDS 的映射

ROS2 中的通信对象可以分成两类:数据面对象(话题、服务、动作)和控制面对象(参数、节点发现)。它们最终都会被 DDS 转换为带主题名的实体。

  • 节点(Node):最小计算单元,是其他对象的容器。在 DDS 中,一个节点通常对应一个 DomainParticipant,它决定了节点加入哪个 DDS 域(Domain ID)。
  • 话题(Topic):异步、多对多的数据流。发布者对应 DataWriter,订阅者对应 DataReader,话题名即 DDS Topic 名。
  • 服务(Service):同步的请求/应答。ROS2 用两个隐藏话题实现:~/request 与 ~/reply,分别对应 DDS 的写者与读者。
  • 动作(Action):长时任务的“目标—反馈—结果”三段式。它由三个服务加两个话题组合而成,是服务与话题的复合体。
  • 参数(Parameter):节点级配置,底层通过参数服务(/node_name/get_parameters 等)暴露,同样走 DDS 请求/应答通道。
关键结论:ROS2 里没有“独立于 DDS 的通信”。每一个话题、服务、动作、参数接口,最终都会在 DDS 层生成一个或多个 Topic,并携带 QoS 与安全属性。

二、方法流程:一次话题通信的完整链路

以“激光雷达节点向避障节点发布 /scan”为例,数据从应用层到网络层的路径如下:

  1. 发布者节点调用 create_publisher,RMW 层将其转换为 DDS DataWriter。
  2. DDS 通过发现协议(SPDP/SEDP)广播该 Topic 的存在与 QoS。
  3. 订阅者节点匹配到同名 Topic 且 QoS 兼容后,建立 DataReader。
  4. 数据序列化(CDR 编码)后经 RTPS 传输,订阅端反序列化并回调。
  5. 若启用 SROS2,则发现与数据传输阶段都会附加身份认证与加密。
# 查看节点与话题的 DDS 映射
ros2 node list
ros2 topic list -t
ros2 topic info /scan --verbose
# 输出中可见 Publisher count / Subscription count
# 以及每个端点的 QoS 与 GID(DDS 全局标识)

三、关系图解:ROS2 抽象层与 DDS 实体

下图把 ROS2 的五类通信对象与 DDS 实体放在同一张关系图中,帮助建立“上层语义—底层实体”的对应直觉。

ROS2 通信对象与 DDS 实体映射关系 ROS2 应用抽象层 节点 Node 容器 / 生命周期 话题 Topic 发布 / 订阅 服务 Service 请求 / 应答 动作 Action 目标 / 反馈 / 结果 参数 配置 DDS / RMW 实体层 DomainParticipant 域参与者 DataWriter / Reader 数据写 / 读 Request / Reply Topic 请求 / 应答主题 3 Service + 2 Topic 动作复合结构 Parameter Service 传输与安全层 RTPS 协议 UDP / 共享内存 发现机制 SPDP / SEDP SROS2 安全插件 认证 / 加密 / 访问控制 密钥库 Keystore

四、案例场景:动作如何拆成服务与话题

以导航中的 NavigateToPose 动作为例,它在 DDS 层实际展开为:

动作组成ROS2 接口DDS 实体方向
发送目标/navigate_to_pose/_action/send_goalServiceClient → Server
取消目标/navigate_to_pose/_action/cancel_goalServiceClient → Server
获取结果/navigate_to_pose/_action/get_resultServiceClient → Server
周期反馈/navigate_to_pose/_action/feedbackTopicServer → Client
状态更新/navigate_to_pose/_action/statusTopicServer → Client

这意味着:给动作做安全策略时,不能只保护一个接口,而要覆盖 3 个服务与 2 个话题共 5 个 DDS 端点。这是 SROS2 权限文件(permissions.xml)中容易遗漏的地方。

五、误区与复盘

常见误区一:认为“服务是点对点、不经过 DDS”。实际上服务同样通过 DDS 的请求/应答主题传输,只是语义上表现为同步调用。
常见误区二:认为“参数是本地内存,不涉及通信”。参数服务默认对其他节点可见,ros2 param get 就是通过 DDS 请求实现的,因此参数也可能成为攻击面。
复盘建议:在规划安全域时,先执行 ros2 topic list 与 ros2 service list,把每个节点实际暴露的 DDS 端点列成清单,再逐一映射到 SROS2 的 allow/deny 规则。动作节点要特别检查其 5 个隐藏端点是否全部纳入策略。