Learning_RacerをWaveshare製Jetbotで試した。

![IMG_1333a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/3d6b1aa6-3ab1-88e2-007c-ffe59940fcb4.jpeg)
#Learning_Racerとは？
masato-kaさんのブログにある「深層強化学習を利用してAI RC Carの走行を学習させるソフトウェアLearning_Racer」をWaveshare社製のJetbotで試したまとめです。
こちらがmasato-kaさんのブログ。
http://masato-ka.hatenablog.com/entry/2020/04/29/153505

こちらが学習後の動画です。Jetbotは高トルクギアに交換しています。
https://www.youtube.com/watch?v=HMKXacEuFqg
![youtube.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/7f89bce2-e4eb-93a6-75e7-bb1fa8f4581a.png)
トレーニングからデモまでの流れ、合計約1時間の作業を8分のビデオにしています。
Jetbotが学習し走行距離を伸ばしていく様子が見所です。
https://www.youtube.com/watch?v=JcZf29wvSmQ
![training.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/1b98b9eb-06b0-99f2-65db-c7790525b578.png)
#＜追記＞Jetbotの改造（ギア比を1:48から1:120へ変更)
当初はハード無改造で進めていましたが再現性の低さに耐えきれずハード改造を決定。
極低速でタイヤが止まる対策で、ギア比を高トルクに変更しました。
幸い1:120のギアは4個セット（タイヤ付き）で$13で入手できました。
ギアケース外寸が同じなので、モーター配線のはんだ付けで交換できます。
高トルクギアを使うと「極低速でもタイヤが止まらない高トルク」と「低速化で距離当たりの制御回数UP」となり、箱庭サーキットのJetbotにはお勧めです。
![IMG_1686.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/844d2eb6-8dc3-ec03-6733-aa33e88e3d79.jpeg)
#Jetbotの準備
Waveshareのサイトに従い、「3. Teleoperations」まで実施。
https://www.waveshare.com/wiki/JetBot_AI_Kit
カメラ、モーターが動くことが確認できればOK。
ついでにbasic_motionで止まらない最低速度を確認します。私のJetbotでは0.06でした。
足元まで映るようカメラの取り付け金具を少し曲げておきます。
SDカードのイメージはjetbot_image_v0p4p0.zipを使いました。
#Learning_Racerのインストール
jetbot_image(v0p4p0.zip)の上にlearning_racerのソフトを入れますので、Jetbotの準備が終わってから、masato-kaさんのサイトに従いLearning_Racerをインストールします。なんと3行です！

```masatokaさんのサイト
$ cd ~/ && git clone https://github.com/masato-ka/airc-rl-agent.git
$ cd airc-rl-agent
$ sh install_jetpack.sh
```

#インストール確認
masato-kaさんのサイトからvae.torchファイルをDLしてairc-rl-agentフォルダに入れておきます。
PCからChromeでhttp://192.168.0.107:8888/lab?に接続（アドレスはJetbot上のOLEDに表示されています）。
Jupyterでairc-rl-agent/notebooks/utility/jetbot/vae_viewer.ipynbを開き、上から順番にクリック、Start main processまで進めます。ビデオ画像、トリム画像、VAE処理画像が表示されればインストールはOKです。
次にJetbotを道路に乗せてVAE処理画面を再度確認。VAE処理画像で道路がきれいに再現できれば問題ないのですが、ノイズが酷い場合は実機に合うVAEモデルの作り直しが必要です。
#VAEモデルの作成
VAEモデルの作成に必要な時間は、データ取り10分＋google Colab時間が20分ぐらいの作業です。カメラの高さや角度、道路のパターンが変わるとVAEを作り直す必要があります。

作業はmasato-kaさんのサイトに従い、PCからJupyterでairc-rl-agent/notebooks/utility/jetbot/data_collection_withoutgamepad.ipynbを開きます。”Set callback for collect the training data”までクリックして、「enable logging」を押すと連写が始まります。ボタンをもう一度押すと停止。
2千枚程度取れたら”Cleanup”、”Cleate dataset.zip file”をクリック。zipファイルが作成されますので、ファイル名を変更しGoogle Driveにコピー。
次にairc-rl-agent/notebooks/colabo/VAE_CNN.ipynbをColab上で開きVAEファイルを作ります。Google DriveのGPUが使えるので非力なPCでも問題なく学習ができます。

データ取りではタイヤ表面に紙テープを巻いて滑りやすくしアイロンをかける要領でJETBOTを道路上で滑らせデータ採取しました。Jetbotの向きを変えながら、あっという間に2000枚撮影終了です（実撮影時間は合計20秒ぐらい？）。

nanoのpowermodeをMAXNに切り替えると短時間で処理が終わります。念の為電源コードも接続しておきました。必要に応じてJETBOTにモニタとキーボードを接続すると何かと便利です。作成したvae.torchファイルをairc-rl-agentフォルダに入れておきます。
こちらはColab上のスクリーンショットです。VAE学習初期はデータ量が少ないためはっきり見えませんが、学習が進むに伴い同じデータでも画像が鮮明に見えるようになります。
![step1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/352a1348-6721-8881-0048-9e7ddfb48239.png)
![step49.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/379c8040-10c4-b9d4-008a-3f61d167c516.png)

#VAEモデルの確認
JETBOT起動後、PCからChromeでhttp://192.168.0.107:8888/lab?に接続。
Jupyterでairc-rl-agent/notebooks/utility/jetbot/vae_viewer.ipynbを開く。
Start main processまでクリックするとCreate GUIにカメラ映像とクロップ画面、VAE返還後の画像が出ますのでJETBOTをコースの上に乗せ画像を確認します。
Jetbotの位置、向きを変えてもノイズが少ないことを確認します。
実機と同じ条件で作ったvaeでノイズが抑えられます。
結局、自分の環境に合ったVAE作りが効いた様です。
確認後、カメラのリセットも兼ねJETBOTの再起動。
![vae.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/d101dc88-231d-26e6-8026-58e1ddc8c45a.png)
オリジナル映像（上）
トリム後（左下）vae処理後（右下）

#config.ymlの編集
再起動したJETBOTにPCからJupyterで再接続後、Jupyterの左のエクスプローラ風のウインドウからairc-rl-agent/config.ymlをダブルクリックし編集、保存します。
こちらは私の使った設定です。
AGENT_SETTING:
  # Agent settings
  N_COMMAND_HISTORY: 10
  MIN_STEERING: -0.06  #コースの最小回転半径
  MAX_STEERING: 0.06  #コースの最小回転半径
  MIN_THROTTLE: 0.10 #止まらない最低速度＋余裕代。
  MAX_THROTTLE: 0.12
  MAX_STEERING_DIFF: 0.2

#トレーニング
masato-kaさんのサイトに従いトレーニングをします。
処理速度を上げるためnanoのpowermodeはMAXNです。

PCからJupyterでairc-rl-agent/notebooks/user_interface_without_gamepad.ipynb
を起動後、下記の３章をクリックしておきます。
　Import module
　Show toggle button
　Start controll process

LauncherのTerminalを追加。
![Terminal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/e3de0241-c4de-189e-c231-59e3a6e8d686.png)

Jupyter画面を２分割しLauncherのTerminal上で、下記コマンドでトレーニングを起動。
![screen.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/0907b304-1c1b-7503-9160-8043048f4db2.png)
$ racer train -robot jetbot -vae ~/airc-rl-agent/vae.torch -config ~/airc-rl-agent/config.yml -device cuda -steps 200000

後は指示に従います。Terminalで”Press START”が出たら、”user_inter..."側のSTARTボタンを押すと走り出します。車両がコースアウトする直前で停止させ、車両の位置を手で戻して、もう一度走行させ、あっという間に学習してしまいます。
やっと満足のいく仕上がりになりました。

「深層強化学習」凄いですね。
masato-kaさん、貴重な情報ありがとうございました。
*******************************************************
学習中のTerminalの表示はこんな感じです。
![epi2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/772deeaf-6b77-2cec-1a6f-8d40a583a494.png)
![epi9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/7c77d777-afad-1661-2cc4-0d4007077359.png)
![epi15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/9aff520e-89ed-21a7-167a-013cf137b2a0.png)
![epi19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/2a9be7ce-fb6e-389a-6664-b467d144c33e.png)
![epi2nd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/7d4498ff-3c2e-8dc3-ea41-7f93c2e4dc1e.png)