Ros订户即使设置了buff_size也会处理旧消息

问题描述 投票:2回答:1

我正在使用ROS,Ubuntu 16.04和Python3。

我有一个发布者,它以7.5 Hz的频率发布自定义消息。它包含2个点云和一个图像。一条消息的大小约为2.8 MB,平均带宽为21.64 MB / s

我有一个订阅该主题的订户,但是即使queue_size = 1,它也有明显的延迟。在网上搜索此问题时,我发现有很多指南说,原因是缓冲区大小。默认缓冲区大小对于消息来说显然太小。但是当我调整缓冲区大小时,仍然会出现相同的延迟。

下面是代码段:

def listener():
    rospy.init_node('node', anonymous=True)
    rospy.Subscriber("imgAndPoints", customMsg, cb, queue_size=1, buff_size = 2**28)
    #buff_size is 268MB
    rospy.spin()
cb(msg):
    msg_time = msg.header.stamp.to_sec()
    current_time = rospy.Time.now().to_sec()
    print("Delay is ", current_time - msg_time)
    time.sleep(2) #instead of performance intensive cb
    return

延迟从第一次回调中的0.008s(超过1.7s和3.5s)增长到3.9秒,然后一直保持一致。似乎buff_size=2**28实际上并未执行任何操作。在不使用buff_size参数的情况下运行订阅服务器时,会得到相同的延迟。

python publish-subscribe ros subscriber
1个回答
0
投票

我建议将发布者的缓冲区大小更改为1。

由于所有消息均以FIFO顺序传递,因此,如果要确保新发布的值将始终阻止任何尚未发送的旧值发送,则将queue_size设置为1是一种有效的方法。举例来说,这对只关心最新测量的传感器来说是有好处的。例如如果存在较新的度量,则从不发送较旧的度量。

rospy documentation on choosing a good queue_size

© www.soinside.com 2019 - 2024. All rights reserved.