ROS 2 在机器人上找不到对方:DDS 发现、网卡和多机隔离

0 阅读4分钟

ROS 2 项目里有一类问题特别耗时间:节点明明都启动了,ros2 topic list 却看不到对方;或者在实验室好好的,带到现场接上 5G 后,话题时有时无;又或者两台机器人在同一个网络里,互相收到了对方的数据。这些问题大多和 DDS 的发现机制、网卡选择和多机隔离有关。下面是通用的配置思路,未经实机验证,细节以所用 DDS 实现和 ROS 2 版本的文档为准。

【发现是怎么进行的】 ROS 2 底层使用 DDS。默认情况下,各个参与者通过组播在局域网里互相宣告自己的存在,收到宣告后建立连接,再交换话题信息。 这套机制在单机和简单局域网里很方便,但在机器人上会遇到几个问题:多网卡时不知道该用哪块网卡;有些网络不支持或禁用了组播;同一网络里有多台机器人时,大家都能互相发现。

【多网卡要指定】 机器狗上装的算力模组常常有多个网络接口:连接本体的有线网口、连接传感器的网口、无线网卡、5G 模组的虚拟网卡、Docker 的虚拟网桥。DDS 默认可能在所有接口上发送发现报文,也可能选错接口。 常见做法是在 DDS 的配置文件中明确指定使用哪块网卡,或者只允许本机回环和某个内部网段。只在本机内部通信的节点,可以限制为仅使用本地接口,减少不必要的网络流量。

【组播不可用时】 蜂窝网络、部分企业网络和 VPN 通常不支持组播。这时可以改用单播发现,在配置里写明对端地址;也可以使用发现服务器模式,由一个中心节点负责协调发现。 跨网络的远程监控,一般不建议让 DDS 直接穿越公网。更常见的做法是在机器人上部署一个桥接服务,只把需要的数据转换后通过其他协议传给远程端。

【多机隔离】 同一网络中的多台机器人,需要用 ROS_DOMAIN_ID 区分。不同的 Domain ID 对应不同的端口范围,彼此不会互相发现。部署时为每台机器人分配固定的 ID,写进启动配置,而不是依赖每个人手动设置环境变量。 如果需要多台机器人共享部分数据,可以通过专门的桥接节点在不同 Domain 之间转发指定话题。

【大数据量的话题】 点云和图像话题数据量大,跨进程传输时开销明显。同一台机器上的节点,可以考虑使用共享内存传输或者组件化合并到同一进程。跨机传输时,要根据网络带宽调整 QoS,比如对高频图像使用 best effort,并控制发布频率。 UDP 缓冲区大小也会影响大消息的传输,系统默认值偏小时,大点云消息容易丢包,可以按需调大内核参数。

【排查的顺序】 先确认 Domain ID 和 RMW 实现两边一致;再确认网络接口和防火墙;然后用 DDS 自带的工具或 ros2 doctor 查看发现情况;最后检查 QoS 是否兼容。这些配置适合在部署阶段统一整理,写进启动脚本和配置文件,而不是留在某个人的终端环境变量里。

【容器里的 ROS 2】 上装软件常用容器部署,容器的网络模式会影响 DDS 的发现。使用桥接网络时,容器内的节点和宿主机、其他容器之间的组播可能不通;使用主机网络模式则和宿主机共享网络栈,配置更简单,但隔离性差一些。共享内存传输在容器之间使用时,需要共享相应的内存区域。部署方案确定后,把网络模式、DDS 配置文件和 Domain ID 一并写进容器的启动配置,避免现场临时修改。

【小结】 ROS 2 的通信问题,多数和发现机制有关。指定网卡、在不支持组播的网络中改用单播或发现服务器、用 Domain ID 隔离多机、为大数据量话题调整传输方式,是机器狗上装部署时应当提前确定的配置。

机器人智能化改造与系统集成:www.yuanzhirobot.com/zh/service/… 本文部分内容由 AI 辅助生成。