我已经编写了一个ROS订阅者来订阅图像话题之一,并使用以下方式将缓冲区设置为1:
subscriber =rospy.Subscriber("/camera/rgb/image_mono/compressed",CompressedImage, callback, queue_size=1)
然而,我的订阅者仍然滞后。有什么想法可能导致这种情况?我是否正确设置了队列大小?
我已经编写了一个ROS订阅者来订阅图像话题之一,并使用以下方式将缓冲区设置为1:
subscriber =rospy.Subscriber("/camera/rgb/image_mono/compressed",CompressedImage, callback, queue_size=1)
我曾经也遇到过这个问题(不是帧率卡顿的问题,而是真正的延迟)。当我关闭发布图像源(rosbag、相机驱动等)时,我的节点仍然会处理 ~5-10帧的内容即使源已被关闭(而我确信我设置了queue_size=1
)。
这是我在github上创建的问题,并得到了解决。事实证明,涉及到多个队列(不仅仅是你设置的大小为1的那个队列)。在我的情况下,默认的buff_size
比我的图像小,因此我的节点无法快速地对其进行处理,总是有一些图像停留在某个队列中。
简而言之,增加订阅者的buff_size
,就像我在这里做的那样。这对我很有效 :)
可见的延迟原因很可能是您的回调函数占用了大量时间。如果可能的话,请尝试修复它。将队列大小设置为1基本上意味着要求ROS处理它可以保留的任何帧。
将队列大小设置为更大的数字,比如5或10。这样,(希望处理延迟不会太大)所有的帧都将被处理,但它们将落后于时间。也就是说,视频处理将会滞后几步,但没有任何“抽搐”和中间缺失的帧。
queue_size + 1
,则不会丢失任何消息,并且TCP缓冲区正在缓冲您的消息。 - Dimitri Schachmann