Donkey carをWaveshare製Jetbotで試した。

#Donkey carとは？
RCカーに小型コントローラを乗せたAIロボットカー。
https://www.donkeycar.com/
ラズパイを使うのが一般的ですが、今回はJetsonを積んだJetbotで挑戦！
いろいろ試した結果をまとめました。
#動画＜追記、速度UPしました!＞
気になっていたオーバーステアを修正し操作性がUP。教師データの高速化に伴い自動運転も50%速度が上がりました。
https://www.youtube.com/watch?v=NqYa7hOFcN0
![you.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/e1e5a05d-f0ad-4bcf-3727-f98e313a826c.png)
#車体の準備
Waveshare 製のJetbotを使いました。
![IMG_1333a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/cece30cd-ca73-06f6-73bc-18064fd29187.jpeg)
1) モータのギア比変更
低速走行時のトルクUPを狙いギア比を1:48から1:120に変更しています(4個で$13程度）。
高トルクギアは低速時でもタイヤが止まり難く制御が安定します。
モータユニット外寸は同じなので、モーター配線の「はんだ付け」のみで変更できます。
![IMG_1686.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/4c9ab89f-beaa-e4df-ce73-06109be20239.jpeg)

２）電池ケースの細工
保護回路付きの電池（長さ69mm、想定より2mm長い）が使えるよう、電池ケースの金具をペンチでつぶして隙間を広げ、電池が入るようにします。

３）カメラの移動
カメラの視野を広げるため、カメラ取付高さを倍にします。また、パイロン旋回時にもパイロンを見失わないよう、足元まで見れるようカメラを下向きにします。
下向きカメラでは「人の映り込み」等の外乱が少なくなり、Jetsonは道路に集中できます。
![cameraview.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/12791865-f7dc-a017-5fad-bed2bfba9bbe.png)
カメラの映像
![IMG_2062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/ea0aab9e-fdca-485e-bdb9-60f8bb01663d.jpeg)
カメラの視野
![IMG_2080a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/d4d46dba-57d1-3b9e-ef6f-9a56dc59d04f.jpeg)

首長になったJetbot.
#SDカード作成（Jetbotの基本機能）
初めにJetbotの準備をします。64GBのUSBに「jetbot_image_v0p4p0.zip」を書き込み、アップデート、wifi設定を行います。インストールの確認はカメラ、モーターが制御できればOKです。
https://github.com/NVIDIA-AI-IOT/jetbot/wiki/software-setup
https://www.waveshare.com/wiki/JetBot_AI_Kit
1) SD Card FormatterでSDカードのフォーマット
2) balenaEtcherでファイルの書き込み
#Donkey car プログラムを追加
Donkey carに必要なopencvなどを入れます。
作業は「DonkeyCar for Jetson Nano-Setup Jetson Nano」に従います。
所要時間は半日です。permissionなどのエラーにはsudoで対応。
https://www.waveshare.com/wiki/DonkeyCar_for_Jetson_Nano-Setup_Jetson_Nano
Step 1. Install libraries
Step 2. Setup virtual environment
Step 3. Install OpenCV。但し、numpyだけは1.17.3をインストールします。
Step 4. Install DonkeyCar Python codes, 
このステップのみこちらのサイトに従う。
http://docs.donkeycar.com/guide/robot_sbc/setup_jetson_nano/
Step 5. Create DonkeyCar
このステップはwavehareに戻ります。
#Donkey car の設定変更
inachiさんのサイトに詳しい説明がありますので、「足まわりの制御のセットアップ」に従って下記修正、設定を行います。情報ありがとうございました。
https://qiita.com/inachi/items/d9d9e5b5c91fbc0fa4b9
1) Adafruit_MotorHAT パッケージをインストール
2) donkeycar/donkeycar/parts/actuator.pyの修正
3) mycar/manage.pyの修正
4) mycar/myconfig,pyの設定

＜追記＞オーバーステアの修正
/home/jetbot/projects/donkeycar/donkeycar/parts/actuator.pyの変更。
![Actuator.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/1de759d7-c665-1f60-2f88-7ed7c8a15bc0.png)
#donkey car を手動で操作
http://docs.donkeycar.com/guide/get_driving/
「Start your car」に従います。

###1) Donkey car プログラムを起動
PCのJupyter上でTerminalから下記コマンドでDonkey carプログラムを起動。
cd ~/mycar
python manage.py drive
"ModuleNotFoundError: No module named"のエラー発生時はパスの追加で対応。
こちらのサイトにパス追加方法が詳しく説明されています。
https://qiita.com/yutoman027/items/7ee796c41575eb0511c3
###2) Donkey car を操作できるWEBサーバーに接続
Donkey carを操作できるWEBサーバーに接続、PCのGoogle Chrome上で
http://192.168.0.103:8887/ (IPはJetbotのOLEDに表示に合わせて下さい）。
![donkeyMonitor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/afb2f0c8-bd14-d6a6-2a9e-67da8d9a115b.png)
###3) PCにPS4コントローラをUSBで有線接続。
WEB上の「Control Mode」で「Gamepad」をクリック。
Mode&PiotをUser(d)選択。
これでDonkey carがPS4から操作できます。
![gamepad.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/77be86ac-fbbb-4aab-0e52-462884c8fc14.png)
![IMG_1978.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/72b48e45-d771-e110-fef9-3752f4264774.jpeg)
#Donkey car データ収集
優秀なAI自動運転には優秀なRC運転の手本が必要です。頑張りましょう。
幸いJetbotの速度が遅いので、すぐに無事故で周回できるようになります。
運転練習後、学習に必要ないデータを消しましょう。
PCのJupyterから~/mycar/data/内の不要フォルダを消去します。
学習データは「箱庭サーキット」を無事故で10周できればOKです。
#Donkey car 機械学習
Donkey carがインストールされていればPC上、jetson nano上、google colab上、何処でもトレーニング(機械学習)ができます。ここでは説明の簡単なJetsonを使った方法を説明します。
###1) mycar/myconfig,pyの修正
BATCH_SIZE=64
CACHE_IMAGES=False
###2) JupyterのTerminalで学習開始
python ~/mycar/manage.py train --model ~/mycar/models/mypilot.h5

Jetsonでは学習に1時間位かかりますが、学習後、学習データ（mypilot.h5）はJetson上に作成されるので特に操作はありません。
PCやGoogle Colabで学習するともっと短時間で処理できます。学習終了後、学習データ（mypilot.h5）をJetsonの同じフォルダにコピーしてください。

#カメラの画像データフォーマット変更
###1) 自動運転を選択エラー発生！
Mode PilotをLocal Pilotに切り替えると、エラー発生。
![localpilot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/34bc5128-4051-bef7-271e-68ec7a8cba9f.png)
![ValueError.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/7dd204be-1f41-d756-a481-3ac58366f519.png)
###2) donkeycar/donkeycar/parts/camera.pyの修正
frameのサイズの問題？camer.pyを修正してみました。
224x224の学習データだとcamera.pyは160x120で自動運転できましたが、逆に160x120で学習させるとcamera.pyは224x224で自動運転できましたので、今のところcamera.pyを切り替えて使っています。
![frame1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/39eae649-72d2-ca8b-af42-638bda9fed42.png)
![frame1a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/6f7ba204-2263-fb19-a451-7e999c150ef0.png)
#Donkey carを自動運転
###1) JupyterのTerminalからDonkey carを立ち上げます。
今回は学習データ指定付き。
python manage.py drive --model ~/mycar/models/mypilot.h5
###2) Max throttle, Mode&Pilotを選択
Max Throttle = 15%, Local Pilotを選択で自動運転開始！
![auto.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/b30e4763-539a-2c9d-0e24-9cb9d70475b4.png)

年末にJetson本とJetbotを購入。それから半年以上かかりましたが、やっとここまでたどり着きました。
いろいろな情報を共有して頂き、ありがとうございました。

ここまで読んで頂きありがとうございました！