目次 — 知りたいところから読む
SLAMの地図がきれいに見えても、位置誤差や処理の遅れは分からない。評価では「何と比較したか」「どの自由度を整列で取り除いたか」「失敗した区間を含めたか」を先に決める。本記事の数値は合成軌跡から計算した例であり、特定のSLAM方式の性能ではない。
ATEとRPEが見るもの
真値の姿勢を Q_i、推定を P_i、固定した整列変換を S とすると、絶対誤差は E_i=Q_i^{-1}SP_i で表せる。並進成分のノルムを全時刻で二乗平均平方根にしたものが、よく使われるATEの一つである。evoでは絶対姿勢誤差をAPEとして扱う。
相対誤差は区間 i\rightarrow j の運動を比べ、F_{ij}=(Q_i^{-1}Q_j)^{-1}(P_i^{-1}P_j) とする。RPEでは「1秒先」「1 m先」「1フレーム先」のどれを使うかで結果が変わる。各指標と整列の選択肢はevoのMetricsを参照。
誤差の違いを小さな計算で確かめる
slam_metric_lab.pyを空のフォルダへ保存してpython3 slam_metric_lab.pyを実行する。Python 3.12.3標準ライブラリで確認済み。0〜10秒を0.1秒間隔で101点、真値は x=t mとし、姿勢の回転はすべて単位回転とする。
| 合成した誤差 | 整列なしの並進APE RMSE | 1秒間隔・全対応区間の並進RPE RMSE |
|---|---|---|
| 常に+0.1 mずれる | 0.100000 m | 0.000000 m |
| 毎秒0.01 mずれが増える | 0.057879 m | 0.010000 m |
一定の平行移動は位置差に現れるが、区間の移動量を引き算すると消える。一方でドリフトは区間差にも残る。この例は整列も時刻補間もしていない。真値ファイルとドリフトの推定ファイルも配布する。
実データでは先に条件をそろえる
位置の単位をm、時刻を秒に統一し、センサ基準と車体基準を混ぜない。記録開始時刻が違うだけなのか、クロック自体がずれているのかを区別する。TUM形式はtimestamp x y z q_x q_y q_z q_wである。形式の公式説明に従い、クォータニオンの順序も確認する。
SE(3)整列は回転と並進、Sim(3)整列はさらに尺度を補正する。単眼法の形状比較で尺度補正が妥当な場合もあるが、尺度誤差を評価したい実験で補正すると評価対象を消してしまう。尺度あり・なしの結果を同じランキングへ無条件に並べない。
evoで評価する際の記録
evoを導入した専用環境でevo_ape --versionとevo_rpe tum --helpを保存する。次は公式CLIの形式に沿う手順例で、このページ作成時に実データへ実行した結果ではない。
evo_ape tum reference.tum estimate.tum --align --save_results ape.zip
evo_rpe tum reference.tum estimate.tum --delta 1 --delta_unit s --all_pairs --save_results rpe.zip
reference.tumとestimate.tumは読者が用意した同じ走行の軌跡へ置き換える。時刻対応の許容差も--helpで確認して固定し、対応できた点数を報告する。上の合成表は整列なしなので、--alignを付けた結果とは同じにならない。
精度だけで合否を決めない
| 記録する項目 | 条件・単位 |
|---|---|
| APE / RPE | 整列の自由度、区間幅、mまたは度、対応点数 |
| 失敗 | 全試行数、追跡脱落数、復帰までの秒数 |
| 遅延 | センサ取得から推定が利用可能になるまでのp50/p95、時計同期条件 |
| 計算資源 | CPU/GPU、スレッド数、メモリ、入力レート、ソフトウェア版 |
1フレームの処理時間と、キューで待った時間を含む遅延は異なる。真値がない実験でATEを報告してはいけない。その場合は再走行の整合性など別の量を測り、位置の正確さを直接保証しないと明記する。
失敗区間を残して解釈する
難しい区間だけを取り除くと、成功した区間の精度だけが残る。少なくとも全試行の成功率と、評価可能な区間の誤差を分けて示す。センサの時刻・座標の切り分けを先に済ませると、アルゴリズム以外の原因を比較へ混ぜにくくなる。
コメント
コメントの投稿にはログインが必要です
まだコメントはありません。