LoginSignup
3
1

More than 3 years have passed since last update.

【ROS Python】Subscriberがqueue_size=1でも最新のメッセージを受け取れいないときの対処

Posted at

この記事の要約

  • 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とすることで予期した挙動となりました.

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1