首页 > 解决方案 > 将 ROS 发布者或订阅者的队列大小设置为较大值的原因

问题描述

当我查看机器人操作系统(ROS)的教程时,我发现大多数示例代码都将发布者的队列大小设置为更大的值,例如 1000。我认为这会导致节点失去实时响应。

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

标签: message-queuerospublishersubscriber

解决方案


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

消息发布者(生产者):“advertise() 的第二个参数是用于发布消息的消息队列的大小。如果消息发布的速度比我们可以发送的快,这里的数字指定在抛出之前要缓冲多少消息有些远。”

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

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

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

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

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

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


推荐阅读