最近、彼は状態ベクトルを既存の運動モデルからナビゲーション信号を生成するための特別なデバイスに転送する問題の解決に従事しました。 次の制限がありました。
- モーションモデルは、以前に計算されたオブジェクトの座標と速度を、UDPを介して既知の形式のタイムスタンプでほぼ定期的に送信します。
- ナビゲーション信号シミュレータは、TCP接続を確立し、それを介して状態ベクトルを受信できます。これには、座標と速度に加えて、加速度とジャークが含まれます。
- 最大10 ^ 4 m / sの速度では、外乱加速度は0.001 m / s2を超えません。
- 座標は独立と見なすことができます。
- 航法信号シミュレータは未来の与えられた瞬間の状態ベクトル予報を受け取るべきです。
加速度とジャークを計算する必要があるため、対応する次数の多項式を予測に使用する必要があるという考えに至りましたが、多項式の係数を決定する問題は未解決のままでした。
数学的には正しくないが、直感的で
通常動作する自家製アルゴリズムからスプライン近似とフィルタリングまで、さまざまなオプションを検討し、カルマンフィルタリングに落ち着きました。 私の選択は、一方ではその数学的な正確さと、他方では実際にカルマンを試してみたいという長年の願望によるものでした。
この狭いターゲットのタスクを解決するためのツールとして、Pythonが選択されました。
「kalman filtering python」を検索すると、
filterpyと
pykalmanの標準的な実装があることが
わかりました 。さらに、広く普及している
numpyパッケージを使用して、Kalmanフィルタリングを簡単に実装できます。 このスクリプトは、インターネットに接続されていないWindowsマシンで動作するはずだったので、最後のオプションにとどまることにしました。
カルマンフィルタリングに関する
scipy cookbookとWikipediaの記事
に基づいて、事前定義された入力データのセットで必要な機能を実行するトライアルプログラム
を実装しました。
Pythonの3番目のバージョンのソースを以下に示します。 指定は、ウィキペディアの記事と同じです。
デバッグ中、次のレーキを踏んだ:状態ベクトルPを推定するための共分散行列の初期値をゼロに設定し、加速度とジャークの初期値が0になっている(それらは不明である、覚えている?) このエラーを修正した後、元のデータと予測されたデータが見事に一致しました。
標準のPythonプロファイラーを使用して、アルゴリズムの速度、まず第一に、偏差ベクトルSの共分散行列の逆数を推定しました。
試用プログラムのソースコード:
import numpy as np import pylab import profile
まとめ
数学を恐れないでください、時にはそれはあなたの人生を大いに単純化することができます!