Reference

image.png 1776150568793065054.png

DDS & QoS

image.png 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选项你机器人栈里的例子
ReliabilityBEST_EFFORT / RELIABLErt/lowstate 500Hz 用 BEST_EFFORT;action 指令用 RELIABLE
DurabilityVOLATILE / TRANSIENT_LOCAL/tf_static、机器人描述用 TRANSIENT_LOCAL(晚订阅也能拿到)
HistoryKEEP_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 dcpsmatchedsubscription

Ros2 命令行 —— ROS 2 视角

ros2 topic list
ros2 topic info /rt/lowstate -v   # -v 显示 QoS!
ros2 topic hz /rt/lowstate        # 实际接收频率
ros2 doctor                       # 一键体检