将 ROS 发布者缓冲区设置为 1 并将订阅者缓冲区设置为 1000 并且仍然不丢失任何消息是否足够
Is it sufficient to set ROS publisher buffer to 1 and Subscriber buffer to 1000 and still not loose any messages
我正在尝试了解订阅者和发布者缓冲区。如果我将 subsrciber buffer 设置为 1000 并将 publisher buffer 设置为 1,我是否有可能丢失消息?有人能给我解释一下吗?
是的,理论上 使用这些设置您可能会丢失消息,实际上这取决于情况。
理论:微调线程
在发布者和订阅者双方,都有所谓的 spinner 线程负责处理回调(用于发布者端的消息发送和订阅者的消息评估-边)。这些微调器线程与主线程并行工作。如果消息从主线程到达的速度快于微调线程处理它们的速度,则队列大小给定的消息数量将在开始丢弃最旧的消息之前进行缓冲。因此,如果您以非常高的速率发布,发布者端的微调器线程可能会丢弃较旧的消息,而如果订阅者端的回调函数执行时间太长,您的订阅者队列将开始丢弃消息。要改进这一点,可以使用 多线程微调器 ,其中增加微调器线程的数量并激活并发,以便更快地处理回调队列。阅读更多相关信息 here。
练习:选择队列大小
您应该设置的发布者队列的队列大小depends on which rate you publish and if you publish in bursts。如果您以突发或更高频率(例如 > 10 Hz
)发布,1
的发布者队列大小将不够。在订阅者方面,很难给出建议,因为它还取决于回调处理信息所花费的时间。
实际上也可以为队列设置值 0
,这会导致任意大的队列,但这可能会有问题,因为所需的内存可能会无限增长,至少在您的计算机死机之前是这样。此外,具有较大的队列大小通常可能是不利的:如果您设置了一个较大的队列并且回调需要很长时间才能执行,那么您可能正在处理非常过时的数据,而队列变得越来越长。
其他通信模式
如果你想保证信息确实被处理(例如实时或安全相关信息),ROS 主题可能是错误的选择。根据您的确切需求,其他两种通信方法 services
or actions
可能是替代方法。但是对于安全相关的实时数据的大量信息流,ROS1 中没有完美的通信机制。
我正在尝试了解订阅者和发布者缓冲区。如果我将 subsrciber buffer 设置为 1000 并将 publisher buffer 设置为 1,我是否有可能丢失消息?有人能给我解释一下吗?
是的,理论上 使用这些设置您可能会丢失消息,实际上这取决于情况。
理论:微调线程
在发布者和订阅者双方,都有所谓的 spinner 线程负责处理回调(用于发布者端的消息发送和订阅者的消息评估-边)。这些微调器线程与主线程并行工作。如果消息从主线程到达的速度快于微调线程处理它们的速度,则队列大小给定的消息数量将在开始丢弃最旧的消息之前进行缓冲。因此,如果您以非常高的速率发布,发布者端的微调器线程可能会丢弃较旧的消息,而如果订阅者端的回调函数执行时间太长,您的订阅者队列将开始丢弃消息。要改进这一点,可以使用 多线程微调器 ,其中增加微调器线程的数量并激活并发,以便更快地处理回调队列。阅读更多相关信息 here。
练习:选择队列大小
您应该设置的发布者队列的队列大小depends on which rate you publish and if you publish in bursts。如果您以突发或更高频率(例如 > 10 Hz
)发布,1
的发布者队列大小将不够。在订阅者方面,很难给出建议,因为它还取决于回调处理信息所花费的时间。
实际上也可以为队列设置值 0
,这会导致任意大的队列,但这可能会有问题,因为所需的内存可能会无限增长,至少在您的计算机死机之前是这样。此外,具有较大的队列大小通常可能是不利的:如果您设置了一个较大的队列并且回调需要很长时间才能执行,那么您可能正在处理非常过时的数据,而队列变得越来越长。
其他通信模式
如果你想保证信息确实被处理(例如实时或安全相关信息),ROS 主题可能是错误的选择。根据您的确切需求,其他两种通信方法 services
or actions
可能是替代方法。但是对于安全相关的实时数据的大量信息流,ROS1 中没有完美的通信机制。