同机 ROS2 默认走 UDP 网卡,速度不如原生 UDP;只要开启 ROS2 DDS【共享内存 SHM 零拷贝】,ROS2 延迟、吞吐量、CPU 占用全面碾压原生 UDP。
原生 UDP 典型延迟:100~300μs;ROS2 共享内存:<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 模式 <原生 UDP;ROS2 SHM 共享内存>> 原生 UDP
二、最快方案:ROS2 Fast DDS 共享内存(SHM 零拷贝)(首选)
原理
绕过网卡 + 绕过内核 UDP 协议栈,发布 / 订阅直接读写同一块物理共享内存 /dev/shm,零拷贝、零协议栈开销,是 ROS2 超过 UDP 的核心手段。
实测性能对比(1KB 小消息,同机进程间)
表格
| 传输方式 | 单程延迟 | 吞吐量 | CPU 占用 | 是否快过原生 UDP |
|---|---|---|---|---|
| 原生 UDP Socket | 120~250μs | ~80MB/s | 中 | 基准 |
| ROS2 Fast DDS UDP | 150~300μs | ~70MB/s | 高 | ❌ 更慢 |
| ROS2 Fast DDS SHM 共享内存 | 10~40μs | >1GB/s | 极低 | ✅ 大幅更快 |
一步完整配置(Humble/Iron/Rolling 通用)
1. 安装 Fast DDS(ROS2 默认就是它)
bash
运行
sudo apt install ros-humble-rmw-fastrtps-cpp2. 创建 Fast DDS 共享内存 XML 配置文件
新建fastdds_shm.xml:
xml
<?xml version="1.0" encoding="UTF-8"?> <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"> <transport_descriptors> <!-- 启用共享内存传输,优先级最高 --> <transport_descriptor> <transport_id>shm_transport</transport_id> <type>SHM</type> <enable>true</enable> </transport_descriptor> <!-- UDP仅作为跨机备用,同机禁用 --> <transport_descriptor> <transport_id>udp_transport</transport_id> <type>UDPv4</type> <enable>false</enable> </transport_descriptor> </transport_descriptors> <participant profile_name="shm_only_profile"> <rtps> <transports> <transport_ref>shm_transport</transport_ref> </transports> <!-- 关闭不必要发现、心跳,降延迟 --> <discovery> <initialAnnouncements>1</initialAnnouncements> </discovery> </rtps> </participant> </profiles>3. 终端永久生效环境变量
bash
运行
# 指定DDS中间件为Fast DDS export RMW_IMPLEMENTATION=rmw_fastrtps_cpp # 加载上面共享内存配置 export FASTRTPS_DEFAULT_PROFILES_FILE=/path/to/fastdds_shm.xml # 禁用ROS2日志、降级QoS为尽力而为(实时最快) export RCUTILS_LOGGING_MIN_SEVERITY_LEVEL=ERROR4. 内核参数优化(必须做,否则 SHM 不稳定)
bash
运行
# 增大共享内存限制 sudo sysctl -w kernel.shmmax=68719476736 sudo sysctl -w kernel.shmall=16777216 # 永久保存 /etc/sysctl.conf5. 验证是否生效
bash
运行
ros2 topic echo /test_chatter # 查看传输类型 ros2 doctor --report | grep transport出现SHM transport enabled即成功,此时 ROS2 已经远快于原生 UDP。
三、第二方案:Cyclone DDS 极致 UDP 优化(跨机 / 不能用 SHM 时)
同机不能开 SHM(Docker、虚拟机、跨进程隔离),用Cyclone DDS 深度优化 UDP,延迟可压到8~30μs,超过原生粗糙 UDP 实现。
bash
运行
# 安装CycloneDDS sudo apt install ros-humble-rmw-cyclonedds-cpp # 切换中间件 export RMW_IMPLEMENTATION=rmw_cyclonedds_cppCyclone DDS UDP 是事件驱动、单线程、零冗余组播优化,原生 UDP 是阻塞 / 多线程传统 socket,Cyclone UDP > 原生 UDP。
四、额外极致提速(让 ROS2 再快一档)
- QoS 改成尽力而为(Best Effort)ROS2 默认可靠(Reliable)重传 ACK,延迟暴涨;实时控制用:
python
运行
qos = rclpy.qos.QoSProfile(depth=1, reliability=rclpy.qos.ReliabilityPolicy.BEST_EFFORT)- 关闭 ROS2 自动发现、定时心跳、监控统计
- 消息尽量小、扁平化、不用嵌套结构体(减少序列化开销)
- 同机节点全部在同一个网络命名空间、关闭防火墙
五、场景选择总结
- 同机机器人本体控制(关节、伺服、实时指令):Fast DDS SHM 共享内存 →ROS2 >> UDP
- 跨机通信、Docker、虚拟机:Cyclone DDS 优化 UDP →ROS2 UDP > 原生 UDP
- 必须原生 UDP:仅硬件底层驱动、非 ROS2 生态场景
六、延迟自测命令(对比 ROS2 vs UDP)
bash
运行
# 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