【ROS2+深度相机】Orbbec相机时图像传输延迟显著 (DDS数据分发服务配置)

5.1.3. 针对Orbbec相机与ROS2的Fast DDS优化 --- OrbbecSDK V2 ROS2 封装 文档

DDS - 古月教学文档

使用默认配置时,Fast DDS表现出次优的传输效率,导致在ROS2中使用Orbbec相机时图像传输延迟显著。本文档提供了优化Fast DDS以提高图像传输效率的指导。

问题描述

通过有损的连接(通常为WiFi)传输时,容易导致IP分片丢失。此时,其余接受到的IP片段会被用来填充内核缓冲区。默认情况下,Linux内核会不断尝试重新合并这些分片的数据,30分钟后会超时。内核缓冲区默认大小为256KB,当这个缓冲区饱和时,就无法有新的片段进入,连接会进入待机模式

解决方法------ 调整系统参数+配置DDS

IP分片时间

  • 路径 : /proc/sys/net/ipv4/ipfrag_time(默认值:30秒)

  • 目的: 定义IP分片保留在内存中的持续时间。

  • 调整: 减少此值以缩短未接收到分片的时间窗口,这有助于减少延迟。考虑到您环境的具体需求,因为此设置会影响所有传入的分片。

    示例: 设置为3秒。

    bash 复制代码
    sudo sysctl net.ipv4.ipfrag_time=3

IP分片内存阈值

  • 路径 : /proc/sys/net/ipv4/ipfrag_high_thresh(默认值:262144字节)

  • 目的: 设置用于重组IP分片的最大内存。

  • 调整: 增加此值以允许更多内存用于分片重组,这可以改善较大数据包的处理。

    示例: 增加到128 MB。

    bash 复制代码
    sudo sysctl net.ipv4.ipfrag_high_thresh=134217728

最大缓冲区大小(最重要、最有效)

  • 目的: 配置接收和发送数据的最大缓冲区大小,这对高吞吐量数据传输至关重要。

  • 调整: 设置接收和发送操作的最大缓冲区大小。

    命令:

    bash 复制代码
    sudo sysctl -w net.core.rmem_max=2147483647
    sudo sysctl -w net.core.rmem_default=2147483647
    sudo sysctl -w net.core.wmem_max=2147483647
    sudo sysctl -w net.core.wmem_default=2147483647

或者,通过将这些设置添加到 /etc/sysctl.d/10-fastrtps-max.conf 文件中使其永久生效。

bash 复制代码
sudo gedit /etc/sysctl.d/10-fastrtps-max.conf

将以下行添加到文件中:

bash 复制代码
net.core.rmem_max=2147483647
net.core.rmem_default=2147483647
net.core.wmem_max=2147483647
net.core.wmem_default=2147483647

然后保存并退出文件

加载命令。

bash 复制代码
 sudo sysctl -p

有关详细指导,请参考 ROS 2 DDS调优文档

调整系统参数总结

bash 复制代码
# 创建并编辑配置文件
sudo gedit /etc/sysctl.d/10-fastrtps-max.conf

# 写入下面的内容
net.ipv4.ipfrag_time=3
net.ipv4.ipfrag_high_thresh=134217728
net.core.rmem_max=2147483647
net.core.rmem_default=2147483647
net.core.wmem_max=2147483647
net.core.wmem_default=2147483647

# 加载此项配置
sudo sysctl -p

配置DDS

bash 复制代码
# 新建配置文件
sudo gedit ~/shm_fastdds.xml

内容

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <transport_descriptors>
        <transport_descriptor>
            <transport_id>UDP_transport</transport_id>
            <type>UDPv4</type>
            <maxInitialPeersRange>10</maxInitialPeersRange>
            <maxMessageSize>65000</maxMessageSize>
            <sendBufferSize>1048576</sendBufferSize>
            <receiveBufferSize>1048576</receiveBufferSize>
        </transport_descriptor>
    </transport_descriptors>
    <participant profile_name="participant_profile_ros2" is_default_profile="true">
        <rtps>
            <name>profile_for_ros2_context</name>
            <userTransports>
                <transport_id>UDP_transport</transport_id>
            </userTransports>
            <useBuiltinTransports>false</useBuiltinTransports>
            <sendSocketBufferSize>1048576</sendSocketBufferSize>
            <listenSocketBufferSize>1048576</listenSocketBufferSize>
            <builtin>
                <initialPeersList>
                    <locator>
                        <udpv4>
                            <address>127.0.0.1</address>
                        </udpv4>
                    </locator>
                </initialPeersList>
            </builtin>
        </rtps>
    </participant>
    <data_writer profile_name="default publisher profile" is_default_profile="true">
        <qos>
            <publishMode>
                <kind>ASYNCHRONOUS</kind>
            </publishMode>
            <latencyBudget>
                <duration>
                    <sec>0</sec>
                    <nanosec>1000000</nanosec>
                </duration>
            </latencyBudget>
        </qos>
        <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
    </data_writer>
    <data_reader profile_name="default subscription profile" is_default_profile="true">
        <qos>
            <data_sharing>
                <kind>AUTOMATIC</kind>
            </data_sharing>
            <latencyBudget>
                <duration>
                    <sec>0</sec>
                    <nanosec>1000000</nanosec>
                </duration>
            </latencyBudget>
        </qos>
        <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
    </data_reader>
</profiles>

环境变量

设置以下环境变量以使用自定义Fast DDS配置文件:

bash 复制代码
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export FASTRTPS_DEFAULT_PROFILES_FILE=$HOME/shm_fastdds.xml
export RMW_FASTRTPS_USE_QOS_FROM_XML=1

此配置旨在优化数据流并减少传输延迟,提高Orbbec相机系统在ROS2环境中的响应性和可靠性。

基本概念

DDS(data distribution service ):数据分发服务

所有节点都可以在DataBus上发布和订阅消息。但它的先进之处在于,通信中包含了很多并行的通路,每个节点可以只关心自己感兴趣的消息,忽略不感兴趣的消息

  1. discovery发现:发现网络内谁在发布消息、谁在订阅消息、彼此之间如何找到对方

  2. serialization序列化:将数据编码为字节、将字节反编码为数据

  3. transport传输层:序列化后的字节数据的传输形式

    • UDP:最常见、延迟低、适合局域网实时数据流、但不保证数据可靠(跨机器局域网通信)

    • TCP:更可靠,但时延、抖动更大(网络环境差、跨复杂网络)

    • SHM共享内存:同机进程间高效数据传输形式(同一台机器多个进程传大数据)

QoS通信质量策略:DDS最核心配置项,负责管理DDS通信的实际策略

比如我们遥控一个无人机航拍,如果网络情况不好的话,遥控器向无人机发送运动指令的过程,可以用reliable通信模式,保证每一个命令都可以顺利发送给无人机,但是可能会有一些延时,无人机传输图像的过程可以用best effort模式,保证视频的流畅性,但是可能会有掉帧。

  1. Reliability可靠性

    • Best Effort:尽力而为传输数据,不管数据是否丢失,不补也不等(图像、点云、高频传感器)

    • Reliable:尽量保证数据到达,需要确认、重传等机制(命令、关键状态、低频且不能丢弃的数据)

  2. Durability持久性

    • Volatile:只关注当前网络中在线的发布者和订阅者

    • Transient Local:发布者会暂存最近消息,后来加入网络的订阅者也能拿到历史消息

  3. History历史策略

    • Keep last N:只保留最近N条

    • Keep all:计量保存所有数据

  4. Depth队列深度:配合History看,此项配置决定保存几条;如果太小,数据稍微抖动就会丢数据;如果太大,内存占用较大

  5. Deadline:数据更新最大周期,即发布者至少多久给一次数据;订阅者至少多久收到一次数据,判断话题通信是否超时

  6. Liveiness:节点存活检测

  7. QoS兼容:发布者和订阅者的QoS策略必须匹配,否则通信失败

  1. 常见的数据流类型与其配置

|-------------|-------------------------------------------|
| 数据流类型 | 配置选项 |
| 传感器流 | best effor+keep last+小depth+优先低延迟 |
| 控制、命令、关键状态流 | reliable+较小depth+更重视确定性 |

相关推荐
济6173 小时前
ROS2 Humble 开发专栏Ubuntu22.04|基于OpenCV 实现机器视觉人脸检测实验指南
嵌入式硬件·嵌入式·ros2·机器人方向
竹叶青lvye4 小时前
ROS工作空间、功能包、节点创建
节点·ros2··工作空间
济6174 小时前
【ROS2 Humble 开发专栏】Ubuntu22.04 基于 OpenCV 实现颜色阈值分割与目标坐标定位|附完整工程源码
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
MIXLLRED1 天前
Ubuntu22.04 + ROS2 Humble 安装部署 PCT Planner
ubuntu·ros2·三维路径规划·pct
某林2122 天前
Wheeltec 机器人多模态交互系统:从硬件死锁到纯软件异步驱动的重构实录
ros2·架构重构·技术复盘·c++底层排错·大模型qwen落地
济6172 天前
ROS开发专栏---基于图像视觉的目标追踪实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
济6172 天前
ROS开发专栏---视觉图像数据的获取实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
小烤箱3 天前
ROS2 学习资源与学习方法
学习·ros·学习方法·ros2
想成为优秀工程师的爸爸5 天前
车载以太网之要火系列 - 第58篇:郭大侠学DDS(QoS策略):服务质量花样多,刹车插队视频播
车载以太网·dds·自学笔记