画像メッセージをリッスンしている rospy サブスクライバーで遅延の問題が発生しています。
概要:
5Hz で /camera/image_raw に画像をストリーミングする rosbag があります。参照用の画像を表示するための image_view ノードもあります。この image_view は 5Hz で表示しています。
rospy サブスクライバー (キュー = 1 で初期化) では、画像も表示します (遅延時間を image_view ノードと比較するため)。サブスクライバーはその後、重い処理を行います。
期待される結果:
キュー サイズが 1 であるため、加入者は最新のフレームを処理し、その間に他のすべてのフレームをスキップする必要があります。処理が完了すると、次の最新フレームに移動する必要があります。古いフレームのキューイングがあってはなりません。これにより、途切れ途切れのビデオが発生しますが、遅延はありません (fps は低くなりますが、rosbag ストリームに対して「遅延」はありません)。
実結果:
サブスクライバーは公開されたストリームに遅れをとっています。具体的には、image_view ノードは 5Hz で画像を表示し、サブスクライバーは最新の画像を取得するだけでなく、すべての画像をキューに入れ、1 つずつ処理しているように見えます。遅延も時間の経過とともに大きくなります。rosbag ストリームを停止すると、サブスクライバーはキュー内の画像を処理し続けます (キュー = 1 であっても)。
以下のように、サブスクライバーのバッファー サイズを非常に大きくするように変更すると、期待どおりの動作が行われることに注意してください。
self.subscriber = rospy.Subscriber("/camera/image_raw", Image, self.callback, queue_size = 1, buff_size=2**24)
ただし、これはクリーンなソリューションではありません。
この問題は、バッファ サイズの解決策を見つけた次のリンクでも報告されています。公式の説明では、パブリッシャーが実際に速度を落としている可能性があると仮定していますが、image_view サブスクライバーは 5Hz で画像を表示するため、そうではありません。
https://github.com/ros/ros_comm/issues/536、Ros サブスクライバーが最新ではありません 、http://answers.ros.org/question/50112/unexpected-delay-in-rospy-subscriber/
どんな助けでも大歓迎です。ありがとう!
コード:
def callback(self, msg):
print "Processing frame | Delay:%6.3f" % (rospy.Time.now() - msg.header.stamp).to_sec()
orig_image = self.bridge.imgmsg_to_cv2(msg, "rgb8")
if (self.is_image_show_on):
bgr_image = cv2.cvtColor(orig_image, cv2.COLOR_RGB2BGR)
cv2.imshow("Image window", bgr_image)
cv2.waitKey(1)
result = process(orig_image) #heavy processing task
print result