Rust やっつけフェーズ(11)カルマンフィルタ①離散ベイズフィルタ

前回はnalgebraを使用して球面束縛カメラを作った。 今回はほかにも色々やりたいことがあるのだけど、以下のドキュメントを見出してから何も手がつかなくなった。 ひと通り読みはしたのだが、その時はわかった気になったが次の日にはもうわからない。
Pythonで書かれたサンプルコードは今まで見てきた書き方と結構違いクセが強い。
科学系のプログラムはPythonで書かれたものが多いので、参考にするため読みはするが作ったことはないからちょっと難しい書き方されると途端に見失なう。

このいろいろな無念をRustで写経を行い成仏させていこうと思う。
まずは基本となる離散ベイズフィルタから。

やっつけフェーズとは

なんとかのひとつ覚えのみで乗り切ろうをモットーに、汎用性や可用性など亡き者にして、動くものが出来ればオッケーなフェーズ。

離散ベイズフィルタ

出来上がり

デザイン

変数名の整理

変数名 意味
prior 事前分布
belief 事前確率分布、信念
pdf 信念(belief)が確率分布であることを強調した名前
posterior 事後分布、事後確率分布
predict 予測
likelihood 尤度(もっともらしさ)
prob 確率分布
offset 移動量
lh_hallway 計測値が廊下の各位置にマッチする尤度を計算

処理

  • discrete_bayes(離散ベイズ関数)

    • predict(予測)
    • lh_hallway(尤度)
    • update(確率分布の更新)
    • normalize(正規化)
    • argmax(配列の最大値のインデックス)
  • 上記の関数を利用して、以下の更新を繰返していく。

    • 事後分布 = (尤度 * 事前分布) / 正規化係数
    • 事後分布を事前分布に入れる

フィルタ結果のテキスト表示と棒グラフ表示は欲しいので以下を用意。

  • 棒グラフ表示

    • 目盛レンジ、表示位置・サイズを指定可能。
      レンジとサイズから棒グラフの幅と位置を自動判定する。
    • 目盛表示はembedded-plotsを利用。なかなかいい感じの表示をしてくれるクレート。
  • テキスト表示

    • 表示位置・サイズを指定可能。
    • 1ページ終了したら、また最上部より色を変えて行を描画。

コード

discrete_bayes
robot
robot_filter
draw-robotfilter(robot_filterのグラフ描画)
dog_filter
draw-dogfilter.rs(dog_filterのグラフ描画)
emb_bargraph(棒グラフオブジェクト)
emb_textterm(テキスト表示オブジェクト)

おまけ
wio-draw-bargraph(棒グラフテストプログラム)
m wio-draw-textterm(テキスト表示テストプログラム)

今回はこんな感じで離散ベイズフィルタが成仏した。