自律走行Turtlebot：機動中に深層学習モデルを学習し自律走行までの道のり

## 目標
Turtlebot2をPS3コントローラで操作しながら学習用のデータをオンラインで集め深層学習モデルを教師あり学習でトレインし自律走行にできるROSパッケージを5日間以内（ROS Advent Calendar 2017 25日目）でできるとこまで完成することでした。

ソースコード：[turtlebot_auto_drive](https://github.com/surfertas/ros_custom_packages/tree/master/turtlebot_auto_drive)

## 結果
ROSパッケージは一応完成できましたが、ソフトウェアデザイン、学習モデルの構造、データのpreprocess/augementationなど全体のシステムデザインに関しての改善余地はいくらでもあると思います。現時点では学習しても安全に自律走行する自身はゼロとも言えるでしょう。今後は学習モデルと関係するパイプラインを改善していく予定です。アドバイスなどありましたら是非連絡ください。今回は完成したとこまでポストします。

##環境
#### マシーン
1. Raspberry Pi 3 B Model + Camera Module + Ubuntu 16.04.1MATE + ROS Kinetic
2. Turtlebot 2 (Clearpath Robotics) + Ubuntu 14.04.2 LTS + ROS Indigo
3. Lenovo PC (Master) + Ubuntu 16.04.1 LTS + ROS Kinetic

#### ライブラリ
1. Tensorflow 1.4
2. OpenCV 3.2.0
3. ROS Kinetic+Indigo



## 現時点でできる事
機動中にRaspiカメラから得た画像データをDiskに保存し画像ファイルパスとTwistコマンドで学習用のデータを整理し保存する。

ある程度のデータがたまれば（`config.yaml`で設定)学習は始まります。学習は定期的に実装され、ROSサービスを通してDiskに保存されてるデータからランダムサンプリングでBatchを作り学習モデルに入力する。

Inferenceが可能になった時点で`predict_twist`サービスが機動します。Raspiカメラから得た画像を入力しライブでTwistコマンドが`/mobile_base/commands/velocity`トピックへpublishされTurtlebotはその指示に従います。

##システムを機動する

#### 流れ
1. まずは`config.yaml`と`train_config.yaml`でファイルパスとパラメターを設定する。
2. 次に今回開発した`turtlebot_auto_drive`パッケージにある`autobot.launch`ファイルをローンチする。（もしテスティング用の`.bag`ファイルが必要でしたら`autobot.launch off_line:=true`でローンチしてください。`.bag`ファイルは`turtlebot_auto_drive/bags`に保存されます。）

3. Raspberry Piから`video_stream_opencv`のパッケージにある`webcam.launch`をローンチする。`/webcam/image_raw/compressed`にpublishされる480x640の画像が必要されます。

4. Turtlebot2をコントロールしているPCから`turtlebot_bringup`にある`minimal.launch`をローンチする。同じくTurtlebot2のPCから`turtlebot_teleop`にある`ps3_teleop.launch`をローンチする。

#### 多少の調整が必要
これで必要されるノードとサービスは機動するはずです。PS3コントローラでteleopをしますとデータがたまり、ある程のデータがたまれば学習がはじまります。その後に`service_get_prediction`を呼べる事も可能になります。現時点ではpredictionは`/mobile_base/commands/velocity/predicted`へpublishされます。Turtlebotへ直接にコマンドを流したければ`predict_twist.py`にある
`self._cmd_topic + '/predicted'`を`self._cmd_topic`に訂正する必要があります。

すべてのノードとサービスがうまく起動すればアウトプットはこんな感じ：

```
core service [/rosout] found
process[data_buffer-1]: started with pid [26166]
process[util_topic_stamper-2]: started with pid [26167]
process[model_trainer-3]: started with pid [26168]
process[predict_twist-4]: started with pid [26169]
[INFO] [1514185923.510318]: Topic stamper ready...
[INFO] [1514185923.580780]: Subscribers initialized...
[INFO] [1514185923.581317]: ApproximateTimeSync initialized...
[INFO] [1514185923.584422]: Train batch service initialized...
[INFO] [1514185923.584862]: ---------Params loaded----------
[INFO] [1514185923.585178]: Buffer path: home/catkin_ws/src/turtlebot_auto_drive/data/images
[INFO] [1514185923.585394]: Buffer threshold: 10000
[INFO] [1514185923.585582]: Image topic: /webcam/image_raw/compressed
[INFO] [1514185923.585757]: Twist command topic: /mobile_base/commands/velocity/stamped
[INFO] [1514185940.295102]: ----------Model Params------------
[INFO] [1514185940.295567]: Batch size: 32
[INFO] [1514185940.295888]: Mini batch size: 8
[INFO] [1514185940.296165]: # of Epochs: 5
[INFO] [1514185940.296442]: Checkpoint directory: /home/catkin_ws/src/turtlebot_auto_drive/data/models
[INFO] [1514185940.300038]: Service 'service_train_batch' is available...
[INFO] [1514185940.320639]: Waiting for data to populate...
[INFO] [1514185955.412366]: Train data to populated...
[INFO] [1514185955.416035]: Data received.
2017-12-25 16:12:35.470300: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
[INFO] [1514185958.060898]: Graph built...
[INFO] [1514185962.001560]: Get prediction service initialized...
[INFO] [1514185962.069614]: Service 'service_get_prediction' is available...
[INFO] [1514185962.889941]: Data iterator initialized...
[INFO] [1514186030.176313]: Epoch 0, Loss: 42.002532959
[INFO] [1514186093.322655]: Epoch 1, Loss: 9.709400177

```
## 今後やること
1. Testを書く。
2. 学習モデルを本格的に開発する。
3. 学習までのプレプロセスを真剣に考える。
4. 全体のROSデザインを再検討する。
5. などなど。。。

## お知らせ
もし深層学習/強化学習と自動運転/自律走行ロボットなどに興味ありましたら是非DIYRobocarsのMeetupへ参加してください。インターナショナルなグループで最近できたMeetupです。参加をお待ちしております。
1. [DIY Robocars Japan Meetup](https://www.meetup.com/DIY-Robocars-Japan/)
2. [DIY Robocars Japan Connpass](https://diyrobocarsjapan.connpass.com/participation/)