【问题标题】:Ros Subscriber processes old message even with set buff_size即使设置了 buff_size,Ros 订阅者也会处理旧消息
【发布时间】:2019-07-12 14:41:05
【问题描述】:

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

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

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

代码sn-p如下:

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.008 秒超过 1.7 秒和 3.5 秒增加到 3.9 秒,然后一直保持在那里。看起来buff_size=2**28 实际上并没有做任何事情。当我在没有 buff_size 参数的情况下运行订阅者时,我会遇到同样的延迟。

【问题讨论】:

  • 您找到解决该问题的方法了吗?我现在面临同样的问题。
  • 不,遗憾的是没有。我当时所做的不是将大消息发送到新节点,而是让创建消息的节点处理数据。

标签: python publish-subscribe ros subscriber


【解决方案1】:

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

由于所有消息都按 FIFO 顺序传递,如果您想确保新发布的值始终阻止发送任何旧的尚未发送的值,则将 queue_size 设置为 1 是一种有效的方法。例如,这对于只关心最新测量值的传感器很有用。例如如果存在较新的测量值,则永远不要发送较旧的测量值。

rospy documentation on choosing a good queue_size

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多