十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

快速解决ROS2传输大点云话题的丢包问题

快速解决ROS2传输大点云话题的丢包问题 1. 引言在 ROS2 中传输大尺寸点云话题如激光雷达点云、深度相机点云时很多开发者会遇到消息阻塞、丢包、频率不足的问题。这些问题的根源往往不在应用层而在于底层 DDS 实现的传输配置——默认配置针对的是小消息场景面对动辄几 MB 甚至几十 MB 的点云数据默认的共享内存段或 UDP 缓冲区大小根本不够用。本文分别针对三种主流 RMW 实现——FastDDS、CycloneDDS、Zenoh——讲解传输大点云话题所需的额外配置并给出可直接复制的配置文件和注意事项。2. 背景为什么默认配置不够用ROS2 的通信层基于 DDSData Distribution Service不同 RMW 实现采用不同的底层传输机制FastDDS默认启用共享内存SHM传输但每个 DDS Participant 预分配的共享内存段默认只有 256KB。CycloneDDS默认走 UDP 传输受系统 UDP 缓冲区大小限制一般默认 200KB 左右。Zenoh默认走 TCP 传输共享内存支持尚不成熟。点云话题的单条消息通常远超这些默认值因此必须针对具体 RMW 做额外配置。3. FastDDS调大共享内存段3.1 问题分析当RMW_IMPLEMENTATION为rmw_fastrtps_cppFastDDS时默认就开启了共享内存传输。但由于其 DDS Participant一个进程一个的内存段默认只有256KB参考 FastDDS 官方文档对于点云等大消息会出现阻塞和丢包。3.2 解决方案自定义 fastdds.xml创建一个fastdds.xml配置文件将共享内存段调大。segment_size设置够用就行不要盲目设得过大——每个 DDS Participant 都会预分配一份该大小的内存设太大会占用过多内存。?xml version1.0 encodingUTF-8?ddsxmlnshttp://www.eprosima.comprofilestransport_descriptorstransport_descriptortransport_idshm_transport_64MB/transport_idtypeSHM/typesegment_size67108864/segment_size/transport_descriptor/transport_descriptorstransport_descriptorstransport_descriptortransport_idshm_transport_8MB/transport_idtypeSHM/typesegment_size8388608/segment_size!-- default is 256KB, too small for pointcloud topics. Every DDS participants (1 per process) preallocates this amount of memory. --/transport_descriptor/transport_descriptorsparticipantprofile_namedefault_participantis_default_profiletruertpsuserTransportstransport_idshm_transport_8MB/transport_id/userTransportsbuiltinmutation_tries10000/mutation_tries/builtin/rtps/participant/profiles/dds3.3 启用配置启动节点前通过环境变量指定配置文件路径exportFASTRTPS_DEFAULT_PROFILES_FILE./fastdds.xml3.4 注意事项segment_size按实际点云消息大小设置即可例如 8MB 通常够用如果点云特别大可考虑 16MB 或 32MB。每个 DDS Participant 都会预分配一份该大小的共享内存进程越多内存占用越大务必权衡。调大mutation_tries超过node进程数可以解决超过100个节点启动时udp端口不够的问题。4. CycloneDDS调大 UDP 缓冲区默认方案4.1 问题分析当RMW_IMPLEMENTATION为rmw_cyclonedds_cpp时默认走UDP 传输受系统默认 UDP 缓冲区大小限制一般默认 200KB 左右大点云消息会直接丢包。4.2 解决方案调大系统 UDP 缓冲区参考 rmw_cyclonedds 官方性能建议执行以下命令将系统 UDP 收发缓冲区调大echo-enet.core.rmem_max8388608\nnet.core.rmem_default8388608|sudotee/etc/sysctl.d/60-cyclonedds.confsudosysctl--system这里将缓冲区设为 8MB实测够用可根据实际点云大小调整。5. CycloneDDS启用 SHM 的额外配置不推荐5.1 问题分析如果启用了 CycloneDDS 的共享内存SHM传输则需要额外配置roudi的 segment 大小。CycloneDDS 使用 SHM 时每条消息会自动优先去找满足大小的 segment mempool。5.2 配置 roudi_config.toml将默认配置复制为roudi_config.toml并修改为大数据消息增加大尺寸 mempool# Adapt this config to your needs and rename it to e.g. roudi_config.toml [general] version 1 [[segment]] [[segment.mempool]] size 128 count 10000 [[segment.mempool]] size 1024 count 5000 [[segment.mempool]] size 16384 count 1000 [[segment.mempool]] size 131072 count 200 [[segment.mempool]] size 524288 count 50 [[segment.mempool]] size 1048576 count 30 [[segment.mempool]] size 4194304 count 10 # added by Peixuan Shu for large pointcloud data [[segment.mempool]] size 16777216 # 16MB count 10 # *10 # added by Peixuan Shu for large pointcloud data [[segment.mempool]] size 33554432 # 32MB count 5 # reserved mem count # added by Peixuan Shu for large pointcloud data [[segment.mempool]] size 67108864 # 64MB count 35.3 注意事项mempool 的count设置不要太多够用就行否则会预分配占用大量内存。但总体来说CycloneDDS 的 SHM 支持并不好存在服务和话题丢包问题且需要额外开启roudi进程未来 SHM 支持没有保障不建议在生产环境使用。6. Zenoh默认 TCP谨慎使用 SHM6.1 默认行为当RMW_IMPLEMENTATION为rmw_zenoh_cpp时默认走TCP 通信大消息点云的实际效果尚未充分测试。6.2 关于 SHM 的警告如果开启本地共享内存传输同样需要注意 segment size 的问题。但 Zenoh 存在已知的共享内存 bug参考 rmw_zenoh issue #978现阶段不建议使用 SHM建议保持默认 TCP 传输。7. 总结与选型建议RMW 实现默认传输大点云主要配置推荐度FastDDS共享内存256KB调大fastdds.xml中 SHM segment_size⭐⭐⭐⭐⭐CycloneDDSUDP~200KB调大系统 UDP 缓冲区SHM 方案不推荐⭐⭐⭐⭐ZenohTCP保持默认 TCP不建议开 SHM⭐⭐⭐核心建议FastDDS是传输大点云最成熟的方案只需调大共享内存段即可配置简单、性能稳定。CycloneDDS优先调大 UDP 缓冲区简单有效SHM 方案虽有配置方法但稳定性差不建议使用。Zenoh现阶段保持默认 TCP 即可等待官方修复 SHM bug 后再考虑。无论选择哪种 RMW都要记住内存和缓冲区大小设置够用就行过大的预分配会显著增加内存占用反而影响系统整体性能。
返回列表