極楽とんぼのロボット製作記

情報工学系大学院生がロボットとその周辺技術や身の回りの出来事について紹介するブログ

【ROS】rvizでMessage removed because it is too old (frame=[/hoge]と表示される

ROSのrvizを使用中にMessage removed because it is too old (frame=[/hoge]というErrorが表示される場合の対処法です。多くの場合、このエラーはrosbag playを使用してbagファイルを再生しながらrvizを使用した時に発生します。ROSは基本的に現在時刻を使ってノードごとの通信をしています。rosbagから流れてくるデータは過去のタイムスタンプが押されたデータなので必然的に現在時刻より古いものになります。ROSは親切にも古い時間のデータを読み飛ばしてくれているのですが、bagファイルを使用してデバッグ等をしたい際はこの機能が邪魔になります。

下記は一例です。

#terminal 1
roscore

#terminal 2
rosparam set /use_sim_time true

#terminal 3
rosbag play hoge.bag --clock

#terminal 4
rosrun rviz rviz

まずroscoreを立ち上げてからrosparamとしてuse_sim_timeをtrueにします。逆だと意味がありません。さらにrosbagを再生する際に--clockとしておきます。
こうすることで、bagファイル上のタイムスタンプの時間が使用されます。

毎回roscoreを立ち上げてからパラメータをセットするのは大変なので、launchを使いたいと思います。launchを利用する際は下のようにしてパラメータを設定します。

<launch>
  <param name="use_sim_time" value="true" />
  <node pkg="hoge" type="piyo" name="foo" />
</launch>

これでlaunchを立ち上げるだけで、use_sim_timeをセットできます。

参考サイト
Error in rosbag play despite setting use_sim_time param - ROS Answers: Open Source Q&A Forum