同机 ROS2 默认走 UDP 网卡速度不如原生 UDP只要开启 ROS2 DDS【共享内存 SHM 零拷贝】ROS2 延迟、吞吐量、CPU 占用全面碾压原生 UDP。原生 UDP 典型延迟100~300μsROS2 共享内存50μs、甚至 5~20μs吞吐量提升10~100 倍。一、为什么 ROS2 默认比 UDP 慢ROS2 底层是DDS 中间件Fast DDS/Cyclone DDS跨机默认走UDP 组播 / 单播要经过网卡、内核协议栈、打包解包、内存拷贝延迟高、带宽受限千兆网卡≈125MB/s同机节点ROS2 默认不一定自动开共享内存依然走 UDP 回环网卡绕一圈协议栈比直接原生 UDP socket 还慢原生 UDP直接内核 socket、短路径、无中间件开销所以ROS2 UDP 模式 原生 UDPROS2 SHM 共享内存 原生 UDP二、最快方案ROS2 Fast DDS 共享内存SHM 零拷贝首选原理绕过网卡 绕过内核 UDP 协议栈发布 / 订阅直接读写同一块物理共享内存 /dev/shm零拷贝、零协议栈开销是 ROS2 超过 UDP 的核心手段。实测性能对比1KB 小消息同机进程间表格传输方式单程延迟吞吐量CPU 占用是否快过原生 UDP原生 UDP Socket120~250μs~80MB/s中基准ROS2 Fast DDS UDP150~300μs~70MB/s高❌ 更慢ROS2 Fast DDS SHM 共享内存10~40μs1GB/s极低✅ 大幅更快一步完整配置Humble/Iron/Rolling 通用1. 安装 Fast DDSROS2 默认就是它bash运行sudo apt install ros-humble-rmw-fastrtps-cpp2. 创建 Fast DDS 共享内存 XML 配置文件新建fastdds_shm.xmlxml?xml version1.0 encodingUTF-8? profiles xmlnshttp://www.eprosima.com/XMLSchemas/fastRTPS_Profiles transport_descriptors !-- 启用共享内存传输优先级最高 -- transport_descriptor transport_idshm_transport/transport_id typeSHM/type enabletrue/enable /transport_descriptor !-- UDP仅作为跨机备用同机禁用 -- transport_descriptor transport_idudp_transport/transport_id typeUDPv4/type enablefalse/enable /transport_descriptor /transport_descriptors participant profile_nameshm_only_profile rtps transports transport_refshm_transport/transport_ref /transports !-- 关闭不必要发现、心跳降延迟 -- discovery initialAnnouncements1/initialAnnouncements /discovery /rtps /participant /profiles3. 终端永久生效环境变量bash运行# 指定DDS中间件为Fast DDS export RMW_IMPLEMENTATIONrmw_fastrtps_cpp # 加载上面共享内存配置 export FASTRTPS_DEFAULT_PROFILES_FILE/path/to/fastdds_shm.xml # 禁用ROS2日志、降级QoS为尽力而为实时最快 export RCUTILS_LOGGING_MIN_SEVERITY_LEVELERROR4. 内核参数优化必须做否则 SHM 不稳定bash运行# 增大共享内存限制 sudo sysctl -w kernel.shmmax68719476736 sudo sysctl -w kernel.shmall16777216 # 永久保存 /etc/sysctl.conf5. 验证是否生效bash运行ros2 topic echo /test_chatter # 查看传输类型 ros2 doctor --report | grep transport出现SHM transport enabled即成功此时 ROS2 已经远快于原生 UDP。三、第二方案Cyclone DDS 极致 UDP 优化跨机 / 不能用 SHM 时同机不能开 SHMDocker、虚拟机、跨进程隔离用Cyclone DDS 深度优化 UDP延迟可压到8~30μs超过原生粗糙 UDP 实现。bash运行# 安装CycloneDDS sudo apt install ros-humble-rmw-cyclonedds-cpp # 切换中间件 export RMW_IMPLEMENTATIONrmw_cyclonedds_cppCyclone DDS UDP 是事件驱动、单线程、零冗余组播优化原生 UDP 是阻塞 / 多线程传统 socketCyclone UDP 原生 UDP。四、额外极致提速让 ROS2 再快一档QoS 改成尽力而为Best EffortROS2 默认可靠Reliable重传 ACK延迟暴涨实时控制用python运行qos rclpy.qos.QoSProfile(depth1, reliabilityrclpy.qos.ReliabilityPolicy.BEST_EFFORT)关闭 ROS2 自动发现、定时心跳、监控统计消息尽量小、扁平化、不用嵌套结构体减少序列化开销同机节点全部在同一个网络命名空间、关闭防火墙五、场景选择总结同机机器人本体控制关节、伺服、实时指令Fast DDS SHM 共享内存 →ROS2 UDP跨机通信、Docker、虚拟机Cyclone DDS 优化 UDP →ROS2 UDP 原生 UDP必须原生 UDP仅硬件底层驱动、非 ROS2 生态场景六、延迟自测命令对比 ROS2 vs UDPbash运行# ROS2延迟测试 ros2 run pendulum_control pendulum_demo --ros-args -p latency_test:true # 原生UDP延迟测试工具 sudo apt install netperf netperf -u -H 127.0.0.1