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”为例,数据从应用层到网络层的路径如下:
- 发布者节点调用
create_publisher,RMW 层将其转换为 DDSDataWriter。 - DDS 通过发现协议(SPDP/SEDP)广播该 Topic 的存在与 QoS。
- 订阅者节点匹配到同名 Topic 且 QoS 兼容后,建立
DataReader。 - 数据序列化(CDR 编码)后经 RTPS 传输,订阅端反序列化并回调。
- 若启用 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 实体放在同一张关系图中,帮助建立“上层语义—底层实体”的对应直觉。
四、案例场景:动作如何拆成服务与话题
以导航中的 NavigateToPose 动作为例,它在 DDS 层实际展开为:
| 动作组成 | ROS2 接口 | DDS 实体 | 方向 |
|---|---|---|---|
| 发送目标 | /navigate_to_pose/_action/send_goal | Service | Client → Server |
| 取消目标 | /navigate_to_pose/_action/cancel_goal | Service | Client → Server |
| 获取结果 | /navigate_to_pose/_action/get_result | Service | Client → Server |
| 周期反馈 | /navigate_to_pose/_action/feedback | Topic | Server → Client |
| 状态更新 | /navigate_to_pose/_action/status | Topic | Server → 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 个隐藏端点是否全部纳入策略。