返回专辑
·Johan·4 分钟阅读

DDS 发现与 QoS:先看见彼此,再谈匹配

discovery 失败与 QoS 不兼容症状相似但修法不同;域 ID、网卡、RMW 要系统级锁定。

DDS 发现与 QoS:先看见彼此,再谈匹配

1. 两层故障,修法完全不同

「偶发找不到话题」可能是参与者看不见彼此(discovery 层),也可能是看见了但 QoS 不兼容(匹配层)。前者改 Reliable/Best Effort 无意义;后者换网线也无意义。我在现场见过同一故障单里同时改 domain、网卡绑定和 QoS,事后完全无法归因。

分诊第一句:对方节点在不在 ros2 node list 里?本机最小 talker/listener 跨主机是否通?两个都否,别进 QoS 调试;两个都通但业务话题无数据,才看 ros2 topic info -v

2. 发现层要锁定的变量

同一 ROS_DOMAIN_ID、正确的网卡/接口、ROS_LOCALHOST_ONLY、RMW 实现与版本——这四项构成环境契约,应和镜像一起发布,而不是每个人 shell 里各写一套。

多网卡未绑定时,DDS 可能选错口:本机 loopback 通、跨机全断。ROS_LOCALHOST_ONLY=1 误开会导致「笔记本上一切正常,上车全无」。容器网络对组播不友好时,优先改 network mode 或 host 模式,不要在业务节点里写死 peer IP——IP 写死后换机房就变成代码变更。

bash
export ROS_DOMAIN_ID=42
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI='<CycloneDDS><Domain><General><NetworkInterfaceAddress>eth0</NetworkInterfaceAddress></General></Domain></CycloneDDS>'

Fast-DDS 与 Cyclone 的 XML 配置路径不同,但思路一致:显式绑定参与 discovery 的接口。

3. 防火墙与组播

企业 Wi‑Fi 或 VLAN 常挡组播/UDP 7400 段。症状是 ros2 node list 只看见本机进程。先用有线固定路径复现,再谈无线优化——否则会把丢包调成算法问题。

需要跨网段时,DDS 支持 unicast peer 列表(vendor 文档里的 INITIAL_PEERS / Peers)。peer 列表是运维配置,不是应用常量;进版本管理的应是「哪张网、哪个 domain」,不是硬编码对端 IP。

4. QoS 匹配:看见不等于能传

discovery 成功后,ros2 topic info -v 显示 Offered vs Requested。Reliable 订阅者订 Best Effort 发布者,兼容矩阵判负,表现是无回调——连接数可能大于零,数据面却空。这类故障在 RViz 里常表现为「有 publisher 无图像」。

传感器流偏 Best Effort + KeepLast(小 depth);状态/配置偏 Reliable + Transient Local。按数据类建剖面表,节点只许从表内选,避免每个 MR 随手改默认。

5. 现场最小证明链

跨主机先跑最小 talker/listener,再上业务图:

bash
# 机器 A
ros2 run demo_nodes_cpp talker
# 机器 B
ros2 run demo_nodes_cpp listener

ros2 doctor --report 收集 RMW、domain、网络接口信息。vendor 工具(如 Fast DDS fastdds discovery)看参与者列表。最小图不通时,禁止进入「调导航参数」阶段——那是浪费时间。

无线链路与有线混部时,discovery 延迟会放大「偶发看不见」。固定有线复现后再优化无线;不要把 jitter 当成「DDS 玄学」。

6. RMW 一致性与车队镜像

同一源码、两台机器 discovery 行为不同,常见原因是 RMW 实现或版本不一致。车队镜像应把 RMW_IMPLEMENTATION 变成只读配置;只升业务 deb 不锁 RMW,会在某一台上突然「全断」。

CI 冒烟至少验证:关键话题 publisher/subscriber 在同一 RMW 预设下兼容。混测 Fast-DDS 与 Cyclone 应显式标注,不要假设「ROS 2 都一样」。

7. 分诊顺序

环境/发现 → QoS → 权限(SROS2)→ 应用回调。跳步会把网络问题调成驱动玄学。SROS2 开启后 discovery 可能正常但数据面被策略拒绝——症状也像「无数据」,但 info -v 里会有权限相关提示。

一次只动一层:先让参与者互相看见,再谈匹配,再谈应用逻辑。每层动完留证据(命令输出截图或日志),故障单才可复现。

8. 验收

  • 干净两机按契约文档五分钟内跑通最小 talker/listener。
  • 故意错 ROS_DOMAIN_ID:应立即失败,日志可指认 domain 不一致。
  • QoS 不兼容时 ros2 topic info -v 可解释,而不是只靠「有时有数据」。
  • 环境契约(domain / 网卡 / RMW)写入镜像或 launch 注释,新人不按文档也能复现。
  • 容器部署改 network mode 后,discovery 恢复可重复验证。

Discovery 回答「谁在」;QoS 回答「能不能传」。两层分开查,比同时改十个变量有用一个数量级。

← 全部文章

johan's blog