8

画像メッセージをリッスンしている 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/536Ros サブスクライバーが最新ではありません 、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
4

2 に答える 2

0

画像や点群などの大きなサイズのメッセージを扱う場合、適切な方法は Nodelets を使用することです。

于 2019-03-10T01:32:10.413 に答える