パラメータ設定
$\hat{x}^- = F\hat{x},\quad P^- = P + Q$
更新ステップ
$K = P^- H^T / (HP^-H^T + R)$
$\hat{x}= \hat{x}^- + K(z - H\hat{x}^-)$
$P = (1-KH)P^-$
F=H=1(1次元等速モデル)
ノイズまみれの観測データから真の状態を推定するカルマンフィルターを可視化。プロセスノイズ Q と観測ノイズ R を調整してフィルタ特性を直感的に理解できます。
このシミュレーターでは、1次元の等速直線運動を想定しています。状態量は位置$x$のみで、時間ステップごとに一定速度で移動すると予測します。この「予測」と、実際の「観測」を組み合わせる2ステップのアルゴリズムが核心です。
予測ステップ(モデルによる先読み)$\hat{x}^-$: 予測された状態(位置), $F$: 状態遷移行列(ここでは=1), $\hat{x}$: 前ステップの推定値
$P^-$: 予測誤差共分散, $P$: 前ステップの推定誤差共分散, $Q$: プロセスノイズ共分散(モデルの不確かさ)
「今の位置から等速で進むと、次はここにいるはず」と予測し、その予測の自信($P^-$)にはモデルの不確かさ$Q$を加味する。
予測値と、実際にセンサーで観測された値に差(イノベーション)があれば、その差に「カルマンゲイン」$K$という重みを付けて予測を修正します。このゲインが、モデルとセンサーのどちらをどれだけ信じるかを決める鍵です。
更新ステップ(観測値による修正)$K$: カルマンゲイン, $H$: 観測行列(ここでは=1), $R$: 観測ノイズ共分散(センサーの誤差)
$z$: 観測値(センサーが返した値), $\hat{x}$: 更新後の最適推定値
分母$HP^-H^T + R$は、予測の不確かさと観測の不確かさの合計。$R$が大きい(センサーが信用できない)と$K$は小さくなり、観測値$z$の修正効果が小さくなる。その逆も然り。
GPSナビゲーション・位置追跡:衛星からの信号にはマルチパスや電離層の影響でノイズが含まれます。単純なGPSの位置情報は数メートル単位でブレますが、カルマンフィルターに車速センサーやジャイロの情報(プロセスモデル)を組み合わせることで、サブメートルレベルの滑らかで正確な位置推定を実現しています。
航空機・宇宙機の姿勢・軌道制御:ジャイロスコープや加速度センサーはドリフト誤差が、星センサーは瞬間的なノイズがあります。複数のセンサー情報を統合(センサーフュージョン)し、機体の運動モデルと照合しながら最適な姿勢・位置を推定。これがなければ安定した自動航行は不可能です。
ロボットの自己位置推定(SLAM):移動ロボットが、内部のオドメトリ(車輪の回転数から計算した位置)と、LiDARやカメラからの環境観測情報を融合させます。オドメトリは累積誤差が、観測は外乱を受けますが、カルマンフィルターを用いることで、地図内での自身の位置を長時間にわたり高精度に保ち続けることができます。
経済・金融データの分析:株価や為替レートなどの時系列データから、トレンドや周期性などの「状態」をノイズの中から抽出するために応用されます。観測値である市場価格の変動(R)と、経済モデルに基づく予測の不確かさ(Q)をバランスさせながら、潜在的な真の価値を推定するツールとして利用されています。
まず、「カルマンフィルターは万能の魔法ではない」ということを肝に銘じておこう。一番多い誤解は、どんなデータを放り込んでも自動的にうまくいくと思ってしまうことだ。このシミュレーターで使っている「等速直線運動モデル」は、あくまで例題。実務では、対象の物理を正しく表す「状態遷移モデル」と「観測モデル」を自分で設計する必要がある。例えば、バネマスダンパ系の振動を推定したいなら、状態量に速度や加速度を含め、運動方程式に基づいたモデルを組まなければならない。
次に、パラメータQとRの決め方。シミュレーターではスライダーで直感的に動かせるが、実問題ではどう決めるか?実は、R(観測ノイズ)は比較的決めやすい。使用するセンサーのデータシートに「誤差±何mm」と書いてあれば、そこから分散を計算できる。問題はQ(プロセスノイズ)だ。「モデルがどれだけ外れるか」を数値化するのは難しい。一つの実践的な方法は、「想定される最大のモデル誤差」を考慮して決めること。例えば、車の等速モデルで、1秒間に想定しうる最大加速度が0.3G(約3 m/s²)だとすると、その分散を参考にQを設定する。最初は大きめに設定して、後からフィルタの応答を見ながらチューニングするのがコツだ。
最後に、発散(Divergence)という落とし穴を知っておこう。これは、フィルタの推定誤差共分散行列Pが計算上で小さくなりすぎ、新しい観測値を全く信用しなくなって推定が実際の値から大きく外れ、二度と戻ってこなくなる現象だ。原因は、モデルの誤りや不当に小さなQの設定など。シミュレーターで「観測ノイズR」を極端に小さく、「プロセスノイズQ」をほぼゼロに設定して、急に真の軌道(赤線)を曲げてみると、緑の推定値が全く追従できずにズレたままになる様子を再現できる。これを防ぐため、実装ではPがある値以下にならないようにする「下限設定」などの工夫が必要になる。
カルマンフィルターの考え方は、「不確かな情報を統合して最適な判断を下す」という点で、CAEを超えて様々な工学分野の根幹を支えている。まず挙げるのは「センサーフュージョン」だ。例えば自動運転車では、カメラ、LiDAR、GPS、IMU(慣性計測装置)など、複数センサーの情報を統合して自車位置や周囲環境を認識する。ここで各センサーの特性(周波数、ノイズ、遅延)が異なるため、カルマンフィルターやその発展形が不可欠となる。
もう一つの大きな応用先は「状態監視と故障診断(Condition Monitoring & Fault Diagnosis)」。回転機械のベアリングに振動センサーを取り付け、正常時のモデルと実際の観測値をカルマンフィルターで比較する。もしフィルタの「予測残差」(観測値と予測値の差)が急に大きくなれば、それはモデル(=正常状態)から外れた、つまり異常が発生したシグナルとみなせる。これにより、故障を未然に検知する予知保全が可能になる。
さらに、「システム同定」や「パラメータ推定」にも応用される。例えば、未知のダンパ係数を持つ振動系がある時、状態量にダンパ係数そのものを加え拡張カルマンフィルター(EKF)を適用すれば、振動データからその係数をオンラインで推定することができる。これは、CAEシミュレーションのための正確な物理パラメータを実験データから求める際にも有効だ。このように、推定、制御、診断、同定という広範な工学分野で、カルマンフィルターは共通の数学的言語として機能している。
このシミュレーターで基本を体感したら、次は数学的背景を少し深堀りしよう。カルマンフィルターの導出の核心は、「予測値(事前分布)と観測値(尤度)を掛け合わせて、最も確からしい推定値(事後分布)を得る」というベイズ推定の枠組みにある。状態量と誤差がすべて正規分布(ガウス分布)に従うと仮定すると、この事後分布の平均と共分散が、あの更新ステップの式できれいに求まるんだ。この「ガウス分布×ガウス分布=ガウス分布」という性質が、計算を非常にシンプルにしている。
学習の具体的な次のステップは3つだ。まず、「拡張カルマンフィルター(EKF)」を学ぼう。これは非線形のシステム(例えば振り子の運動)を扱うための拡張版で、システムモデルを現在の推定値周りで線形化する。多くの実問題は非線形なので、EKFは必須のツールとなる。次に、状態量が増えた「多次元の問題」に挑戦しよう。例えば2次元平面を移動する物体なら、状態量は位置(x, y)と速度(vx, vy)の4次元ベクトルになり、F, H, P, Q, Rはすべて行列になる。最後に、より高度な「無香カルマンフィルター(UKF)やパーティクルフィルター」に進む。これらは強力な非線形フィルタリング手法で、EKFでは扱いにくい高度な問題を解く鍵となる。
実践力を付けるなら、シミュレーションツールから一歩進んで、プログラミング言語(PythonやMATLAB)でゼロから実装してみることを強く勧める。1次元の等速モデルから始め、次に2次元のターゲット追跡問題、そして非線形のバネや振り子のモデルへとステップアップしていけば、アルゴリズムの本質が血肉となる。その過程で、数値計算の安定性や実時間処理の課題にも直面するだろうが、それこそが「使える知識」への最短ルートだ。