ROS中订阅(Subscribe)最新消息以及对消息队列的浅谈

更新时间:2023-07-19 23:22:44 阅读: 评论:0

ROS中订阅(Subscribe)最新消息以及对消息队列的浅谈机器⼈应⽤中难免会遇到运算起来很费时间的操作,⽐如图像的特征提取、点云的匹配等等。有时候,不可避免地,我们需要在ROS的Subscriber的Callback回调函数中进⾏这些费时的操作。Subscriber所订阅的消息的发布频率可能是很⾼的,⽽这些操作的运算速度肯定达不到消息发布的速度。所以,如果我们要是没有取舍的对于每个消息都调⽤⼀次回调函数,那么势必会导致计算越来越不实时,很有可能当下在处理的还是⼏⼗秒以前的数据。所以,我们希望每次回调函数都处理当前时刻最新的⼀个消息,这就是我们的⽬标。
要达到这个⽬标有三点,第⼀点是要设置Publisher的queue_size等于1;第⼆点是要设置Subscriber的queue_size(消息队列⼤⼩)等于1;第三点⾮常重要,要设置Subscriber的buff_size(缓冲区⼤⼩)⾜够⼤,⼤于⼀个消息的⼤⼩。像这样:
# ROS Python
pcdpub = rospy.Publisher("lidardata", PointCloud, queue_size=1)
rospy.Subscriber("lidardata", PointCloud, lf.pcd_resolve_callback,queue_size=1,buff_size=52428800)
解释:
缺点英语网上支付流程
Subscriber和Publisher的消息队列起什么作⽤,队列的⼤⼩有什么影响?
简单描述⼀下,Publisher的消息队列是为了缓存发布节点发布的消息,⼀旦队列中消息的数量超过了queue_size,那么最先进⼊队列的(最⽼的)消息被舍弃。Subscriber的消息队列是为了缓存节点接收到的信息,⼀旦⾃⼰处理的速度过慢,接收到的消息数量超过了queue_size,那么最先进⼊队列的(最⽼的)消息会被舍弃。所以,我们想只处理最新的消息,实际上只需要把两个queue_size都设置成1,那么系统不会缓存数据,⾃然处理的就是最新的消息。
Subscriber有消息队列缓存消息了,为什么Publisher还要有消息队列?
在我看来,Publisher的消息队列是⼀定要有的,因为ROS中发布节点往外发送消息是基于Topic发送,⽽不是直接向Subscriber订阅者发送,所以必须要有⼀个消息队列来存放发布的消息,以供订阅者来获取。⽽且这个消息队列的好处是在⽹络差、带宽⼩、延时⾼的时候,保证数据不容易丢失。
alqaeda既然Publisher有消息队列了,为什么Subscriber还要有消息队列?
这个问题⽐较难⼀点。我的理解是,由于ROS毕竟是分布式系统,Publisher和Subscriber不⼀定在同⼀台主机上,因此消息需要通过⽹络来交换。但是⽹络的性能时好时坏,如果Subscriber没有消息队列,那么每次运⾏Callback函数前都要先通过⽹络取回消息,然后才能处理。当⽹络很差时,就会让
商务英语中级词汇>mainly系统堵塞。⽽有消息队列的话,Subscriber就可以⼀边处理队列中的消息,⼀边通过⽹络缓存新的消息,⽽不⽤每次处理消息前都要临时去读⼀个回来。这样就增加了系统的可靠性。
为什么要设置缓冲区的⼤⼩?
这个缓冲区的⼤⼩是指消息队列使⽤的缓冲区物理内存空间⼤⼩。如果这个空间⼩于⼀个消息所需要的空间,⽐如消息是⼀副图⽚或者⼀帧点云,数据量超过了缓冲区的⼤⼩。这个时候为了保证通信不发⽣错误,就会触发⽹络通信的保护机制,TCP的Buffer会为你缓存消息。这种机制就会导致每⼀帧消息都被完整的缓存下来,没有消息被丢弃,感觉上就像queue_size被设置成了⽆穷⼤。详细说明请参考:        Ros subscriber not up to date
uless
rospy subscriber queue_size acting strange when buff_size is too smallbastian telfair
消息队列的运⾏机制
captain什么意思
这⾥只能说是我的理解了,因为没有看过源代码。我妈嫌我
⾸先,发布节点把消息发布,消息进⼊Publisher的消息队列,同时通知订阅了该话题消息的Subscriber来取消息。
其次,Subscriber来Publisher的消息队列⾥取消息,但取⾛的也是最⽼的消息,因为毕竟这是先⼊先出的队列。这也是为什么Publisher的消息队列的⼤⼩也要设置为1。
北京新东方地址最后,被取⾛的消息存放⼊了Subscriber的消息队列中,等待被Callback执⾏。如果Callback执⾏很慢,消息越堆越多,最⽼的消息会逐渐被顶替。
当然,这⾥究竟是Subscriber来取消息,还是Publisher直接把消息推给Subscriber,我只是猜测,反正这⾥交换的消息肯定不是最新的消息,⽽是队列⾥最⽼的消息。

本文发布于:2023-07-19 23:22:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/182646.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   队列   发布   缓存   处理   时候   没有   节点
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图