Reference

DDS & QoS
DDS 和其他连接方式不同的是其以数据为中心,不依赖中心化的一个网络端口,也不需要中间的代理。DDS 是 ROS2 的底层交流协议。
DDS是”低延迟、高频、强类型、LAN 内”场景的最佳选择,在 Robotics 中可以负责广泛的信息传输,比如:
rt/lowstate—— 机器人发布,工作站订阅(28 个电机的 q、dq、tau、温度、IMU 等)rt/lowcmd—— 工作站发布,G1 订阅(下发给每个电机的目标位置、kp、kd、torque)- 通过 topic 支持传感器数据、日志、机器人位姿估计等信息交流的需求。
DDS 交流的核心概念是 Domain ID,一个进程的信息仅在该 Domain ID 的域内交换,不同 Domain ID 间无法进行交流。同一个 Domain ID 内有多个 Topic,作为同一 domain 内的数据通道,按 topic name + data type 组织,由 DomainParticipant 在该 domain 里创建和使用。这个 Topic 正是 ROS2 topic 的底层通信方式。
Domain (domain ID)
└── DomainParticipant (每个进程/节点实例)
├── Publisher / Subscriber
│ ├── DataWriter
│ └── DataReader
└── Topic(引用/使用)
以上是 DDS 交流的结构关系。其中
Domain是 DDS 交流的基础,整数作为 ID,由特定规则将 ID 和 UDP 连接端口映射;DomainParticipant是一个进程在某个 Domain 中的“身份 + 通信上下文”;Publisher / Subscriber是机器人与 Server 间建立连接的方式,信息流通发生在这部分,其连接原则要遵守下文介绍的 QoS。
每个DomainParticipant通过 Discovery 机制发现其他DomainParticipant:
启动阶段(自动,无需配置)
Participant A Participant B
│ │
│ ─── PDP via multicast ────────►│ "我在这,GUID=xxx"
│◄────── PDP ────────────────────│ "我也在这"
│ │
│ ─── EDP via unicast ──────────►│ "我有 Writer X 订 topic T"
│◄────── EDP ────────────────────│ "我有 Reader Y 订 topic T"
│ │
│ 两边各自做 QoS Matching │
│ 匹配成功后,数据才开始流动 │
│ │
│ ────── DATA via unicast ──────►│
- PDP(Participant Discovery Protocol):靠 UDP multicast
239.255.0.1+ Domain 对应端口找邻居,discovery_multicast_port = 7400 + 250 × domain_id - EDP(Endpoint Discovery Protocol):邻居互发 topic/QoS 清单
- 数据流默认 unicast(不是 multicast)
- 完全无 broker——这是 DDS 灵魂
QoS
DDS 的 Publisher / Subscriber之间能否建立连接取决于 QoS:
Compatibility of reliability QoS policies 可靠性服务质量策略的兼容性:
| Publisher 出版商 | Subscription 订阅 | Compatible 兼容的 |
|---|---|---|
| Best effort 尽最大努力 | Best effort 尽最大努力 | Yes 是的 |
| Best effort 尽最大努力 | Reliable 可靠的 | No 不 |
| Reliable 可靠的 | Best effort 尽最大努力 | Yes 是的 |
| Reliable 可靠的 | Reliable 可靠的 | Yes 是的 |
Compatibility of durability QoS policies 持久性 QoS 策略的兼容性:
| Publisher 出版商 | Subscription 订阅 | Compatible 兼容的 | Result 结果 |
|---|---|---|---|
| Volatile 易挥发的 | Volatile 易挥发的 | Yes 是的 | New messages only 仅限新消息 |
| Volatile 易挥发的 | Transient local 瞬态局部 | No 不 | No communication 没有任何沟通 |
| Transient local 瞬态局部 | Volatile 易挥发的 | Yes 是的 | New messages only 仅限新消息 |
| Transient local 瞬态局部 | Transient local 瞬态局部 | Yes 是的 | New and old messages 新旧消息 |
| 4 个核心 QoS: |
| QoS | 选项 | 你机器人栈里的例子 |
|---|---|---|
| Reliability | BEST_EFFORT / RELIABLE | rt/lowstate 500Hz 用 BEST_EFFORT;action 指令用 RELIABLE |
| Durability | VOLATILE / TRANSIENT_LOCAL | /tf_static、机器人描述用 TRANSIENT_LOCAL(晚订阅也能拿到) |
| History | KEEP_LAST(n) / KEEP_ALL | 控制环一律 KEEP_LAST(1),只要最新 |
| Deadline | 周期时间 | 心跳检测:2ms 没收到 lowstate 就判定掉线 |
调试指令
ddsls —— 看谁在发什么、配对了没
# 看本 Domain 里所有 Participant
ddsls -t dcpsparticipant
# 看谁在发什么 topic、QoS 是什么
ddsls -t dcpspublication
# 看 Writer/Reader 是否成功配对(最关键)
ddsls -t dcpsmatchedpublication
ddsls -t dcpsmatchedsubscriptionRos2 命令行 —— ROS 2 视角
ros2 topic list
ros2 topic info /rt/lowstate -v # -v 显示 QoS!
ros2 topic hz /rt/lowstate # 实际接收频率
ros2 doctor # 一键体检