NeRFベース自己位置推定をAutowareと合わせて動かす

概要

 Autowareのlogging_simulatorを使って、ARタグベース自己位置推定向けに公開されているデータを使ってNeRFベース自己位置推定を動かした。AWSIMの環境変化が少ないデータでなら、ある程度の精度が出せるようになってきた。

背景

 先日、AutowareのARタグベース自己位置推定用の新しいサンプルデータが公開された(プルリクエスト)。これはAWSIMを使って仮想西新宿にARタグを浮かべたデータとなっている。

 このデータは

  • 走行速度が15km/h程度で抑えられている
  • シミュレータ内部の自己位置もGTとして保存されている

と都合が良い点があるので、このデータを使ってNeRFベース自己位置推定も動かし、GTとの誤差を計測してみたくなった。

やったこと

 学習データには、公開データと同じ経路・同じ走行速度だが、ARタグがない状態で走行したデータを利用した。AWSIMにおいて他車の出現はランダムなので、そこも公開データとは乖離がある。

 学習したNeRFパラメータを使ってNeRFベース自己位置推定を動かした。ここは若干ハックが必要で複雑になる。

工夫点1

 NDTやその他Autowareに標準搭載されている自己位置推定モジュールが動かないように、pose_source:=artagとしてARタグモードでAutowareを動かしつつ、しかしマップにはARタグの座標が書き込まれていない普通のマップを使うと、実質的にAutowareが観測モデルなしで運動モデルだけは動くという状況になる。

 その状況でAutowareとは別にNeRFモジュールを立ち上げて、通信トピック名は上手く繋がるようにしておくとNeRFによる自己位置推定の評価ができる。

工夫点2

 初期位置推定はまだちゃんとできていないので、それはGTから与える。初期位置は/initialposeというトピック名でgeometry_msgs/msg/PoseWithCovarianceStampedをpublishすれば良いので、シェルスクリプトとして準備しておくと楽。

再現方法

 学習したNeRFパラメータは 20230902_awsim_15kph.zip - Google ドライブで公開した。コードをクローンして、README.mdにしたがって環境構築し(Docker向けに書かれてはいるがUbuntu22.04実環境でも大差はない)、先のNeRF学習結果をダウンロードしてパスなどを適切に設定するとどこでも動かせるはずではある。

 動作が確認できている実行環境は

結果

定性評価

 動画全体。左上が実際のカメラ画像、左下がNeRFで再構成して予測しているカメラ画像

 NeRFの方では学習の段階で自車の映り込みを防ぐために下段をいくらかカットしているので予測画像もそうなっている。

 気になる点抜粋

  • NeRFの精度は結構悪い。かなり再構成画像はぼやけている
  • 学習時にはARタグは無いデータで学習したので、当然再構成画像にもARタグは出てこない
  • 動物体のマスクとかも特に入れていないので、学習時には存在しているがLocalization時には存在しない、すれ違うトラックを再構成しようとしてしまうところがある

定量評価

 シミュレータとのGTの比較

手法 平均誤差[m] 各フレームの誤差プロット
ARタグベース自己位置推定 0.621
NeRFベース自己位置推定 0.099
NDT 0.079

 NDTだけは初期位置推定もNDTで行っているので、それも加味してやはり一番良い手法であることは間違いない。ARタグは、ARタグを発見するタイミングで補正されて、それ以外はオドメトリで走ることになり、オドメトリは現状Z座標がどんどん浮いていく問題を抱えているのでそこで平均誤差が悪化する。オドメトリはXY平面内ではかなり強いので、NeRFベース自己位置推定の貢献はほぼZ軸が浮かないようにするだけだとは思われる。まぁそれがちゃんとできているなら良いといえば良い。