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.xmlxml
<?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-iceoryx2. 创建
cyclonedds.xmlxml
<?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 stop或pkill 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

4381

被折叠的 条评论
为什么被折叠?



