ROSの自己位置推定の/odomの意味
概要
みなさんROSのamclパッケージで自己位置推定したことありますか?
自己位置推定すると大体
/map -> /odom -> /base_footprint(ロボットの現在位置)
という構成でtf treeが構築されると思います。
今回このうち/odom
フレームってなんだ?って度々疑問を覚えたのでそのメモ兼解説をします。
ここで言及する自己位置推定とは周辺の環境地図がすでに作成されている状態で環境地図内におけるロボットの現在位置を推定する行為を言います。マップを作成しながら自己位置を同時に推定するSLAMとは少し違うので注意してください。
Odometryについて
自己位置推定は本来LaserScanが無くても実行可能です。そのやり方はIMUから得られる(角)加速度を2回積分すれば現在位置になります。簡単ですね!
この方法で取得する現在位置をOdometryといい、amclにおいてOdometryの示す位置は/odom
座標系に存在することになっています。nav_msgs/Odometry
のメッセージ型には位置の他に速度と推定値の共分散が含まれます。
この処理を実装すると
/odom -> /base_footprint
の関係性が構築されます。/odom
フレームとは/base_footprint
フレームの位置を決める上での原点であり、Odometry値の基準だから/odom
という名前になっているわけです。
ただしこの方法は目を瞑ったまま歩いていることと同じなので、環境地図の存在する/map
座標系と連携する方法がありません。そこで/map
と/odom
のギャップを埋める方法としてamcl
パッケージが提供するパーティクルフィルターを用います。
ここまでの操作でやっと
/map -> /odom -> /base_footprint
の関係が構築されるわけです。
シミュレータ環境においてSLAMを実行した場合Odometryの計測誤差は基本0であるはずなので、/map
と/odom
は大体同じ位置に存在します。理想的な環境だからこその挙動です。
逆に実環境ではセンサーに乗るノイズが大きいので/odom
フレームが若干揺れ動くはずです。そうでないなら自己位置推定のシステムが間違っているか、とてもすごい自己位置推定システムで誤差が全く存在しないかのどちらかです。
IMUを使わない自己位置推定について
世の中にはIMUを搭載していなくても自己位置推定する不思議なデバイス(ZED stereolabs等)が沢山存在します。
自己位置推定の基本原理は上記の通りで、違う点は取得する画像やPointCloudからフレーム間の移動距離を求めている点です。フレーム間の移動距離を常に求めてその値を積算していけば同じようにOdometryとして利用可能です。
このやり方はIMUが必要無いというメリットがありますが計算コストがとても高いのでリアルタイムで動かすことが辛いです。移動距離の計算アルゴリズムを最適化する、GPU等のハードウェアの暴力を利用するといった手法を取らなければなりません。
HTC Vive等のVRヘッドセットはカメラ+IMU+外部センサーという構成で自己位置推定を行っています。
IMUは誤差が積算する欠点を大きく上回って毎フレームの計算リソースが少なくて済むという利点があるため、IMUで取れるOdometry値を補正するというやり方が多いです。自己位置推定をするシステムをハードから自作する場合できるだけIMUは搭載してあげてください。
まとめ
- 現在位置
base_link
はIMUの情報を元に計算される。この値はOdometryという意味を持つので基準フレーム名に/odom
という名前を用いている。 - LaserScan等のセンサーから得られる周辺情報を元にOdometryを補正する。その補正値は
/map
→/odom
への変換であり、/odom
以下の座標系全体に影響を及ぼす。理想的な環境ではノイズが乗らないので/map
→/odom
の変換値は0になる。