多机发现与命名:先定协作模型,再谈话题
隔离 domain 或同域 namespace 二选一;ROS_DOMAIN_ID、发现与带宽在算法之前。

1. 两台车同域无前缀——话题撞车
实验室两台 TurtleBot 都订 /cmd_vel、都发 /scan,DDS 图里订阅者收到两路混合数据,定位偶发跳变,谁也说不清是哪台车的点云。加 remap 打地鼠两周后,发现根因是从未定协作模型:要完全隔离,还是共享协调话题?模型不定,命名与发现层永远补不完。
2. 两种主路径
强隔离:每机独立 ROS_DOMAIN_ID,机间通信用显式网关节点(ROS–ROS bridge 或应用层 API)。安全边界清晰,适合异构车队、不可信网络。同域分 namespace:共域 ID,/robot_a/scan、/robot_b/scan,紧耦合协同(编队、调度)实现简单,但发现与带宽压力全进同一域。
# 机 A
export ROS_DOMAIN_ID=0
ros2 run ... --ros-args -r __ns:=/robot_a
# 机 B — 同域不同 namespace
export ROS_DOMAIN_ID=0
ros2 run ... --ros-args -r __ns:=/robot_b没有第三种「先跑再说」——混用 domain 与裸 topic 是技术债复利。架构评审第一轮只问两件事:机间要不要看到对方传感数据?控制指令能不能跨机?答案若都是否,强隔离几乎总是更便宜。
3. 发现层:组播与 peer
默认 UDP 组播在 Wi-Fi、跨 VLAN、云 VPN 上常受限。症状是「同网段 ping 通,但 ros2 topic list 对端为空」。排查顺序:
echo $ROS_DOMAIN_ID
echo $ROS_LOCALHOST_ONLY
ros2 doctor --report受限环境可指定 initial peers(Fast DDS / Cyclone 配置 XML),或换 shared memory(同机多进程)。发现问题是网络/配置问题,不是换 SLAM 能解决的。
4. 带宽是一等约束
同域四台车各发 10 Hz 点云 + 30 Hz 图像,无线链路被 DDS 扇出占满,控制指令丢包。架构上:传感数据默认不跨机;跨机白名单只保留位姿、任务、心跳、地图摘要等低带宽话题。白名单之外的新 topic 需评审——不是「能发现就该订」。
| 类别 | 默认策略 |
|---|---|
| 激光/图像/点云 | 本机 namespace,不跨机 |
| 位姿/任务/心跳 | 可跨机,显式名 |
| 调试 echo | 禁止全车扇出 |
5. 网关节点:唯一跨域点
强隔离模式下,机间交互应经过单一网关进程:审计、限流、协议转换集中在一处。禁止每台车直接订对端原始 /scan——既难审计,也无法在链路劣化时限流。
# 协调话题白名单示例(架构文档,非代码默认)
allowed_inter_robot:
- /fleet/{id}/pose
- /fleet/{id}/task_status
- /fleet/heartbeat6. 验收
- 两机最小互通:白名单 topic 双向可见,非白名单不可见(或不可路由)
ros2 topic hz与带宽监控:丢包率上升时控制仍可达- TF:每机树独立前缀,
/robot_a/map与/robot_b/map不混 - 录 bag 时 namespace 前缀完整,避免复盘时「这是哪台车」
Fleet 级监控应带 robot_id 标签,与 ROS namespace 一一映射,否则监控曲线与 DDS graph 对不上号。
记录 ROS_DOMAIN_ID、namespace 规则、peer 配置进机器人型号 release 包。
7. 与 launch 的接缝
Composable 容器、多机 launch 常漏设 namespace 或 domain。启动摘要应打印:domain_id、namespace、关键 remap。CI 可 lint launch 文件:断言每节点有 __ns 或等价隔离。
8. 案例:展厅 Wi-Fi 上的「随机丢定位」
三机同域 + 全量扇出,AMCL 在观众手机占满 2.4 G 时偶发丢 /scan。改为分 namespace + 仅网关同步位姿后,单机传感不再跨无线。协调延迟从「不可预测」变为「可测几十毫秒」——编队算法才谈得上调参。
9. 默认策略
先写协作模型(隔离 vs 同域协同),再写 launch;发现与带宽与算法同级;机间话题白名单先于功能开发。功能叠在错误拓扑上,remap 只会越补越乱。
10. DDS 实现差异
Fast DDS 与 Cyclone DDS 对 discovery、shared memory、large data 的行为不同。多机文档应注明现场使用的 RMW 与对应 XML 片段(如 FASTRTPS_DEFAULT_PROFILES_FILE)。换 DDS 实现后「同配置不同表现」时,先 diff discovery 配置,再怀疑算法。单机多进程可优先 shared memory 减拷贝,跨机则回到 UDP/TCP 与带宽预算。ROS_LOCALHOST_ONLY=1 可隔离本机调试与车间网络,但会阻断跨机发现——文档须标注何时开启。
相关
也可以看看
johan's blog