## パーティクルフィルタとは パーティクルフィルタ(粒子フィルタともいう)は、時間的に変化するシステムの状態を、測定に基づいて推定するためのアルゴリズムです。 各「粒子/パーティクル」はシステムの状態に関する1つの仮説を含みます。このようなパーティクルを複数個組み合わせることにより、システムの状態の推定確率分布を表すことができます。 例えば、パーティクルフィルタで物体を追跡する場合、状態は追跡された物体の位置となります。したがって、各パーティクルは(x,y)位置値の組み合わせを含みます(オブジェクトの速度など、他の変数も含む場合もあります)。すべてのパーティクルは、それぞれ異なる(x,y)の組み合わせを持ち、位置推定の分布が与えられます。 パーティクルの状態は定期的に更新されます。更新は以下の手順で行われます。 1. システムのダイナミクス(遷移モデル)に基づいてパーティクルの位置の予測 2. 新しい測定データがある場合、それに合わせるためパーティクルの状態を更新する。 - 各パーティクルに測定値とのマッチングに応じた「重み」を与える(トラッキングの場合は、通常、パーティクルが含む位置が測定した位置に近いほど、大きい重みが与えられる) - 重みに基づいてパーティクルを再サンプルする:重みが大きいパーティクルは残る確率が高く(複数個残る可能性もある)、逆に重みが小さいパーティクルは削除される確率が高くなる (人工知能の講義でパーティクルフィルタについて学んだと思います。その講義を復習しておくとよいかもしれません。) --- ## パーティクルフィルタを使ってみよう 実習の第5週で実装したBB-9の位置推定に、パーティクルフィルタを適用してみましょう。 以下のリンクからROSノードをダウンロードし、任意のパッケージ(例えば第5週目に使ったパッケージ)に入れてください。 https://www.robot.soc.i.kyoto-u.ac.jp/roboprog/materials/trackme_particle_filter.py このコードでは、パーティクルフィルタのPythonライブラリpfilter ( https://github.com/johnhw/pfilter )を使用しています。 <br> 使用するには、まずはライブラリをインストールする必要があります。以下を実行してください。 ```bash pip install pfilter ``` まず、5週目のコードを実行します (`roslaunch trackme ...`)。(`noisy`パラメータは`true`にしないことをお勧めします)。 <br> 次に、rosrunを使ってパーティクルフィルタのノードを実行してください。 ```bash rosrun <パッケージ名> trackme_particle_filter.py ``` デフォルトでは、パーティクルは物体の(x,y)位置情報のみを持ってします。 <br> `vel`というパラメータを`true`にして実行すると、パーティクルは物体の速度も含んだモデルを使用するようになります。 ```bash rosrun <パッケージ名> trackme_particle_filter.py _vel:=true ``` --- このノードは2つのトピックに配信しています。 - `/ball_particles` - すべてのパーティクルの状態 - `/ball_particles_mean` - 全パーティクルの平均状態 これらのトピックをRVizで表示してみて下さい。 RVizではパーティクルの状態と平均状態が矢印で表示されます。速度なしのモデルを使用した場合、矢印は全て同じ方向を向きます。この場合、方向は無視していいです。矢印の位置のみが大事です。 一方、速度ありのモデルを使用すると、矢印は速度の方向に表します。 --- コード内の以下の部分を変更してみて、結果にどのような影響を与えるか確認してみてください。どんな値も、高すぎても低すぎてもよくないことがわかると思います。 - 更新頻度(`rospy.Rate(15.0)`で設定されている) - 頻度が低いと、更新が少なく、トラッキングがうまくいかないかもしれません。一方、高すぎる頻度(Turtlebot3カメラのの測定頻度30Hzより高い)の場合は、パーティクルを更新するときに新しい測定がないことが多くあります。そういうときは位置の予測のみが行われます。計算コストが高くなるが、トラッキングが改善する分けではありません。センサーの測定頻度と同じにするという設定がよく使われます。 - パーティクル数(`n_particles`) - パーティクルが多いほど、より良い近似が得られるため、スムーズなトラッキングが可能になりますが、より計算量が多くなります。一方、パーティクルが少なすぎると、トラッキングがスムーズに行われません。 - 遷移モデルのノイズ(`noise_fn`のパラメータ) - ノイズが多いほどパーティクルが分散します(測定があまり正確でない場合はこちらの方が良い場合があります)。ノイズが少なすぎると、ターゲットをうまく追跡できない可能性があります。 - ウェイトモデルの広がり(`weight_fn`の`sigma`パラメータ) - `sigma`が小さいと、測定値に近いパーティクルのみに大きい重みが与えられ、他のパーティクルが削除されます。`sigma`が大きいと遠くのパーティクルも保持されます。 --- ← [課題](vextra_task.html) ↑ [ホームページ](index.html)