翻看机器人操作系统(ROS)的教程,发现最多的是example codes将发布者的队列大小设置为更大的值,例如1000。我认为这会导致节点的实时响应丢失。
出于什么目的,人们是否将其设置为这么大的值?
最佳答案
来自 ROS 文档 ( http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber ):
消息发布者(生产者):
"advertise() 的第二个参数是消息队列的大小
用于发布消息。如果消息发布得更快
比我们可以发送它们,这里的数字指定要发送多少条消息
在扔掉一些之前先缓冲一下。”
消息订阅者:
“subscribe() 函数的第二个参数是消息队列的大小。如果消息到达的速度比它们正在处理的速度快,那么这是在开始丢弃最旧的消息之前将被缓冲的消息数量。”
可能的解释:
考虑消费者-生产者问题。
您不能保证您会以消息到达的速度使用它们。因此,您创建了一个队列,该队列在发送者(例如某些传感器)来的消息时被填充。
糟糕的情况:如果您的程序在其他部分延迟并且您无法以消息到达的速度读取消息,则队列会增加。
好案例:一旦您的其他处理负载减少,您就可以更快地读取队列并开始减少它。如果您有空闲时间,您最终会将队列大小减少到零。
因此,对于您的问题,如果您将队列大小发送到大值,您可以保证不会丢失消息。在一个简单的例子中,你没有内存限制,所以你可以做任何你想做的事情,比如使用许多 GB 的 RAM 来创建一个大队列,并确保始终有效。 或者,如果您创建一个玩具示例来解释一个概念,您不希望程序因其他原因崩溃 .
一个真实的例子可以是服务员和厨房洗碗的场景。
假设顾客结束用餐,服务员把他们的脏盘子带到厨房洗。他放了一张 table 。只要洗碗机可以,他就会去餐 table 上拿盘子洗。在正常操作中,表永远不会被填满。但是,如果其他人将另一项任务交给洗碗工, table 就会开始满了。直到一段时间服务员不能再放盘子并且把 table 弄脏了(系统中的问题)。但是,如果那里的 table 人为地很大(比如 1000 平方米),即使洗碗机很忙,服务员也可能会完成它的工作,考虑到一段时间后他将能够返回清洁餐具。
好的,答案很长,但它可能有助于理解队列。
关于message-queue - 将 ROS 发布者或订阅者的队列大小设置为较大值的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444248/