Contents

ROS:TOPIC启用DataSharingZeroCopy

本文采用知识共享署名 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,但若你自己编译,需启用:

1
-D SHM_TRANSPORT_DEFAULT=ON

🧰 2. 启用 Data Sharing 的配置方法

Data Sharing 在 Fast DDS 中是通过 共享内存传输层(Shared Memory Transport) 实现的,需要启用以下条件:

方法一:通过 XML 配置文件设置

创建一个 XML 配置文件 fastdds_profile.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<profiles>
  <transport_descriptors>
    <transport_descriptor>
      <transport_id>shm_transport</transport_id>
      <type>SHM</type>
    </transport_descriptor>
  </transport_descriptors>

  <participant profile_name="shm_participant_profile" is_default_profile="true">
    <rtps>
      <use_builtin_transports>false</use_builtin_transports>
      <user_transports>
        <transport_id>shm_transport</transport_id>
      </user_transports>
    </rtps>
  </participant>
</profiles>

并在运行 ROS 2 程序前设置环境变量:

1
export FASTRTPS_DEFAULT_PROFILES_FILE=$(pwd)/fastdds_profile.xml

🚨 注意:<use_builtin_transports>false</use_builtin_transports> 会关闭 UDP/TCP 网络传输,只保留共享内存传输。


方法二:通过 QoS profile 动态启用(推荐)

Fast DDS 默认在以下条件下启用共享内存:

  • 发布者和订阅者在同一主机;
  • 消息类型为 Plain Type(PIM 标准类型或 POD-like);
  • 使用的 QoS 中 reliability = reliablehistory = KEEP_LAST
  • 消息大小 大于 64B 且小于共享内存 buffer 限制

你可以通过 RTI Connext 风格的方式显示启用:

1
2
3
4
5
rclcpp::QoS qos_profile(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_default));
qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE);
qos_profile.history(RMW_QOS_POLICY_HISTORY_KEEP_LAST);

auto pub = node->create_publisher<MyMsg>("topic", qos_profile);

⚠️ 不同 DDS 实现可能对自动启用共享内存的条件有差异。Fast DDS 比较宽松,但消息类型必须可被支持(Plain-C结构最佳)。


🔍 3. 验证是否启用了共享内存传输

方法一:通过环境变量打印调试信息

1
export FASTDDS_ENV_LOG=SHM_TRANSPORT

运行 ROS 2 节点后,控制台会输出如下信息:

1
2
3
[INFO] SHM Transport: Segment created
[INFO] SHM Transport: Locator matched
[INFO] SHM Transport: Message sent via shared memory

方法二:通过 strace 等工具观察是否使用 /dev/shm 区域。

1
strace -e trace=openat ros2 run your_package your_node

🧪 4. 实际性能收益

传输方式 延迟 吞吐量 CPU 占用
UDP / TCP
Data Sharing 极低

适合用于:

  • 摄像头图像传输(sensor_msgs::Image)
  • 激光雷达点云传输(sensor_msgs::PointCloud2)
  • 自定义大体积二进制数据

🧩 5. 附加注意事项

  • Data Sharing 不跨主机使用:仅适用于本地节点之间通信;
  • 注意缓存大小设置:Fast DDS 默认共享内存段最大 512MB,超过需配置;
  • 兼容性问题:如使用 CycloneDDS/Connext,会忽略共享内存配置。