Rustやっつけフェーズ(11)カルマンフィルタ⑤粒子フィルタ

次の章に進むと前章で理解したことをすっかり忘れてしまうカルマンフィルタの無念を成仏させていくシリーズ。
前回は以下のように無香料カルマンフィルタが90%成仏した。 引き続き、以下ドキュメントの粒子フィルタに関するPythonプログラムをRustで写経し成仏させていく。 今回はカルマンフィルタではないので残差からの次回状態予測はない。

粒子で作った網に引っかかった観測値の付近にある粒子を複製して網を再作成しその平均値を推測値とするように見える。
ほんでまたその網を状態変数の方向に投げるという繰返しとなっているよう見える。

著者いわく「本章は広大なトピックの表面をなでただけに過ぎない」とおっしゃっていて、粒子フィルタに関連するサイトをいくつか見ていくと
こんなのとか
「2 重モデルに基づくパーティクルフィルタを用いた不規則運動物体の追跡(PDF)」
こんなのとか
「パーティクルフィルタ 理論と特性(PDF)」

上記のお方たちの他にもいくつもいくつもあり、昔ハッブルか何かの銀河があまねくひしめいた画像を見て気が遠くなり死にたい気分になってきたことを思い出した。

今回は例題が少ないので以下の2つを追加した。
①前回のUKF回で最後に使ったロボットのシミュレータ
②以下のお方がやってるような粒子フィルタを扱ったサイトでよく出て来る例題

①ではwio-terminalとsdl2で行い、精度の違いによる差が出ることが解った。解ったからといって何かしたわけではない。そういうこともあるってことを言いたかったというか自分では何も出来なかったのだ。

また、wio-terminalの192KのRAMでは粒子3200個が限界。 sdl2ではスタックオーバーフローの壁にぶつかり70000個が限界。mainをまるっとスレッドにすればいいとの話しもあり1回試してみたが上手く行かなかったのであきらめたのだ。
(スタックオーバーフローにはならないがsdl2が表示されない)

②では参考のサイトに比べて粒子の幅が大きい気がするが、推定値がまあまあに見えるのでオッケー。

やっつけフェーズとは

来年7月は、どうせなら東京に落ちた方がいろいろあきらめもつくんじゃないかという思いを抱かせる方向に誘導されながらも、動くものが出来てそれっぽく動作すればオッケーなフェーズ。

粒子フィルタ

出来上がり

コード

以下はシミュレータ

  • sim_opening
    12.3 一般的な粒子フィルタアルゴリズム
  • sim_example_1
    12.6 SIR フィルタ 完全な例
  • sim_robot
    UKF回でのロボットシミュレータを使った例
  • sim_ffdtm
    粒子フィルタを扱ったサイトでよく出て来る例題

以下は描画プログラム
Cargo.tomlでシミュレータを切り替えて使用。

  • draw-particlefilter
    wio-terminal用粒子フィルタ描画
  • draw-particlefilter-animation
    粒子フィルタをアニメーション表示
  • draw-particlefilter-line
    粒子フィルタを線グラフ表示

    以下はsdl2用

  • draw-particlefilter-sdl2
  • draw-particlefilter-sdl2-animation
  • draw-particlefilter-sdl2-line

今回もこのようにして粒子フィルタが成仏した。
以上