目次 — 知りたいところから読む

入力を変えて確かめる

実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。

下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。

実験パネルを別タブで開く

再現用ソースをダウンロード

前提と読み方

前提知識 自己位置推定、座標変換、平均二乗誤差の考え方。

実装・実験 · 合成軌跡の計算例はPython 3.12.3で実行済み。実SLAMの性能比較は未実施。

ブラウザ実験の条件

上の実験は、参照軌跡 x=t m(0〜10秒、0.1秒間隔の101点)を使う1次元の合成例です。全ての姿勢は単位回転で、時刻は完全に一致します。推定位置を reference + offset + drift × t とし、一定オフセット、ドリフトの増加率、RPEの評価間隔を変更できます。初期値と線形ドリフトのプリセットは本文の2例を再現します。実SLAMの精度や性能の測定ではありません。

位置合わせは平行移動だけです。「なし」は補正せず、「始点」は最初の位置を一致させ、「平均位置」は全101点の平均を一致させます。回転やスケールを推定するSE(3)/Sim(3)合わせではありません。直線だけのデータから3次元の回転を一意に決める実験にはしません。

位置合わせ前と後のAPE RMSEを両方表示します。RPEは指定時間だけ離れた全ペアの相対移動差から求め、ペア数は 101 - interval/0.1 です。固定した平行移動は相対移動の差で相殺されます。上図は位置と時刻、下図は位置合わせ後の符号付き位置誤差と、ペア開始時刻に対する符号付き相対誤差です。図の誤差は符号付きですが、RMSEは非負です。

欠測・姿勢誤差・時刻補間・追跡失敗は追加していません。実機の軌跡をアップロードする機能は含まず、その評価には以下の時刻・座標系・整合条件の確認が必要です。同じ実行コード・評価カーネル・参照軌跡を同じディレクトリに保存すればローカルでも再現できます。ブラウザ実行にはインストール不要で、以下のローカル手順は任意です。

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

一定の平行移動は位置差に現れるが、区間の移動量を引き算すると消える。一方でドリフトは区間差にも残る。この例は整列も時刻補間もしていない。真値ファイルとドリフトの推定ファイルも配布する。

実データでは先に条件をそろえる

図1 · ボタンで表示を切り替え
時刻と座標を合わせ、整列条件を固定してAPEとRPEを求め、失敗率と遅延を併記する

位置の単位を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を報告してはいけない。その場合は再走行の整合性など別の量を測り、位置の正確さを直接保証しないと明記する。

失敗区間を残して解釈する

難しい区間だけを取り除くと、成功した区間の精度だけが残る。少なくとも全試行の成功率と、評価可能な区間の誤差を分けて示す。センサの時刻・座標の切り分けを先に済ませると、アルゴリズム以外の原因を比較へ混ぜにくくなる。

関連して読む

評価前に時刻と座標を確認するセンサフュージョンがうまくいかない理由 — 時刻ずれ・座標系・外部較正同じ分野を別の観点から読むICPはなぜ失敗するのか同じ分野を別の観点から読むROS 2で地図作成から自律走行まで — Jazzy・Nav2の最小再現手順