Lie groups
カメラの姿勢は SE(3) に、回転は SO(3) に存在する——これらは**多様体(manifold)**であり、ベクトル空間ではない。2つの回転行列を足し合わせても回転にはならないため、標準的な「更新 x←x+Δx」という最適化は直接適用できない。リー理論(Lie theory)はこのギャップを橋渡しする。各リー群(回転/姿勢の曲がった空間)には、対応するリー代数(Lie algebra)(単位元における群の接空間である平坦なベクトル空間)があり、指数写像と対数写像によって結び付けられる。オプティマイザは平坦な代数の中で作業し、更新を群の上に写し戻す。
so(3)とSO(3)。 リー代数 so(3) は 3×3 の反対称行列 [ϕ]× から構成され、ベクトル ϕ∈R3(軸×角度)によってパラメータ化される。指数写像はロドリゲスの回転公式である。
R=exp([ϕ]×)=I+∥ϕ∥sin∥ϕ∥[ϕ]×+∥ϕ∥21−cos∥ϕ∥[ϕ]×2
対数写像 log:SO(3)→so(3) はその逆写像であり、回転行列から回転ベクトルを復元する。
se(3)とSE(3)。 剛体姿勢について、se(3) の元は ξ=[ρT,ϕT]T∈R6(並進部分 ρ、回転部分 ϕ)によってパラメータ化される。
ξ^=[[ϕ]×0Tρ0],T=exp(ξ^)=[exp([ϕ]×)0TJρ1]
ここで J は SO(3) の**左ヤコビ行列(left Jacobian)**である。
J=I+∥ϕ∥21−cos∥ϕ∥[ϕ]×+∥ϕ∥3∥ϕ∥−sin∥ϕ∥[ϕ]×2
このパラメータ化が優れている理由。 姿勢は正確に6自由度を持ち、ξ∈R6 は局所更新のための最小で特異点管理されたパラメータ化である。維持すべき制約がなく(3×4 行列や単位クォータニオンとは異なり)、ジンバルロックも起きない(特異点を持つオイラー角とは異なり)。SLAM最適化では、各反復で代数における小さな更新 ξ を解き、それを群に対する**摂動(perturbation)**として適用する。
T←T⋅exp(ξ^)(右摂動)またはT←exp(ξ^)⋅T(左摂動)
残差(例えば再投影誤差)のヤコビ行列は ξ に関して導出され、ξ=0 で評価される。
摂動ヤコビ行列の実例
この計算全体は1つの操作に帰着する。exp を一次まで展開し exp([δϕ]×)≈I+[δϕ]× とし、[a]×b=−[b]×a を用いる。左摂動下での回転点 Rp について、
exp([δϕ]×)Rp≈(I+[δϕ]×)Rp=Rp+[δϕ]×Rp=Rp−[Rp]×δϕ
したがって ∂(Rp)/∂δϕ=−[Rp]× となる。右摂動版も同じ2行の手順で導出でき、−R[p]× を与える。これを投影のヤコビ行列 ∂π/∂p と連鎖させれば、すべてのバンドル調整実装が使う再投影誤差のヤコビ行列を——行列微分の表を一切参照せずに——導出したことになる。
コードで見る
Sophusは、この仕組み(Eigenベース)のスタンドアロンC++実装であり、そのAPIは数式と一対一に対応する。
#include <sophus/se3.hpp>
Eigen::Matrix<double, 6, 1> xi = ...; // twist in se(3)
Sophus::SE3d T = Sophus::SE3d::exp(xi); // exp map: algebra -> group
Eigen::Matrix<double, 6, 1> back = T.log();// log map: group -> algebra
T = T * Sophus::SE3d::exp(delta); // right-perturbation update step
同じパターンはすべてのSLAMライブラリに組み込まれている。g2oの SE3 頂点、Ceresのmanifold(局所パラメータ化)、GTSAMの Pose3 である。この仕組みは Sim(3)(姿勢+スケール)にも拡張され、単眼SLAMは軌道に沿ってスケールがドリフトするため、これをループクロージングに用いる。
よくある落とし穴
- 小角度の数値計算: exp、log、J における sinθ/θ 型の係数は θ=0 で 0/0 となる。実装はゼロ付近でテイラー展開に切り替える必要がある(ライブラリはこれを行っている——自作の実装でも同様に行うべきである)。
- π 付近でのlog: ほぼ180°の回転から軸を復元することは条件が悪い。大きな回転を平均化・補間する際には注意が必要である。
- 左右の慣習: 論文やライブラリは左右の摂動を自由に混在させる。ヤコビ行列は異なり(実例を参照)、慣習を暗黙に混在させることは「オプティマイザがゴミに収束する」バグの典型的な原因である。
- クォータニオンの二重被覆: q と −q は同じ回転を符号化する。残差や補間はこの符号を処理しなければならず、そうしなければ 2π 付近で誤差が現れる。
- ソルバーで多様体を忘れること: 局所パラメータ化なしに生の4パラメータクォータニオンや9パラメータ回転行列をオプティマイザに与えると、更新が多様体から外れてしまう。Ceresのmanifold API、g2oの頂点実装、GTSAMの型はまさにこれを防ぐために存在する。
SLAMにおける意義
最適化ベースのSLAMコンポーネント——バンドル調整、ポーズグラフ最適化、IMUプリインテグレーション、直接画像位置合わせ——はすべて、姿勢に関して残差を微分する。リー群の仕組みは、それを正しく行う方法である。姿勢間の残差自体も log を介して表現される(ポーズグラフコスト ∥log(Tij−1Ti−1Tj)∥2 のように)。exp/log/摂動の記法を流暢に読めなければバックエンドの論文は読めない。一度読めるようになれば、それらはすべて心地よく似通って見える。
ハンズオン
関連ノート