【问题标题】:Reason to set queue size of ROS publisher or subscriver to a large value将 ROS 发布者或订阅者的队列大小设置为较大值的原因
【发布时间】:2019-06-04 12:48:30
【问题描述】:

翻看机器人操作系统(ROS)的教程,发现大部分example codes将发布者的队列大小设置为更大的值,比如1000。我认为这会导致节点失去实时响应。

出于什么目的,人们将其设置为那么大的值?

【问题讨论】:

  • 我也对这个感兴趣。通常,我只是不假思索地将其设置为 10 或 100。 Any1可以解释一下吗?
  • 但是,如果将其设置为 less,则可能会丢失一些数据。有时,记录所有数据很重要,然后您的计算可能会有一些滞后,但您不会丢失任何中间数据。这可能是一个可能的原因。

标签: message-queue ros publisher subscriber


【解决方案1】:

来自 ROS 文档 (http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber):

消息发布者(生产者): “advertise()的第二个参数是消息队列的大小 用于发布消息。如果消息发布得更快 比我们可以发送它们,这里的数字指定了多少条消息 在扔掉一些之前先缓冲一下。”

消息订阅者: “subscribe() 函数的第二个参数是消息队列的大小。如果消息到达的速度比处理它们的速度快,则这是在开始丢弃最旧的消息之前将缓冲的消息数。”

可能的解释: 考虑消费者-生产者问题。

您无法保证您会以消息到达的速度使用它们。因此,您创建了一个队列,该队列在消息来自发送者(例如某些传感器)时被填充。 坏情况:如果您的程序在某些其他部分出现延迟,并且您无法以消息到达的速度读​​取消息,则队列会增加。 好案例:一旦您的其他处理负载减少,您就可以更快地读取队列并开始减少它。如果您有空闲时间,您最终会将队列大小减少到零。

所以对于您的问题,如果您将队列大小发送到较大的值,您可以保证不会丢失消息。在一个简单的示例中,您没有内存限制,因此您可以做任何您想做的事情,例如使用许多 GBytes 的 RAM 来创建一个大队列并保证始终有效。 或者,如果您创建一个玩具示例来解释一个您不希望程序因其他原因而崩溃的概念

现实生活中的例子可以是服务员和厨房洗碗的场景。 假设顾客结束用餐,服务员把他们的脏盘子拿去厨房洗。他放了一张桌子。只要洗碗机可以,他就去餐桌拿盘子,然后拿去洗。在正常操作中,表格永远不会被填满。但是,如果其他人给洗碗工另一个任务,桌子就会开始满了。直到一段时间,服务员都不能再放盘子,把桌子弄脏了(系统有问题)。但是如果那里的桌子人为地很大(比如说 1000 平方米),即使洗碗机很忙,服务员也可能会完成工作,考虑到一段时间后他就能回来洗碗了。

好的,答案很长,但它可能对理解队列有所帮助。

【讨论】:

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