ROS2 的 dds SHM 共享内存如何实现

ROS2 的 DDS 共享内存(SHM)本质是同机节点走零拷贝共享内存、不走 UDP / 网卡,由 DDS 厂商(Fast DDS / Cyclone DDS)直接支持,ROS2 只需启用配置即可。下面分原理、两种 DDS 配置、运行验证与注意事项。


一、原理:DDS SHM 与普通 shm 的区别

  • 普通 System V shm:需自己写 shmget/shmat,无发布订阅、无自动发现、无序列化。
  • DDS SHM(Fast DDS / Cyclone DDS)
    • 同机节点自动用共享内存,跨机自动切回 UDP。
    • 零拷贝:发布者写一次内存,订阅者直接读,无 memcpy。
    • 继承 DDS 能力:发布订阅、QoS、自动发现、序列化,ROS2 原生兼容。
    • 延迟:5–40 μs(UDP 回环约 150–300 μs),吞吐量 >1GB/s。

      二、Fast DDS(默认)SHM 配置

      1. 创建配置文件 fastdds_shm.xml

      xml

      <?xml version="1.0" encoding="UTF-8"?>
      <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
        <!-- 传输器优先级:SHM 优先,UDP 备用 -->
        <transport_descriptors>
          <!-- 启用 SHM -->
          <transport_descriptor>
            <transport_id>shm_transport</transport_id>
            <type>SHM</type>
            <enable>true</enable>
            <maxMessageSize>1048576</maxMessageSize> <!-- 最大消息 1MB -->
            <shm>
              <segment_size>67108864</segment_size> <!-- 共享内存段 64MB -->
              <port_queue_capacity>512</port_queue_capacity>
            </shm>
          </transport_descriptor>
          <!-- 禁用 UDP(可选,强制只走 SHM) -->
          <transport_descriptor>
            <transport_id>udp_transport</transport_id>
            <type>UDPv4</type>
            <enable>false</enable>
          </transport_descriptor>
        </transport_descriptors>
      
        <!-- 默认发布/订阅配置,绑定 SHM -->
        <participant profile_name="shm_participant" is_default_profile="true">
          <transport>
            <transport_id>shm_transport</transport_id>
          </transport>
        </participant>
      </profiles>
      
      2. 启动时指定 Fast DDS 配置

      bash

      运行

      # 1. 临时生效(当前终端)
      export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
      export FASTRTPS_DEFAULT_PROFILES_FILE=~/fastdds_shm.xml
      
      # 2. 重启 ROS2 守护进程(必做)
      ros2 daemon stop
      
      # 3. 启动节点(talker/listener 自动走 SHM)
      ros2 run demo_nodes_cpp talker
      ros2 run demo_nodes_cpp listener
      

      三、Cyclone DDS SHM 配置(基于 iceoryx)

      1. 安装依赖

      bash

      运行

      sudo apt install ros-humble-rmw-cyclonedds-cpp ros-humble-iceoryx
      
      2. 创建 cyclonedds.xml

      xml

      <?xml version="1.0" encoding="UTF-8"?>
      <CycloneDDS xmlns="https://cdds.io/config"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Domain>
          <SharedMemory>
            <Enable>true</Enable>
            <SegmentSize>67108864</SegmentSize> <!-- 64MB -->
            <MaxMessageSize>1048576</MaxMessageSize>
          </SharedMemory>
          <Transport>
            <Udp>
              <Enable>false</Enable> <!-- 可选:禁用 UDP -->
            </Udp>
          </Transport>
        </Domain>
      </CycloneDDS>
      
      3. 启动时指定 Cyclone DDS

      bash

      运行

      export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
      export CYCLONEDDS_URI=file:///home/your_user/cyclonedds.xml
      
      ros2 daemon stop
      ros2 run demo_nodes_cpp talker
      

      四、验证是否走 SHM

      1. 查看传输方式

      bash

      运行

      # 安装工具
      sudo apt install ros-humble-rmw-fastrtps-cpp-dbg
      
      # 查看话题传输信息
      ros2 topic info /chatter -v
      # 输出含 "transport: SHM" 即成功
      
      2. 性能对比(同机 1KB 消息)
    • UDP:150–300 μs
    • SHM:8–40 μs

    • 五、关键注意事项

    • 仅同机有效:跨节点自动切回 UDP,无需改配置。
    • 权限:所有节点需同用户(或 sudo),否则 SHM 权限不足。
    • 生命周期
      • Fast DDS SHM:节点退出自动释放。
      • Cyclone DDS/iceoryx:需 ros2 daemon stoppkill iceoryx 清理。
    • 大消息:SHM 更适合图像、点云(>100KB),小消息优势不明显。

    • 六、一键脚本(Fast DDS)

      保存为 ros2_shm_enable.sh

      bash

      运行

      #!/bin/bash
      export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
      export FASTRTPS_DEFAULT_PROFILES_FILE=~/fastdds_shm.xml
      ros2 daemon stop
      echo "ROS2 SHM 已启用,当前 RMW: $RMW_IMPLEMENTATION"
      

      执行:source ros2_shm_enable.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值