オドメトリは、歩いた距離を足し続けるほど少しずつずれる。ロボットが部屋を一周して出発点へ戻ってきたとき、地図上の現在位置が出発点から数十cmずれていても、直前のフレームだけを見ているシステムは間違いに気づけない。Loop Closure(ループ閉合)は、現在の景色が過去の景色と同じだと発見し、その「同じ場所」という拘束を使って軌跡を一周分つなぎ直す。

0. 30秒要約

1. ループ拘束を数式で書く

再訪問を検出してポーズグラフ全体を補正するLoop Closure図

図1 — 再訪問の一致をループ辺として追加し、ポーズグラフの累積ドリフトを全体最適化で分配する。

時刻iの姿勢をT_i\in SE(3)、時刻jで同じ場所を再訪したときの相対姿勢観測をZ_{ij}とする。ループ拘束の残差は

r_{ij}=\mathrm{Log}\left(Z_{ij}^{-1}T_i^{-1}T_j\right)\in\mathbb{R}^6

で表せる。\mathrm{Log}は剛体変換を6次元の微小回転・並進へ写す対数写像である。オドメトリ辺\mathcal E_oとループ辺\mathcal E_lを合わせたPose Graph最適化は

\min_{\{T_i\}}\sum_{(i,j)\in\mathcal E_o\cup\mathcal E_l} \rho\left(r_{ij}^{\mathsf T}\Omega_{ij}r_{ij}\right)

となる。\Omega_{ij}は情報行列、\rhoはHuberなどのロバスト損失。ループ辺が1本加わるだけで、長い軌跡に蓄積した誤差をグラフ全体へ配分できる。

2. 候補を探す:画像を「単語の袋」にする

Bag-of-Words(BoW)は、局所記述子を量子化して視覚単語のヒストグラムにし、過去キーフレームとの類似度を逆文書頻度(IDF)で計算する。ORB-SLAM系では、軽量なORB記述子と語彙木を組み合わせ、毎フレーム全地図を比較せず候補を数件へ絞る。

グローバル記述子は、画像全体を一つのベクトルへ圧縮して近い景色を検索する。学習ベースのNetVLAD、CosPlace、EigenPlacesなどは、照明や視点変化に頑健な表現を学習する一方、学習地域と異なる建物・農地・工場では性能が変わる。候補検索は速さ、幾何検証は正確さを担当し、どちらか一方へ依存しない。

3. 幾何検証:似ているだけでは閉じない

候補画像から記述子を再照合し、対応点を得る。単眼ならEssential/Fundamental Matrix、既知地図点があればPnP、平面テクスチャならホモグラフィをRANSACで推定する。インライア数、再投影誤差、深度が正か、視点差が物理的かを確認し、候補が同じ場所である確率を上げる。

誤ループが怖いのは、グラフ最適化が「誤った観測でも整合する形」へ地図を変形してしまうからだ。似た二つの廊下、窓の並び、農地の畝、工場の棚は、BoWだけでは区別しにくい。時間的に近すぎるフレームを候補から除き、複数キーフレームで連続して一致すること、独立したセンサ(IMU/LiDAR/GNSS)と整合することを要求する。

4. Pose Graphと地図の更新

ループ辺を追加した後、まずキーフレーム姿勢だけをPose Graphで最適化し、地図点を姿勢へ追従させる。大規模な地図では、全点を毎回Bundle Adjustmentするより、局所地図と大域姿勢を分けた方がリアルタイム性を保ちやすい。最適化が終わったら、現在のmap→odom変換を更新し、連続性を重視するodom→base_linkを急に飛ばさない設計にする。

ROS 2のTF2で言えば、局所オドメトリがodom→base_linkを発行し、SLAMの大域補正がmap→odomを調整する。ループ閉合の瞬間にロボット本体が飛んで見えないよう、補正を時間的に平滑化する。ただし、地図と実世界のずれを隠すために平滑化し過ぎると、ナビゲーションが古い位置を使い続けるため、補正量と適用時間をログに残す。

5. 失敗しやすい環境

条件 なぜ難しいか 対策
季節・昼夜の変化 色・影・植生が変わる 学習記述子、構造特徴、LiDAR併用
動的な人・車 同じ場所でも配置が違う 動的物体マスク、静的背景のみ照合
反復模様 間違った場所も似る 幾何検証、距離制約、複数フレーム確認
長い廊下・棚 視差と固有性が小さい IMU、人工マーカー、UWB
大きな照明変化 輝度記述子が変わる HDR/露光補正、学習型Place Recognition
急旋回・ブラー 対応点が減る IMU予測、キーフレーム間隔調整

6. 実装チェックリスト

  1. キーフレームの画像、時刻、姿勢、特徴記述子を保存する。
  2. 直近フレームを候補から除き、BoW/グローバル記述子で過去候補を数件検索する。
  3. 対応点を幾何検証し、インライア数・再投影誤差・深度正値を閾値判定する。
  4. 別時刻の複数フレームで同じ候補が続くか確認する。
  5. Pose Graphへループ辺を追加し、ロバスト最適化を実行する。
  6. 補正量、却下理由、計算時間をログへ残す。誤ループは取消可能にする。

7. 研究の方向性

最新研究では、画像検索を大規模自己教師学習で頑健化する方向、LiDAR・カメラ・イベントカメラの記述子を共有する方向、長期地図を季節ごとに更新する方向が進んでいる。NeRFや3D Gaussian Splattingのような新しい地図表現を場所認識へ使う試みもあるが、推論速度、記憶容量、動的物体、ライセンス、再現性を確認する必要がある。

工場や農地では、同じ形の通路・畝が繰り返すため、画像だけのループ閉合は曖昧になりやすい。作業機の経路、IMU、車輪オドメトリ、RTK-GNSS、地図上の作業境界を事前知識として使い、候補の探索範囲を制約すると誤検出を減らせる。研究プロトタイプを現場へ持ち込むときは、誤ったループを検出したら地図を凍結し、手動で再初期化できる運用を最初から用意する。

8. まとめ

Loop Closureは、過去の景色を思い出す画像検索と、同じ場所だと証明する幾何検証、誤差をグラフ全体へ配る最適化の三段階である。BoWや学習記述子のスコアだけで閉じず、対応点、センサ整合、時間的な連続性を確認する。ループを正しく扱えば、オドメトリのドリフトを地図全体で修正し、長時間走るロボットの自己位置を一貫させられる。

参考資料

#Loop Closure #ループ閉合 #SLAM #Place Recognition #Pose Graph #Bag-of-Words