2014-10-16 36 views
3

我已经写了ROS订户的图像的话题之一,我已经用我的设置缓冲区,以1:罗斯用户不是最新

subscriber =rospy.Subscriber("/camera/rgb/image_mono/compressed",CompressedImage, callback, queue_size=1) 

但是我的用户还有很大的差距。任何想法可能会造成这种情况?我是否正确设置队列大小?

回答

2

该队列用于排队传入消息。这意味着,如果您的回拨过程比新消息到达需要更长的时间,则只会保留queue size,其他则不会由您的节点处理。

我会建议在发布之前在发布者节点中打印出一条消息,并在回调方法的顶部显示一条消息。然后,您可以准确衡量ros处理您的消息所需的时间。所有其他时间问题可能会由您的回调方法引起。

+1

我同意,但如果这些其他消息没有处理,这并不意味着我的订户将处理最近的一个。作为奥斯卡,视频显示应该是波涛汹涌(由于跳帧),但不落后? – 2014-10-17 16:52:14

+0

那么,只要您的回调方法需要处理,它就会滞后。 – Steffen 2014-10-17 18:28:32

+0

我明白了!因为我会在收到邮件后几秒钟内显示每封邮件。谢谢 – 2014-10-17 19:17:44

0

可见的滞后的原因很可能是您的回调函数占用了大量时间。如果可能的话,尝试解决这个问题。将队列大小设置为1本质上意味着要求ROS处理它可以容纳的任何帧。

将你的队列大小设置为更大的数字,比如5或10.这样(希望如果处理延迟不是太多)所有的帧都会被处理,但是它们会落后于时间。也就是说,视频处理将在后面执行几个步骤,但没有任何“混乱”,并且在两者之间缺少帧。

+0

我不介意一个波涛汹涌的图片。事实上,我更喜欢那个迟缓的人。我使用一个队列大小的原因是为了在调用回调时拥有最新的信息。我不需要处理所有这些,我只需要处理当前的一个。是的,我的回调比传入消息的速度要长(难以改变)。 – 2014-10-17 16:54:17

+0

在这种情况下,问题是什么?队列大小为1将确保这一点。 – 2014-10-17 17:06:38

5

我有完全相同的问题(它不是波涛汹涌的帧率是问题,这是实际的滞后)。当任何图像源被出版(rosbag,摄像头驱动,等等),我的节点将仍然工艺〜5-10帧即使源被打死我会杀了(我相信我有queue_size=1

这是the github issue我做的,它已经解决了。事实证明,有多个队列涉及(不只是您将queue_size设置为1的队列)。在我的情况下,默认buff_size比我的图像小,所以我的节点没有足够快地处理它们,并且总是有一些队列中备份了一些图像。

TL; DR 将您的订户的buff_size增加为I did here。它为我工作:)

+0

所以基本上用户只能删除已经在其缓冲区中的消息。如果缓冲区小于'queue_size + 1',则不会丢失任何消息,并且TCP缓冲区正在缓冲您的消息。 – 2016-07-19 13:40:40