Basic Linear Algebra

線形代数はSLAMの作業言語である。点、ポーズ、残差、観測はすべてベクトルと行列であり、あらゆるソルバーは最終的に行列計算に帰着する。

ベクトルと行列

ベクトル vRn\mathbf{v} \in \mathbb{R}^nnn 個の実数からなる列である。SLAMでは、ベクトルは点、平行移動、速度、残差を表す。行列 ARm×nA \in \mathbb{R}^{m \times n}Rn\mathbb{R}^n から Rm\mathbb{R}^m への線形写像を表す。SLAMの幾何における中心的な対象は、行列とベクトルの積 Ax=bA\mathbf{x} = \mathbf{b} である。

行列式

正方行列の行列式 det(A)\det(A) は、線形写像 AA による符号付きの体積スケーリング係数を測る。重要な事実:

内積と外積

u,vR3\mathbf{u}, \mathbf{v} \in \mathbb{R}^3内積uv=uTv=uvcosθ\mathbf{u} \cdot \mathbf{v} = \mathbf{u}^T\mathbf{v} = \|\mathbf{u}\|\|\mathbf{v}\|\cos\theta であり、射影や直交性のチェックに使われる。外積 u×v\mathbf{u} \times \mathbf{v} は両方に垂直なベクトルを生成し、その大きさは uvsinθ\|\mathbf{u}\|\|\mathbf{v}\|\sin\theta である。これは基本行列(essential matrix)の歪対称行列表現や、法線ベクトルの計算に現れる。

外積は歪対称行列を用いた行列とベクトルの積として書くことができる:

u×v=[u]×v,[u]×=[0u3u2u30u1u2u10]\mathbf{u} \times \mathbf{v} = [\mathbf{u}]_\times \mathbf{v}, \qquad [\mathbf{u}]_\times = \begin{bmatrix} 0 & -u_3 & u_2 \\ u_3 & 0 & -u_1 \\ -u_2 & u_1 & 0 \end{bmatrix}

この小さな恒等式はSLAMのあらゆる場所に現れる。基本行列(essential matrix)は E=[t]×RE = [\mathbf{t}]_\times R であり、so(3)\mathfrak{so}(3) のリー代数元は歪対称行列である。

ランク、逆行列、転置

AAランクはその列空間の次元である。SLAMでは、基礎行列(fundamental matrix)は構成上ランク2であり、点群の行列はすべての点が同一平面上にある場合(SLAM初期化における縮退構成)にランク不足となる。逆行列 A1A^{-1}AA1=IAA^{-1} = I を満たし、det(A)0\det(A) \neq 0 のときに限り存在する。回転行列については R1=RTR^{-1} = R^T(直交性)が成り立ち、これは完全な逆行列の計算を避けるために常に活用される。

行列が有効な回転であることをチェックする簡単なNumPyの例:

import numpy as np

theta = np.pi / 4
R = np.array([[np.cos(theta), -np.sin(theta), 0],
              [np.sin(theta),  np.cos(theta), 0],
              [0,              0,             1]])

print(np.allclose(R.T @ R, np.eye(3)))  # True: orthogonal
print(np.linalg.det(R))                 # 1.0: proper rotation

線形システムを解く

SLAMのバックエンドは明示的に行列を逆行列化することはない。分解して解くのである:

特異値分解(SVD)

SVDはSLAMにおいて最も重要な行列分解である。任意の行列 ARm×nA \in \mathbb{R}^{m \times n} は次のように分解される:

A=UΣVTA = U \Sigma V^T

ここで UUVV は直交行列であり、Σ\Sigma は非負の特異値 σ1σ20\sigma_1 \geq \sigma_2 \geq \cdots \geq 0 を持つ対角行列である。幾何学的には、任意の線形写像は回転/反転、続いて座標ごとのスケーリング、そして再度の回転/反転として表される。SLAMにおける用途:

σ1/σn\sigma_1/\sigma_n条件数である。これは線形方程式を解く際に入力雑音がどの程度増幅されるかを測る。悪条件のシステム(巨大な条件数)は、8点アルゴリズムやDLTにおいて座標の正規化が重要である理由である。

固有値と固有ベクトル

Av=λvA\mathbf{v} = \lambda\mathbf{v} を満たす非零ベクトル v\mathbf{v} とスカラー λ\lambda は、AA固有ベクトル固有値である。ハリスコーナー検出器は、構造テンソルの固有値から画像パッチを分類し、点群のPCAは共分散行列の固有ベクトルを用いて主方向(例えば平面のフィッティング)を求める。対称行列(共分散、構造テンソル、JTJJ^TJ)については、固有値は実数であり固有ベクトルは直交する — そして固有値分解はSVDと一致する。

よくある落とし穴

SLAMにおける意義

SLAMパイプラインのあらゆる段階は、変装した線形代数である。点の投影には行列積が使われ、最小限のソルバー(8点法、DLT、ICP)はSVDに帰着し、バンドル調整の正規方程式は大きな疎な線形システムである。ここでの習熟度 — 特にSVD、直交行列、ランクに関するもの — が、SLAMの論文を読み、幾何コードをデバッグする力を与えてくれる。

関連ノート