カルマンフィルタを避けてきた社会人プログラマが自動運転の勉強を始める際の最短経路

##はじめに
　この記事は以下の超人気記事をインスパイアしています。
[数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路
](https://qiita.com/daxanya1/items/218f2e3b922142550ef9)

　巷ではAIとか自動運転とか急に盛り上がりだして、SLAMいっちょやってみるかー、と手をだしたものの全く中身がわからず（カルマンフィルタの数式みても脳みそが詰む）、そうか僕には自動運転向いてなかったんだ、と白い目でプリウスを眺めている人がいたら、ちょっとこの記事を最後まで見るといいことが書いてあるかもしれません。
　（なお、この記事にDeep Learningは含みません。）

##対象
カルマンフィルタ/SLAMを勉強してみたいけど、勉強の仕方がわからないプログラマ
そろそろ上司やらお客様から「自動運転の時代がくるよ？」とか言われそうな人
ROSをインストールしてTurtleBotとかGazebo動かしてみたけど、次なにすればいいかわからない人

##この記事で行うこと
自動運転には鉄板の、書籍[「確率ロボティクス」](https://book.mynavi.jp/ec/products/detail/id=37337)/[「Probabilistic Robotics」](http://www.probabilistic-robotics.org/)紹介
自動運転には鉄板の、オンライン講座（Udacity）の機械学習コース紹介
[「Artificial Intelligence for Robotics」](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373)

##環境
講座はWindows・Mac・LinuxどれでもOK。(ブラウザがあれば受講することができます。)

##初心者の自動運転の学習の流れ
「全然、SLAMとか勉強したことなくて、ちらっと自動運転のソフトウェアのソースとか論文読もうとしたら、全くわからないんですけど、どこから手をつけたらいいですか？」というプログラマからの質問に対して、お勧めの回答は以下になると思われます。（自分の実体験を存分に含んでいます）

1. Udacityというオンライン講座の会員になって、セバスチャン・スラン先生の[「Artificial Intelligence for Robotics」](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373)コースを受講する（無料です）。
2. [「確率ロボティクス」](https://book.mynavi.jp/ec/products/detail/id=37337)もしくは原著の[「Probabilistic Robotics」](http://www.probabilistic-robotics.org/)という書籍を購入して、上の講座と関係あるページを読んでみる(有料です)。

では詳しく見ていきましょう。

##講師紹介
　セバスチャン・スラン先生は、2004年のDARPAグランド・チャレンジを優勝した、スタンフォード大学の無人自動車、スタンレーの開発を率いた人物です。その後、グーグルの副総裁・フェローに就任し、「GoogleX」を創立、Googleの自動運転自動車の開発を支援していました。
　2012年には「Udacity」を創業し、「Udacity」の講座の一つとして、自動運転の入門講座「Artificial Intelligence for Robotics」を開設しています。自動運転には鉄板の書籍「Probabilistic Robotics」の著者の一人でもあります。
　ぜひ、下記のTEDの動画を見られることをお勧めします。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/cd5ze-u2XZw/0.jpg)](http://www.youtube.com/watch?v=cd5ze-u2XZw)
セバスチャン・スラン「Googleの自動運転車で目指していること」


##「Artificial Intelligence for Robotics」コースを受講する
機械学習初心者にまずお勧めなのが、今から紹介するオンライン講座になります。

お勧めできる点として、いいところを並べてみます。

 - ごく一部でSLAM神と崇められているセバスチャン・スランの講座を無料で受講することができます。
 - Google Carを作るために必要な知識と考え方を、丁寧に解説してくれます。
 - この講座は英語の講座になりますが、字幕に日本語を選択することができますので、英語が苦手な人でも進めていくことができます。
 - 動画だけではなくて、試験があります。実際にpythonでプログラミングして結果を提出する必要もあります。自分が理解できているかどうかがわかりやすいです。pythonはブラウザ上で実行できるので、PCにpython環境がなくても問題ありません。
 - 期限が無く、自分のペースで学習を進めることが出来ます。
 - 動画がスマホでも見られるので、電車の中で学習進めたりもできます

いいところがたくさんあるのですが、オンライン講座の特徴としてどうしてもコントロールできない部分があります。

 - 途中で挫折しやすい。

　この講座はわかりやすいのですが、修了するまでにとても時間がかかるので、「鉄の意志」もしくは「ロボットへの愛」が必要です。参考書として、「確率ロボティクス」をあわせて読むと理解が進むと思います。
　場合によっては、パートナーに人工知能がいればその方と、いない方は友達や同僚と一緒に学ぶといいかもしれません。

　ここでは後押しのために、何が学べるのか、具体的な内容を少しご紹介します。


##「Artificial Intelligence for Robotics」コースの内容
[「Artificial Intelligence for Robotics」](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373)
###Introduction
　ぜひ、下記のIntroductionの動画を見られることをお勧めします。自動運転自動車のGoogleCarを作れるようになることが講座の目的です。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Uqt_pRbR8rI/0.jpg)](http://www.youtube.com/watch?v=Uqt_pRbR8rI)

###Lesson 1: Localization(自己位置推定)
![Screenshot 2017-10-09 11:30:39.png](https://qiita-image-store.s3.amazonaws.com/0/73020/2d486a96-7411-7211-398c-9f7759f01b64.png)
　講義はyoutube動画とのリンクが貼られています。youtubeの設定で、字幕やスピードを設定してください。

　最初は、ベイズ推定のお話から始まります。章の後ろのほうでは、ヒストグラムフィルタの説明をして貰えます。
　動画を見て、途中で入ってくるクイズに答えると次に進めます。ここの時点では、特に止まるところはなく、進めていけると思います。

![test2.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/698d70b1-3549-b36e-5f3f-43672b3b8a10.jpeg)

　また、簡単なpythonでのプログラミングの仕方の説明があります。
　この講座の最後には、pythonでのプログラミングの宿題が出題されていきます。

###Lesson 2: Kalman Filters(カルマンフィルタ)
　早くも、この講座最大の山場が訪れます。カルマンフィルタは、SLAMの初歩にして、SLAMの真髄なのか、ということがわかります。
　進みにくくなったら、前の動画を見直すか、確率ロボティクスを見たりして、じっくり理解を進めて行ってください。
　
###Lesson 3: Particle Filters（パーティクルフィルタ）
　SLAMにて、カルマンフィルタと双璧を成す、パーティクルフィルタの章になります。
　状態方程式を設計して、パーティクルフィルタで位置推定する方法を習得することができます。
　ここのクイズでは、pythonで仮想的なロボットをプログラミングにて動かすことができます。

###Lesson 4: Search(経路探索)
　少し毛色が変わって、経路探索のアルゴリズムA*の講義になります。
　DARPAグランド・チャレンジの自動車シミュレータを使った説明は一見の価値ありと思います。

###Lesson 5: PID Control(PID制御)
　A*で算出した経路の平滑化と、自動車のステアリングのPID制御の講義になります。
　実際に経路探索の結果に従って、ロボットをフィードバック制御する場合、ロボットは急峻な動きを指示してもついていけないため、安定的に制御するには、あらかじめ経路を平滑化したり、フィードバック制御に積分要素を含んだPID制御を設計する必要があります。

###Lesson 6: SLAM (Simultaneous Localization and Mapping)
　最後の山場になります。主にGraphSLAMを学ぶ講座になります。
　まず、最初にいままでの講座の復習があります。

###Practice
　最後に、逃げ出すロボットを追いかけるプログラミングをしてみましょう。


## 受講が終わった。次は何しよう。
　ロボットを作って、どんどん、手を動かしていきましょう。この講座を完璧に習得できたのであれば、自動運転車を作ることが難しいことではないと認識できるのではないでしょうか。

　また、ROSという開発ツールの使い方を覚えると、日々新しいSLAMのソースコードがROS上で動くパッケージとして、github上で公開されていますので、学習するには事欠かないと思います。
　現状、プレイヤーが世界的に大幅増加中・ヒートアップ中の分野ですので、ぜひ活躍の場を広げて行ってください。