前言前几期我们同时在RDKX5上部署了双激光雷达融合和双摄像头推理【ROS2多激光雷达融合】基于ROS2的双2D激光雷达点云融合与遮挡剔除方案【RDKX5多摄像头模型推理】USB带宽限制与ROS2话题零拷贝转发很明显出现的一个情况就是当车上同时启动多激光雷达和多摄像机的时候由于RDKX5的4个USB接口同时共用一条总线导致总线带宽与供电压力瞬间达到上限从而触发USB 设备包括网卡驱动整体重连甚至系统级掉线。典型内核日志如下5usb1-1.2:cleartt1(90d2)error-71usb1-1: USB disconnect, device number2usb1-1.1: USB disconnect, device number3uvcvideo... Failed to resubmit video URB(-19)cdc_ncm... unregistercdc_ncmrndis_host... unregisterrndis_host那么为了解决上述问题我们计划使用两块 RDKX5 分别承担不同计算负载并通过 ROS2 DDS 进行多机通信。1 ROS2多机通讯1-1 无线通讯在 ROS2 中多机通信本质上依赖 DDSData Distribution Service的自动发现机制。只要满足以下条件即可实现节点自动发现与话题互通。所有设备处于同一局域网使用相同的ROS_DOMAIN_ID在所有设备上统一配置export ROS_DOMAIN_ID10可以看到各个设备上都能直接进行话题通讯1-2 局限但是考虑到局域网网络波动以及数据传输延迟等因素我们这里使用网线直接将两块RDKX5直接相连然后通过网线配置静态ip的方式配合ROS2配置CycloneDDS实现有线通讯。2 网线配置静态ip2-1 绑定有线网口我们分别在两块板子上设置sudo ip addr flush dev eth0 sudo ip addr add 192.168.10.1/24 dev eth0 sudo ip link set eth0 up另一块板子sudo ip addr flush dev eth0 sudo ip addr add 192.168.10.2/24 dev eth0 sudo ip link set eth0 up2-2 测试可以使用下述命令测试绑定的ipip addr show eth0然后我们可以通过ping的方式测试是否能访问到另一快板子ping 192.168.10.23 ROS2配置CycloneDDS3-1 DDSDDSData Distribution Service是 ROS2 的底层通信中间件标准用于实现节点之间的发布/订阅通信机制。与 ROS1 依赖中心化 Master 不同ROS2 采用 DDS 实现去中心化通信架构。DDS 的核心特点包括去中心化通信节点自动发现无需中心服务器发布/订阅模型数据生产者与消费者解耦基于 QoS 策略支持可靠性、延迟、历史缓存等配置跨网络通信能力支持局域网甚至跨域通信需配置常见 DDS 实现包括DDS 实现特点Fast DDS默认实现生态成熟CycloneDDS轻量、低延迟、配置灵活RTI Connext工业级高性能但商业授权3-2 CycloneDDSCycloneDDS 是 ROS2 官方支持的 DDS 实现之一特点是轻量、高性能、可配置性强非常适合嵌入式平台如 RDKX5和多机系统部署。安装sudo apt install ros-humble-rmw-cyclonedds-cpp安装后只需设置环境变量即可切换 DDS 实现export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp可以检查自己是否成功设置了echo $RMW_IMPLEMENTATION3-3 CycloneDDS配置文件CycloneDDS 支持通过 XML 文件进行网络优化配置我们分别在两个RDKX5的任意位置新建cyclonedds.xml(需要记住路径后面要使用以本教程为例子放置在/root/cyclonedds.xml)然后我们添加如下内容?xml version1.0 encodingUTF-8 ?CycloneDDSxmlnshttps://cdds.io/configxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttps://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsdDomainId10GeneralInterfacesNetworkInterfacenameeth0//InterfacesAllowMulticastfalse/AllowMulticast/GeneralDiscoveryPeersPeerAddress192.168.10.1/PeerAddress192.168.10.2//PeersParticipantIndexauto/ParticipantIndexMaxAutoParticipantIndex1000/MaxAutoParticipantIndex/DiscoveryTracingVerbosityconfig/VerbosityOutputFilecdds.log.${CYCLONEDDS_PID}/OutputFile/Tracing/Domain/CycloneDDSDomain Id10该配置适用于所有 DDS Domain,配合前面说的ROS_DOMAIN_ID使用NetworkInterface nameeth0/强制指定 DDS 使用 eth0 网卡通信AllowMulticastfalse/AllowMulticast关闭 DDS multicast组播发现机制Discovery为节点发现机制Peer Address192.168.10.1/手动指定 DDS 通信对端节点,替代 multicast 自动发现机制ParticipantIndexauto/ParticipantIndex自动分配 DDS participant indexVerbosityconfig/Verbosity为日志级别设为config3-4 加载配置我们同一加载下述配置可以把下述内容写在.bashrc里头export ROS_DOMAIN_ID10 export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp export CYCLONEDDS_URIfile://$HOME/cyclonedds.xml然后我们再次运行发布与订阅节点ros2 run demo_nodes_cpp talker远端和本地同时打开监听节点可以看到由于走了有线DDS本地自然就无法进行访问了。ros2 run demo_nodes_cpp listener3-5 bashrc同一配置板子A:sudo ip addr flush dev eth0 sudo ip addr add 192.168.10.1/24 dev eth0 sudo ip link set eth0 up export ROS_DOMAIN_ID10 export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp export CYCLONEDDS_URIfile://$HOME/cyclonedds.xml板子B:sudo ip addr flush dev eth0 sudo ip addr add 192.168.10.2/24 dev eth0 sudo ip link set eth0 up export ROS_DOMAIN_ID10 export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp export CYCLONEDDS_URIfile://$HOME/cyclonedds.xml3-6 本地无法访问Rviz2的解决措施通过上述配置两块RDKX5进行静态IP进行DDS通讯的时候本地是无法像以前一样通过DDS访问到车上的topic的因此解决方式是两块RDKX5至少有一个使用桌面端然后通过x11转发的方式回传RVIZ2这个可以参考之前写的文章【Linux-SSH远程窗口回传】使用X11或Wayland进行SSH窗口转发ssh -cx root192.168.3.3补充报错如果出現以下报错需要吧最大参与者设置一下即可MaxAutoParticipantIndex1000/MaxAutoParticipantIndex补充关闭log日志如果你发现你的目录下多了很多ccds.logs.XXX,请注释掉以下内容TracingVerbosityconfig/VerbosityOutputFilecdds.log.${CYCLONEDDS_PID}/OutputFile/Tracing总结本文围绕 RDKX5 双机ROS2通信系统的搭建过程完成了从网络层到DDS层的整体配置设计。在网络层通过对两块设备分别配置静态 IP192.168.10.1 / 192.168.10.2并启用 eth0 有线直连实现稳定局域网通信。在 ROS2 层统一设置ROS_DOMAIN_ID10并切换至 CycloneDDS 实现通信中间件统一。进一步通过 XML 配置文件对 CycloneDDS进行定制包括指定通信网卡为 eth0、关闭 multicast 组播发现机制、使用 Peer 方式手动定义通信节点并启用自动 ParticipantIndex 分配。同时结合日志系统输出配置实现多节点通信过程的可观测性。最终构建出基于有线网络的 ROS2 多机 DDS 通信架构实现节点间稳定的发布/订阅数据交互。如有错误欢迎支持感谢大家的支持