ROS:TOPIC启用DataSharingZeroCopy
Contents
本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。
在 ROS 2 中,Data Sharing / Zero-Copy(数据共享/零拷贝) 是一种优化机制,用于在同一主机上的多个节点间进行高效通信。其本质是:绕过 DDS 网络层和序列化过程,直接通过共享内存区传递消息数据。Fast DDS 是目前 ROS 2 默认支持这一机制的 DDS 实现之一。
下面我们系统性地介绍如何在 ROS 2 中基于 Fast DDS 实现 Data Sharing / Zero-Copy:
✅ 1. 前提条件
📌 支持版本
- ROS 2 Foxy 及之后版本
- Fast DDS 2.0+(建议使用最新版)
📌 编译配置
确保使用了带 SHM_TRANSPORT 编译选项的 Fast DDS。ROS 2 默认已经内建 Fast DDS,但若你自己编译,需启用:
|
|
🧰 2. 启用 Data Sharing 的配置方法
Data Sharing 在 Fast DDS 中是通过 共享内存传输层(Shared Memory Transport) 实现的,需要启用以下条件:
方法一:通过 XML 配置文件设置
创建一个 XML 配置文件 fastdds_profile.xml:
|
|
并在运行 ROS 2 程序前设置环境变量:
|
|
🚨 注意:
<use_builtin_transports>false</use_builtin_transports>会关闭 UDP/TCP 网络传输,只保留共享内存传输。
方法二:通过 QoS profile 动态启用(推荐)
Fast DDS 默认在以下条件下启用共享内存:
- 发布者和订阅者在同一主机;
- 消息类型为 Plain Type(PIM 标准类型或 POD-like);
- 使用的 QoS 中
reliability = reliable且history = KEEP_LAST; - 消息大小 大于 64B 且小于共享内存 buffer 限制。
你可以通过 RTI Connext 风格的方式显示启用:
⚠️ 不同 DDS 实现可能对自动启用共享内存的条件有差异。Fast DDS 比较宽松,但消息类型必须可被支持(Plain-C结构最佳)。
🔍 3. 验证是否启用了共享内存传输
方法一:通过环境变量打印调试信息
|
|
运行 ROS 2 节点后,控制台会输出如下信息:
方法二:通过 strace 等工具观察是否使用 /dev/shm 区域。
|
|
🧪 4. 实际性能收益
| 传输方式 | 延迟 | 吞吐量 | CPU 占用 |
|---|---|---|---|
| UDP / TCP | 高 | 中 | 高 |
| Data Sharing | 极低 | 高 | 低 |
适合用于:
- 摄像头图像传输(sensor_msgs::Image)
- 激光雷达点云传输(sensor_msgs::PointCloud2)
- 自定义大体积二进制数据
🧩 5. 附加注意事项
- Data Sharing 不跨主机使用:仅适用于本地节点之间通信;
- 注意缓存大小设置:Fast DDS 默认共享内存段最大 512MB,超过需配置;
- 兼容性问题:如使用 CycloneDDS/Connext,会忽略共享内存配置。