IMU preintegration

IMUは100〜1000 Hzで計測値を生成するが、カメラは10〜30 Hzでキーフレームを供給する。素朴なVIOの定式化では、すべてのIMU読み取り値を推定器に投入することになり、状態変数の数が爆発的に増加してしまう。さらに悪いことに、素朴な積分は世界座標系で行われる: 積分結果は区間開始時点の絶対姿勢に依存するため、最適化器がその姿勢を調整するたびに、すべての生のIMUデータを再積分する必要が生じてしまう。

プレインテグレーション(LuptonとSukkariehが2012年に導入)はこの両方の問題を解決する。2つのキーフレーム時刻 iijj の間のIMU計測値はキーフレーム ii のローカル座標系で積分され、コンパクトな相対運動の要約を生成する:

(ΔRij,  Δvij,  Δpij)\left(\Delta\mathbf{R}_{ij},\; \Delta\mathbf{v}_{ij},\; \Delta\mathbf{p}_{ij}\right)

— 相対回転、速度変化、位置変化である。重要なのは、これらの量がIMU計測値とバイアス推定値のみに依存し、絶対姿勢には依存しないことである。これらは一度計算され保存され、ファクターグラフ内で状態 iijj を結ぶ単一の「IMU因子」として機能する。最適化器が姿勢を移動させても、再積分は不要である。

数式

計測モデル ω~t=ωt+bg+ηg\tilde{\boldsymbol{\omega}}_t = \boldsymbol{\omega}_t + \mathbf{b}^g + \boldsymbol{\eta}^g  a~t=Rt(atg)+ba+ηa\;\tilde{\mathbf{a}}_t = \mathbf{R}_t^\top(\mathbf{a}_t - \mathbf{g}) + \mathbf{b}^a + \boldsymbol{\eta}^a から出発すると、プレインテグレーションされた項は [i,j)[i, j) 内のIMUサンプル全体にわたって累積される:

ΔRij=t=ij1Exp ⁣((ω~tbig)δt)\Delta\mathbf{R}_{ij} = \prod_{t=i}^{j-1} \mathrm{Exp}\!\big((\tilde{\boldsymbol{\omega}}_t - \mathbf{b}^g_i)\,\delta t\big)

Δvij=t=ij1ΔRit(a~tbia)δt,Δpij=t=ij1[Δvitδt+12ΔRit(a~tbia)δt2]\Delta\mathbf{v}_{ij} = \sum_{t=i}^{j-1} \Delta\mathbf{R}_{it}\,(\tilde{\mathbf{a}}_t - \mathbf{b}^a_i)\,\delta t, \qquad \Delta\mathbf{p}_{ij} = \sum_{t=i}^{j-1}\Big[\Delta\mathbf{v}_{it}\,\delta t + \tfrac{1}{2}\Delta\mathbf{R}_{it}\,(\tilde{\mathbf{a}}_t - \mathbf{b}^a_i)\,\delta t^2\Big]

ここで重力は登場しないことに注意 — それは絶対姿勢が利用可能な、以下の残差においてのみ再導入される。疑似コードでは、この累積はキーフレーム区間ごとに一度実行される単純なループである:

ΔR, Δv, Δp ← I, 0, 0
for each IMU sample (ω̃, ã, δt) in [i, j):
    Δp ← Δp + Δv·δt + ½·ΔR·(ã − bᵃ)·δt²
    Δv ← Δv + ΔR·(ã − bᵃ)·δt
    ΔR ← ΔR · Exp((ω̃ − bᵍ)·δt)
    (propagate covariance and bias Jacobians alongside)

IMU残差

得られる因子は、(現在の姿勢・速度・バイアス推定値と重力からの)予測相対運動を、保存されたプレインテグレーション計測値と比較する。これは、再投影残差が予測画素と観測画素を比較する仕組みと完全に並行している:

rΔR=Log(ΔRijRiRj),rΔv=Ri(vjvigΔtij)Δvij\mathbf{r}_{\Delta R} = \mathrm{Log}\big(\Delta\mathbf{R}_{ij}^\top\,\mathbf{R}_i^\top\mathbf{R}_j\big), \qquad \mathbf{r}_{\Delta v} = \mathbf{R}_i^\top\big(\mathbf{v}_j - \mathbf{v}_i - \mathbf{g}\,\Delta t_{ij}\big) - \Delta\mathbf{v}_{ij}

rΔp=Ri(pjpiviΔtij12gΔtij2)Δpij\mathbf{r}_{\Delta p} = \mathbf{R}_i^\top\big(\mathbf{p}_j - \mathbf{p}_i - \mathbf{v}_i\,\Delta t_{ij} - \tfrac{1}{2}\mathbf{g}\,\Delta t_{ij}^2\big) - \Delta\mathbf{p}_{ij}

これは累積ループ中に伝播される共分散で重み付けされる(IMU noise modelのパラメータが入る場所である)。

実用化のための2つの改良

よくある落とし穴

SLAMにおける意義

プレインテグレーションは、最適化ベースのVIOをリアルタイムにした単一のアイデアである: それは高レートの数百の計測値を、正確に再線形化可能なままキーフレームペアごとの1つの因子に圧縮する。現代のあらゆる密結合VIOシステムはこれを基盤としており、ΔRij\Delta\mathbf{R}_{ij} がどのように形成され、バイアス補正されるかを理解することは、あらゆるVIOコードベースを理解するための最も速い道である。

関連ノート