navigation (move_base) でロボットが一時停止を繰り返す


navigation (move_base) を動かしていると、設定速度を上げるとロボットが一時停止→移動をこまめに繰り返すようになった(低速のときは問題なかった)。
そのときに出力されていたエラーが以下のもの。

[ERROR] [1609950201.266020807]: Extrapolation Error: Lookup would require extrapolation into the future.  Requested time 1609950201.261970043 but the latest data is at time 1609950201.165888008, when looking up transform from frame [odom] to frame [map]

どうやらtfの[map]→[odom]の更新したときのタイムスタンプがおかしいらしい。

原因

navigationでは[map]→[odom]のtfはamclで更新している。
調べてみると、やはりamclの方に問題があったようだ。

速度を上げると(位置の分散が大きくなるため)amclのパーティクル数が増え、処理時間が増えたことでタイムスタンプの更新が遅くなり、その結果としてタイムスタンプが遅れてしまったらしい。

対策

amclのパラメータである"max_particles"を下げることで解決できる(amcl.launchを使っている場合はその中にmax_particlesが記載されているあはずです)。
私は"min_particles"を500、"max_particles"を600程度にすることで一時停止することなく移動できるようになった。

なお、もし低速でも同じエラーが出る場合は"min_particles"の設定値も下げると解決できる可能性がある。

※ min_particlesとmax_particlesはモンテカルロフィルタの粒子数です。これを減らすと位置推定の精度やロバスト性が下がる可能性があるため、下げすぎないことをおすすめします。