结论:ROS2 默认走 UDP 反而比原生 UDP 慢;开启 DDS 共享内存 SHM 零拷贝,延迟 / 吞吐量全面碾压 UDP。
一、性能对比(同机、1KB 小消息实测)
表格
| 传输方式 | 单程延迟 | 吞吐量 | CPU 占用 | 速度对比原生 UDP |
|---|---|---|---|---|
| 原生 UDP Socket | 120~250μs | ~80MB/s | 中等 | 基准 |
| ROS2 默认 FastDDS UDP | 150~300μs | ~70MB/s | 偏高 | ❌ 更慢 |
| ROS2 FastDDS SHM 共享内存 | 8~40μs | >1GB/s | 极低 | ✅ 快 5~30 倍 |
大消息(图像 / 点云):UDP 延迟1~20ms ,SHM 仅0.5~3ms,提升 10 倍以上。
二、原理:为什么 SHM 比 UDP 快?
UDP 痛点:走网卡→内核协议栈→打包 / 解包→多次内存拷贝,受千兆网卡带宽(125MB/s)硬限制。ROS2 SHM 共享内存:
- 完全绕过网卡 + UDP 协议栈
- 发布 / 订阅直接读写同一块
/dev/shm物理内存 - 零拷贝 Zero Copy,数据只写一次、直接传地址
- 带宽不受网卡限制,可达内存总线速度
三、最快实现:FastDDS 开启共享内存(首选)
ROS2 Humble/Iron/Jazzy 通用,3 步配置即可。
1. 编写 FastDDS XML 配置(强制 SHM)
新建 fastdds_shm.xml:
xml
<?xml version="1.0" encoding="UTF-8"?>
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>SharedMemTransport</transport_id>
<type>SHM</type>
<segment_size>512MB</segment_size>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="shm_highspeed">
<rtps>
<useBuiltinTransports>false</useBuiltinTransports>
<userTransports>
<transport_id>SharedMemTransport</transport_id>
</userTransports>
</rtps>
</participant>
</profiles>
2. 终端加载环境变量(启动 ROS2 前执行)
bash
运行
# 指定DDS为FastDDS
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# 加载SHM配置
export FASTRTPS_DEFAULT_PROFILES_FILE=~/fastdds_shm.xml
# 开启大数据SHM优化
export FASTDDS_BUILTIN_TRANSPORTS=LARGE_DATA
3. 启动节点 + 极致低延迟 QoS
cpp
运行
// C++发布订阅 最低延迟QoS
auto qos = rclcpp::QoS(rclcpp::KeepLast(1))
.best_effort()
.durability_volatile()
.deadline(std::chrono::microseconds(100));
此时 ROS2 节点自动走共享内存,不再走 UDP。
四、更快进阶方案(比 SHM 还快)
1. 进程内通信 Intra-Process(最快)
发布订阅在同一个进程 ,ROS2 自动用共享指针零拷贝 ,延迟1~10μs,完全无 IPC 开销。
cpp
运行
rclcpp::NodeOptions options;
options.use_intra_process_comms(true); // 开启进程内通信
auto node = std::make_shared<rclcpp::Node>("node", options);
2. LoanedMessage 零拷贝 API(ROS2 官方)
不复制消息内存,直接借用 DDS 内存,进一步降低抖动与延迟:
cpp
运行
auto loaned_msg = publisher_->borrow_loaned_message();
loaned_msg->data = ...;
publisher_->publish(std::move(loaned_msg));
3. CycloneDDS 优化 UDP(跨机最快 UDP)
跨机器无法用 SHM 时,CycloneDDS 优化 UDP 组播,延迟8~30μs,比 FastDDS UDP 快一倍。
五、跨主机怎么办?(不能用 SHM)
同机→SHM 共享内存(碾压 UDP) 跨机→CycloneDDS 优化 UDP + TSN 网卡 + PTP 时钟同步,延迟可到20~50μs,接近 UDP 极限。
六、验证是否生效(是否走 SHM)
bash
运行
# 查看当前RMW
echo $RMW_IMPLEMENTATION
# 查看话题传输类型
ros2 doctor --report | grep transport
# 查看/dev/shm是否有FastDDS内存文件
ls /dev/shm | grep fastrtps
七、完整性能总结
- ROS2 默认 UDP:慢于原生 UDP
- ROS2 SHM 共享内存:5~30 倍快于原生 UDP
- ROS2 Intra-Process 进程内:最快,微秒级