【書評】詳細 確率ロボティクス
上田先生の「詳細確率ロボティクス」を読んだので感想を書く。
強化学習のところはまだだけど。
詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装 (KS理工学専門書)
- 作者:上田 隆一
- 発売日: 2019/10/27
- メディア: 単行本
書籍の概要と感想
非常に分かりやすかった。これに尽きる。
コロナの影響もあってか、講義動画まで見られる!!
自習が捗る!!!
特に自己位置推定とSLAMについて学びたく本書を読んだので、めちゃくちゃ勉強になった。ここら辺の数式周りはよく理解できてないところからある程度納得できる状態になった。さらに、Jupyter Notebookによる実装があるので、相互補完的に理解が深まった。
実際にJupyter Notebookで一つ一つやっていけば教科書の内容を学んでいけるので非常に良い。
私は、Colabでやりたいので、若干アニメーション細かいところを修正。Worldのdrawに返り値を設定してあげて、
class World: def __init__(self, time_span, time_interval, debug=False): self.objects = [] self.debug = debug self.time_span = time_span self.time_interval = time_interval def append(self,obj): self.objects.append(obj) def draw(self): fig = plt.figure(figsize=(4,4)) ax = fig.add_subplot(111) ax.set_aspect('equal') ax.set_xlim(-5,5) ax.set_ylim(-5,5) ax.set_xlabel("X",fontsize=10) ax.set_ylabel("Y",fontsize=10) elems = [] if self.debug: for i in range(int(self.time_span/self.time_interval)): self.one_step(i, elems, ax) else: self.ani = anm.FuncAnimation(fig, self.one_step, fargs=(elems, ax), frames=int(self.time_span/self.time_interval)+1, interval=int(self.time_interval*1000), repeat=False) plt.show() # ここをreturnで返す return self.ani def one_step(self, i, elems, ax): while elems: elems.pop().remove() time_str = "t = %.2f[s]" % (self.time_interval*i) elems.append(ax.text(-4.4, 4.5, time_str, fontsize=10)) for obj in self.objects: obj.draw(ax, elems) if hasattr(obj, "one_step"): obj.one_step(self.time_interval)
from matplotlib import rc from IPython.display import HTML rc('animation', html='jshtml')
としてから、
world.draw()
とすればOK
各章については詳細は省くが数式もきちんと書いてあるしなぜそう考えられるのかがよくわかる様に書かれているのである程度ベイズの考え方や複数パラメーターある場合の確率の考え方がわかれば読み進められる。 シミュレーターの実装もわかりやすいし、改変もしやすそう。今後他の描画ツールでシミュレーター作って可視化していく予定なのでめちゃ参考になった。
書籍の章立てとJupyter Notebookの関係
書籍にそってやるなら、こっちを使ったほうがいいとは思う。
最初、章ごとになっていないので若干戸惑った。 その章の最終的なものはここに挙げたnotebook
- 3章
- section_robot
- ideal_robot11.ipynb
- section_robot
- 4章
- section_uncertainty
- noise_simulation11.ipynb
- section_uncertainty
- 5章
- section_particle_filter
- mcl14.ipynb
- section_particle_filter
- 6章
- section_kalman_filter
- kf4.ipynb
- section_kalman_filter
- 7章
- section_advanced_localization
- occlusion_free_mcl.ipynb
- section_advanced_localization
- 8章
- section_fastslam
- fastslam5.ipynb
- section_fastslam
Colabアニメーション設定
Colabで確率ロボティクスをやる時にanimationする場合はWorldに返り値を設定してあげて、その返り値をiPython.display.HTMLをimportしてあげるとできるね。 pic.twitter.com/YYxouTMGcD
— くろたんく@激しく多忙 (@black_tank_top) 2020年11月4日
MCL
パーティクルフィルターの話。この手の話の基本だがちゃんと理解できてなかったところを丁寧に実装されたコードで実感できた。
ランドマークを発見すると、センサー値を信念分布に反映できて、一気にパーティクルのばらつきが減ってるのがわかる pic.twitter.com/vx9cxlfgiH
— くろたんく@激しく多忙 (@black_tank_top) 2020年11月4日
Kalman Filter
カルマンフィルター。
— くろたんく@激しく多忙 (@black_tank_top) 2020年11月5日
ランドマークによって信念分布が更新されているのがわかる。
・ランドマークを見つけられないものは信念分布が広がり続ける
・最初からランドマークを見つけられているものは信念分布がほぼ広がらない
・途中からランドマークを見つけられているものは信念分布が小さくなる pic.twitter.com/x3v7jqapRG
KLDサンプリング(occlusion)
MLCのKLDサンプリング
— くろたんく@激しく多忙 (@black_tank_top) 2020年11月5日
occlusionが一定確率起きる状況で、
上:ランドマークまでの距離に応じてガウス分布と一様分布を使い分けると、particleがきちんと遷移して、推定できている(ランドマークに少し偏るが)
下:ガウス分布の尤度関数を使うと、particleがほとんど移動せず推定がうまくいかない。 pic.twitter.com/3WH1pXAttb
FastSLAM
FastSLAMとFastSLAM2
— くろたんく@激しく多忙 (@black_tank_top) 2020年11月5日
分布が広がりやすい状況だと、確かに差があるようにも感じる。定性的 pic.twitter.com/ILZ0RaoHj8
終わりに
今回の書籍も、さすがと言わんばかりの分かりやすさ。Jupyter Notebookをここまで細かく用意してくれるっていうのは普通では考えられないので、こんな先生に教わることができる学生は羨ましいなと思う。学生時代にこんな講義受けていたらよかったのになと思った。
詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装 (KS理工学専門書)
- 作者:上田 隆一
- 発売日: 2019/10/27
- メディア: 単行本
参考になる書籍
上田先生が、翻訳された確率ロボティクスの超有名書籍。
こちらもおすすめだが、詳細 確率ロボティクスを読んでからだとより良いと思う。
- 作者:Sebastian Thrun,Wolfram Burgard,Dieter Fox
- 発売日: 2016/09/21
- メディア: 単行本
またロボットのプログラミングでROSを使うことがあるが、こちらも上田先生の書籍で分かりやすい。
ロボティクスとは関係ないが、上田先生の書籍つながりで、シェルスクリプトを学びつつ、CMSまで作れてしまうっていう素晴らしい書籍で、私も実際に1年ほど運用していた。
以前書いた書籍紹介
お願い(欲しい書籍リスト)
ずうずうしいのですが、基本自分の学習メモのためですが、サポーター募集です。ポチッとしてくれると嬉しいです。
https://www.amazon.jp/hz/wishlist/ls/2EDNNTYRW2BJE?ref_=wl_share
もしくは、コード等を実行できるタイプの書籍であれば、実際に実行して試すことなどしてレビューなど書くので、献本していただけたらものすごく喜びます(お問い合わせ or TwitterのDMからお問い合わせ下さい。)