カルマンフィルタ
Joan Solà の論文を参考に、ドローンの自己位置推定を実装する。
Joan Solà, Quaternion kinematics for the error-state Kalman filter
東京大学 航空宇宙工学専攻 土屋研究室の方々による和訳版もある。
Joan Solá著”Quaternion kinematics for the error-state Kalman filter”の日本語翻訳の公開について | 土屋研究室 -東京大学
論文では加速度と角速度を操作量として扱っているが、本稿では状態量として扱っている点に注意されたい。
\[ \newcommand{\rot}{\mathrm{Rot}} \newcommand{\w}{\omega} \]
カルマンフィルタの基礎
- 状態方程式: \(x = Fx + Gw\), \(w \sim N(0,Q)\)
- \(x\): 状態
- \(P\): 状態の共分散行列
- \(F\): 状態遷移モデル
- \(w\): ホワイトノイズ
- \(Q\): ホワイトノイズの共分散行列
- \(G\): ノイズモデル
- 観測方程式: \(z = H x + v\), \(v \sim N(0,R)\)
- \(z\): 観測値
- \(H\): 観測行列
- \(v\): 観測ノイズ
- \(R\): 観測ノイズの共分散行列
予測
現在 \(t\) の推定値から次の時刻 \(t+1\) の推定値は、状態方程式から単純に推定される。
\[ x_{t+1|t} = F x_{t|t} \]
しかし、推定値には真値との誤差があり、推定によって誤差は増大する。
\[ P_{t+1|t} = F P_{t|t} F^T + G Q G^T \]
第一項は現在の推定値の誤差による分散で、第二項はプロセスノイズによる分散である。
直感的にわかるように、予測だけのよって状態を推定していては、分散は次々と増大する。
\[ x_{t|t} \rightarrow x_{t+1|t} \rightarrow x_{t+2|t} \]
\[ P_{t|t} \preceq P_{t+1|t} \preceq P_{t+2|t} \]
そこで、観測によって推定状態を補正する。
観測
センサ値 \(z\) が計測された。この値を基に、状態の推定値を補正する。
観測残差を求める。 \[ e_t = z_t - H x_{t|t-1} \] 観測値と、予測されていた観測値の差を表している。
観測残差の分散を求める。 \[ S_t = R + HP_{t|t-1}H^T \] 第一項はセンサのノイズに起因する分散で、第二項は予測誤差に起因する分散である。
カルマンゲインを求める。 \[ K_t = P_{t|t-1}H^TS_t \] 観測値がどの程度信頼できるかを表している。
更新
カルマンゲインを使って、状態の推定値と、推定値の分散を更新する。 \[ x_{t|t} = x_{k|k-1} + K_t e_t \] 予測値と観測値の「加重平均」をとることで、最も確からしい状態の推定値が得られる。
\[ P_{t|t} = (I-K_tH)P_{t|t-1} \]
誤差状態カルマンフィルタ
状態方程式
真の状態 \(x_t\) に対する状態方程式を \(f\) とする。
\[ \dot{x_t} = f(x_t) \]
誤差状態カルマンフィルタでは、真の状態 \(x_t\) をノミナル状態 \(x\) と誤差状態 \(\delta x\) に分解する。
\[ x_t = x \oplus \delta x \]
ここで演算子 \(\oplus\) は、状態の「自然な足し算」を表す。具体的には、位置に対しては並進(ベクトルの加算)を、姿勢に対しては回転(回転群の積)を意味する。
状態方程式も、ノミナル状態方程式と誤差状態方程式に分解する。
\[ f(x_t) = f(x \oplus \delta x)= f(x) \oplus f_e(x,\delta x) \]
ノミナル状態方程式は、真の状態方程式と同じである。
\[ \dot{x} = f(x) \]
誤差状態方程式は、ノミナル状態と真の状態の差分である。
\[ \dot{\delta x} = f_e(x,\delta x) \]
誤差状態方程式は、\(O(\delta x^2) \rightarrow 0\) とみなして線形化できる。
観測方程式
\[ z = h(x_t) = h(x \oplus \delta x) \]
誤差状態カルマンフィルタでは、観測をもとに誤差状態を補正する。
\[ H := \left. \frac{\partial h}{\partial \delta x}\right|_x \]
これは連鎖律から求めることができる。
\[ \left. \frac{\partial h}{\partial \delta x}\right|_x = \left. \frac{\partial h}{\partial x_t}\right|_x \left. \frac{\partial x_t}{\partial \delta x}\right|_x =: H_x X_{\delta x} \]
\(H_x\) は観測方程式次第、つまりセンサ次第だが、\(X_{\delta x}\) はモデルの状態ベクトルから自動的に定まる。
状態方程式
状態 | \(x\) | \(\dot{x}\) | \(\delta x\) | \(\dot{\delta x}\) |
---|---|---|---|---|
位置 | \(p\) | \(\dot{p} = v\) | \(\delta p\) | \(\dot{\delta p} = \delta v\) |
姿勢 | \(q\) | \(\dot{q} = \frac{1}{2}q \w\) | \(\delta \theta\) | \(\dot{\delta \theta} = \rot(\delta \theta) \, \rot(q) \, (\w + \delta \w)\) |
速度 | \(v\) | \(\dot{v} = \rot(q) a\) | \(\delta v\) | \(\dot{\delta v} = \rot(\delta \theta) \, \rot(q) \, (a + \delta a)\) |
加速度 | \(a\) | \(\delta a\) | ||
加速度センサバイアス | \(a_b\) | \(\delta a_b\) | ||
角速度 | \(\w\) | \(\delta \w\) | ||
角速度センサバイアス | \(\w_b\) | \(\delta \w_b\) |
ヤコビアン
観測方程式
各種センサをカルマンフィルタで使う方法
IMU
加速度の計測値 = 機体の加速度 + 重力加速度 + バイアス + ノイズ
角速度の計測値 = 機体の角速度 + バイアス + ノイズ
GPS
位置:緯度・経度・高度
速度:NED座標系での速度
姿勢:
カメラオドメトリ
速度・角速度:前のフレームから現在のフレームへの移動量を、機体座標系で出してきます