この記事の要約
- ROSにおいて,PythonのSubscriber内部の処理が重い場合,queue_size=1としても最新のメッセージを受け取らなくなる
- Subscriberのbuff_size=2**24などとすると対処できるとあると他の記事で書かれている(しかしこれで対処できなかった)
- 結果,元のPublishrをqueue_size=1とすることで対処できた
queue_size=1としても最新のメッセージを受け取らない場合がある
sub.py
sub = rospy.Subscriber('/image_raw', Image, imageCb, queue_size=1)
queue_size=1とすると,複数のメッセージ(上の場合は/image_rawという画像)を保持しなくなるため,たとえimageCBの処理が重くても,常に最新のメッセージに対する処理ができる様に思えます.しかしなぜか,メッセージを複数保持してしまい,時間が経てば経つほど最新のメッセージと処理するメッセージの間に時間遅れが出てきてしまいます.
大きめのbuff_sizeを指定して対処
sub_buf.py
sub = rospy.Subscriber('/image_raw', Image, imageCb, queue_size=1, buff_size=2**24)
上に示す様に,Subscrierのbuff_sizeを大きくすると対処できるという記事を発見.例えばココ.しかしこれでも問題は直せず.
Publisherもqueue_size=1とする
pub.py
pub = rospy.Publisher('/image_raw', Image, queue_size=1)
ここまでやってちゃんと予期した挙動になりました.理由はよくわからないけど,とりあえずこれで最新のメッセージに対してだけ処理ができる様になりました.
この記事のまとめ
ROSにおいてPythonのSubscriberの処理が重い場合,queue_size=1としても最新のメッセージだけを処理することができないという問題を見かけました.buff_size=2**24など,Subscriberのbuff_sizeを大きくすると直せるという記事を見つけましたが,結果直せませんでした.最終的に,Publisherもqueue_size=1とすることで予期した挙動となりました.