将ROS发布服务器缓冲区设置为1,将订阅服务器缓冲区设为1000,并且仍然不会丢失任何消息,这是否足够



我正在努力理解订阅服务器和发布服务器缓冲区。如果我将subsrciber缓冲区设置为1000,将publisher缓冲区设置成1,那么我是否有可能丢失消息?有人能给我同样的解释吗?

是的,理论上使用这些设置可能会丢失消息,实际情况取决于此。

理论:微调线程

在发布者和订阅者双方,都有所谓的微调线程负责处理回调(用于发布者端的消息发送和订阅者端的消息评估(。这些旋转螺纹与主螺纹平行工作。如果消息从主线程到达的速度比微调器线程处理的速度快,那么在开始丢弃最旧的消息之前,队列大小给定的消息数量将被缓冲。因此,如果您以非常高的速率发布,则发布方微调线程可能会丢弃旧消息,而如果订阅方的回调函数执行时间过长,则订阅方队列将开始丢弃消息。为了改进这一点,可以使用多线程微调器,其中可以增加微调器线程的数量并激活并发性,以便更快地处理回调队列。点击此处了解更多信息。

练习:选择队列大小

应设置的发布者队列的队列大小取决于发布的速率以及是否以突发方式发布。如果以突发或更高频率(例如> 10 Hz(发布,则1的发布队列大小是不够的。在订阅者方面,很难给出建议,因为这也取决于回调处理信息所需的时间。

实际上,也可以为导致任意大队列的队列设置值0,但这可能会有问题,因为所需内存可能会无限增长,至少在计算机冻结之前是这样。此外,拥有大的队列大小通常可能是不利的:如果您设置了一个大队列,并且回调需要很长时间才能执行,那么当队列变得越来越长时,您可能正在处理非常过时的数据。

替代通信模式

如果你想保证信息实际上正在被处理(例如实时或安全相关信息(,ROS主题可能是错误的选择。根据您的具体需要,其他两种通信方法servicesactions可能是一种选择。但对于安全相关实时数据的大型信息流,ROS1中没有完美的通信机制。

相关内容

最新更新