待解决

ros2节点之间消息延迟有点大,有啥实在的优化招没

老梁
老梁
2026/06/26 19:35

项目上跑的ros2 humble,6个节点串一条流水线上,sensor出来到末端执行器那边看下来一帧平均要15ms左右,偶尔飙到30ms+,数据量不算大就是点云+图像特征+控制指令,QoS那边设的reliable,history depth默认10。机器是x86工控机+i7,网卡千兆独连,没走交换机。

试过把图像特征那个话题改成best_effort,深度也压到1,延迟降了一两毫秒但丢包上来了。CPU占用单核50%多,没打满。想问下群里各位,除了QoS和话题拆细,还有啥实在的招?DDS厂商要不要换?cyclonedds听说比fastrtps好使?

62 5

全部回复 (5)

胡元明
胡元明#1

先把你那个rclcpp publisher的intra-process打开试试,单进程内节点直接走共享指针,延迟能砍掉一大截。

2026/06/26 20:20
abc724402
abc724402#2

6个节点干嘛都跑一台机器上,拆两台工控机分布式跑千兆直连试试,立竿见影。

2026/06/26 20:27
峰哥
峰哥#3

cyclonedds换了没?

2026/06/27 09:30
威哥
威哥#4

你这个15ms+偶尔30ms,6个节点串行不算离谱,但确实有水分。先把几个硬指标摆出来再说优化:CPU单核50%看着没满,但ros2默认调度是单线程reactor,6个节点如果都跑在同一个executor里,某个节点回调一卡整条链路全抖。强烈建议改成MultiThreadedExecutor,或者干脆每个节点单独起一个进程,串行链路用callback group隔开,这步做完基本能砍掉3-5ms。

QoS那块你reliable+depth10是给自己挖坑,sensor往control走这种链路用reliable纯属浪费,control指令发丢了下一帧补就行,没人care。点云+图像特征这种高频的,best_effort+depth1+transient_local别用,正常best_effort+depth1就够了。reliable只留给最后下发到执行器那一条。

DDS别折腾cyclonedds,没意义。humble默认fastrtps问题不在DDS层,在你executor调度和内存分配上。共享内存transport要开起来,FASTDDS_DEFAULT_PROFILES.xml里配SHM,或者fastrtps那边用iceoryx零拷贝中间件,图像特征走共享内存这一项下来又能省4-6ms。

还有一点容易被忽略:QoS的reliability和durability要算兼容,不兼容的话题之间会直接丢弃,根本没传到应用层,你以为是丢包其实是根本没匹配上。用ros2 topic info -v挨个查一遍。

先把executor拆了再说别的,6节点单线程跑本身就是反模式。

2026/06/27 15:21
鸿运当头
鸿运当头#5

15ms走6个节点确实有点高了,尤其你硬件不差。先确认一个事:你6个节点是单进程多节点还是6个独立进程?如果是独立进程,进程间序列化反序列化+内存拷贝就吃掉了大头,这种情况下把能合的合到一个进程里(比如sensor+特征提取放一起,控制+执行器放一起),延迟能直接砍一截,跟QoS没关系。DDS这块我实测过cyclonedds vs fastrtps humble默认,同一台机器同一个拓扑,cyclonedds小包延迟能低30%左右,大包基本持平。你可以先在cyclonedds.xml里把internal_socket_type设成UDPSRP,shmem_transport打开,多进程通信走共享内存,比UDP快不少。fastrtps那块shmem得自己开enable_loan_shmem=true才生效,很多人不知道这点。另外你点云+图像特征塞一个话题里发,哪怕数据量不大,零拷贝没做的话每帧都要memcpy一遍。检查一下发布方有没有用unique_ptr那种loan写法,订阅方拿LoanedMessage,没做的话两头都加上,延迟能再压一点。CPU单核50%就说明大头不在计算上,是通信和内存搬运在烧时间。QoS history depth=10在小消息场景下影响不大,但reliable+大包在千兆网卡上确实会触发分片重传,偶尔飙到30ms大概率是这个。建议控制指令这种小包高优先级的单独走一个domain,rclcpp publisher设成KEEP_ALL+transient_local,本地调度权重给高,比死磕depth有用。最后补一刀:执行器那边callback组是不是有阻塞调用?哪怕一个20ms的sleep混在里面,调度链一串就全拉胯,这个查起来最容易被忽略。

2026/07/11 12:20