ROS2中配置高带宽图像传输零拷贝文件

深度相机通常会发布高分辨率的 RGB 和深度图像,数据量大,默认的 UDP 传输会导致严重的性能瓶颈,在ROS2中配置 Fast DDS 共享内存(SHM)是实现零拷贝、降低 CPU 占用和延迟的关键。

1. 核心配置文件(XML)

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <!-- 定义传输描述符 -->
    <transport_descriptors>
        <!-- 1. 启用共享内存传输 (SHM) -->
        <transport_descriptor>
            <transport_id>shm_transport</transport_id>
            <type>SHM</type>
            <enable>true</enable>
            <!-- 最大消息大小:高清图像可能超过1MB,建议设置为 10MB 或更高 -->
            <maxMessageSize>10485760</maxMessageSize> 
            <shm>
                <!-- 共享内存段大小:根据图像分辨率和队列深度调整,建议 64MB - 256MB -->
                <segment_size>134217728</segment_size> 
                <!-- 端口队列容量:增加以应对高帧率突发 -->
                <port_queue_capacity>512</port_queue_capacity>
            </shm>
        </transport_descriptor>

        <!-- 2. UDP 传输配置 (可选:若仅同机使用可禁用,若需跨机请启用并设为备用) -->
        <transport_descriptor>
            <transport_id>udp_transport</transport_id>
            <type>UDPv4</type>
            <enable>false</enable> <!-- 同机极致性能建议关闭 UDP,强制走 SHM -->
        </transport_descriptor>
    </transport_descriptors>

    <!-- 定义参与者配置 -->
    <participant profile_name="orbbec_shm_profile" is_default_profile="true">
        <rtps>
            <!-- 绑定共享内存传输 -->
            <transports>
                <transport_ref>shm_transport</transport_ref>
            </transports>
            
            <!-- 优化发现机制,减少启动延迟 -->
            <discovery>
                <initialAnnouncements>1</initialAnnouncements>
                <leaseDuration>
                    <sec>10</sec>
                    <nanosec>0</nanosec>
                </leaseDuration>
            </discovery>
        </rtps>
        
        <!-- 关键:启用数据共享 (Data Sharing) 以实现真正的零拷贝 -->
        <default_qos>
            <data_sharing>
                <kind>AUTOMATIC</kind> <!-- 自动选择共享内存域 -->
            </data_sharing>
            <!-- 历史策略:保持最新数据,避免旧帧堆积导致内存溢出 -->
            <history>
                <kind>KEEP_LAST</kind>
                <depth>1</depth>
            </history>
            <!-- 可靠性:图像传输通常允许丢帧以换取低延迟,建议 BEST_EFFORT -->
            <reliability>
                <kind>BEST_EFFORT</kind>
            </reliability>
        </default_qos>
    </participant>
</profiles>

2. 环境配置与启动步骤

在运行相机节点之前,必须正确设置环境变量以加载上述配置。

第一步:保存配置文件

将上述 XML 内容保存为 shm_fastdds.xml,例如保存在 ~/ros2_config/ 目录下。

第二步:设置环境变量

在终端中执行以下命令(或添加到 ~/.bashrc 中):

复制代码
# 1. 指定使用 Fast DDS 中间件
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

# 2. 指向自定义的 SHM 配置文件路径
export FASTRTPS_DEFAULT_PROFILES_FILE=~/ros2_config/shm_fastdds.xml

# 3. 启用 QoS 从 XML 读取 (关键步骤,确保 data_sharing 配置生效)
export RMW_FASTRTPS_USE_QOS_FROM_XML=1

# 4. 确保不禁用借出消息 (Loaned Messages),这是零拷贝的核心
export ROS_DISABLE_LOANED_MESSAGES=0

第三步:重启 ROS 2 守护进程

修改中间件配置后,必须重启 daemon 才能生效:

复制代码
ros2 daemon stop
ros2 daemon start

注:daemon是ROS2 专属后台守护进程(特殊 ROS 节点),给 ros2cli 命令行工具做缓存加速

第四步:启动奥比中光相机节点

现在启动相机驱动节点(以 orbbec_camera 为例):

ros2 launch orbbec_camera orbbec_camera_launch.py

3. 验证零拷贝是否生效

3.1 可以通过检查 Linux 共享内存文件系统 /dev/shm 来验证 Fast DDS 是否创建了共享内存段。

启动相机节点后‌,在另一个终端运行:

ls -lh /dev/shm/fast_datasharing*

如果看到类似 fast_datasharing_... 的文件,说明共享内存域已创建。

3.2 监控资源占用‌:

使用 top 或 htop 观察 CPU 占用率。相比默认 UDP 模式,启用 SHM 后,图像传输相关的 CPU 占用应显著下降(通常从 15%-20% 降至 3%-5%),且 ros2 topic hz /color/image_raw 显示的帧率更稳定,抖动更小。

相关推荐
某林2123 天前
ros从底层硬件到 Web 端部署
python·机器人·硬件架构·ros2
zh路西法3 天前
【Navigation2进阶】(十二):自主探索性能优化与 RIG 算法推导与 Nav2 插件实现
c++·dijkstra·ros2·rrt·navigation2·前沿探索
视图猿人4 天前
Astra Pro相机+gazebo构建 ROS2 虚实联动数字孪生系统
ros2
zh路西法4 天前
【10天速通ROS2-PX4无人机】(四) 关掉GPS和气压计,纯激光定位还能飞吗
c++·无人机·px4·ros2·卡尔曼滤波·fastlio2
视图猿人5 天前
ROS2 AGV SLAM导航仿真系统技术详解与踩坑实录
机器人·ros2
zh路西法7 天前
【10天速通ROS2-PX4无人机】(一) 从零搭建仿真环境,妈妈再也不用担心我炸机了!
无人机·仿真·px4·ros2·gazebo
某林2129 天前
ROS2 + WebRTC + MQTT 异构系统架构
架构·系统架构·机器人·硬件架构·webrtc·ros2
Zeku11 天前
10.ROS2-URDF机器人建模-从概念到开发与调试全记录
机器人·ros2·linux驱动开发·linux应用开发
某林21212 天前
履带小车底盘stm32F103RCT6开发
人工智能·stm32·单片机·嵌入式硬件·架构·人机交互·ros2
qq_4192032315 天前
[ROS2 学习指南4] --- 手写一个 TF2 监听器(python版)
ros2·监听器