message-queue - 将 ROS 发布者或订阅者的队列大小设置为较大值的原因

标签 message-queue ros publisher subscriber

翻看机器人操作系统(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/

相关文章:

c++ - IPC Unix消息队列线程安全吗?

c++ - CMAKE 链接器没有找到库;但是使用 find_library 找到了库

linux - 该错误的解决方案是什么?重击 : syntax error near unexpected token `newline'

testing - Google Cloud Pub/Sub - 发布测试消息

swift - 使用 Swift Combine 创建一个定时器发布器

python - 清除 Tkinter 条目文本 - 所以新文本看起来很新?

message-queue - 如何知道字节数组是哪个protobuf消息?

process - wxpython GUI 和多重处理 - 如何从长时间运行的进程发送回数据

c - system v IPC 中的 "key"是什么东西?

c++ - 如何在ros包中使用sdk(非ros header/lib/binaries)?