OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ICP点対平面オドメトリアルゴリズム

この記事では、KinectFusionのような深度フュージョンパイプラインで使われるICPアルゴリズムについて説明する。

ICPの目的は、2つの点群、すなわち古い点群(3Dモデル内の既存の点と法線)と新しい点群(新しい点と法線、既存のモデルに統合したいもの)を位置合わせすることである。ICPはこれら2つの点群間の回転+並進変換を返す。

Iterative Closest Point (ICP) は、2つの点群内の対応する点同士の点と平面の距離 (Point to Plane Distance, PPD) である目的関数を最小化する:

ppd(p, q, n) とは何か?

具体的には、対応する各点 PQ について、点 P から、点 Q と点 Q に位置する法線 N によって決まる平面までの距離である。2点 PQ は、現在のカメラ姿勢の下で同じピクセルに投影される場合に対応していると見なされる。

p - 新しい点群内のi番目の点

q - 古い点群内のi番目の点

n - 古い点群内の点 q における法線

したがって、ppd(...) は(pq の差)と(n)の内積として表せる:

T(p) は点 p の剛体変換である:

ここで R は回転、t は並進である。

T はICPで求める変換であり、その目的は各点 p を点と平面の距離の観点で対応する点 q に近づけることである。

目的関数を最小化するには?

関数の最小化にはガウス・ニュートン法を用いる。

ガウス・ニュートン法では、Rt を関数Eが減少する方向、すなわちその勾配の方向に変化させながら逐次的にステップを進める:

  1. 各ステップでは、関数 E をその現在値に、ヤコビ行列に delta x(連結された delta R ベクトルと delta t ベクトル)を掛けたものを加えたものとして線形に近似する。
  2. 方程式 E_approx(delta_x) = 0 を解くことで delta Rdelta t を求める
  3. delta Rdelta t を現在のRt変換に適用し、次の反復に進む

E を線形化するには?

微小な近傍で近似してみよう。

これが Rt を変化させて最小化しようとする式である:

点と平面の距離は Rt の両方に対して線形だが、回転空間それ自体は線形ではない。これは R がその回転角からどのように生成されるかを見れば分かる:

しかし、微小回転であるため、R は次の形で近似できる:

ここで I は単位行列、A は3次元特殊直交群 so(3) の要素である。

すべての sin(t) 項と cos(t) 項を t --> 0 における極限に近づけると、次の表現が得られる:

R の近似を E の式に代入し直すと、次が得られる:

変換のシフトを近似する関数fを導入しよう:

E_approx を最小化するには?

E_approx は、その微分(すなわち引数の増加による導関数)がゼロのとき最小になる。そこでその微分を求めよう:

ppd を微分しよう:

ベクトルxの全変数x_jについて得られるのは次のとおりである:

新しい変数を置く:

f(x, p) は行列とベクトルの乗算として表せる。それを証明するには、 であることを思い出す必要がある:

G(p) は簡略化のために導入する。

であるため、 が得られる。

新しい値を置く:

置き換えを行う:

この方程式を解くことで、各ガウス・ニュートン反復の剛体変換のシフトが得られる。

変換シフトをどのように適用するか?

シフトから回転行列と並進行列を生成し、現在の姿勢行列に得られた行列を掛ける。

シフトの並進部分はそのまま結果の行列に寄与するが、回転部分の生成はもう少し巧妙である。回転シフトは指数化によって so(3) から SO(3) へ変換される。実際、3×1のrshiftベクトルは回転軸に回転角を掛けたものを表す。これからロドリゲス変換を用いて回転行列を得る。詳細については wikiページ を参照のこと。