Donkey CarをJETSON nanoにインストールする

#はじめに
Donkey CarをRaspberryPiではなく、JETSON-nanoで動かしています。
備忘録として記録を残します。

#Donkey Car 3.1.0

安定していた3.0.2からさらにバージョンが上がりました。
ソースを比較すると色々と機能が追加されているようです。
IMUも追加したいし、学習もPCでやりたいので、バージョンアップと環境の設定を行うこととします。

#Donkey Car 3.0.2 for Windows
オートパイロットの学習をNVIDIAのグラフィックボード付きPCで行いたいので、Windows側の設定を先に行います。
pythonの環境はpipenvを使いたいところですが、condaで設定するようです。

[Install Donkeycar on Windows](https://docs.donkeycar.com/guide/host_pc/setup_windows/)

こちらを参考にインストールします。
VSCodeで開いて中身を確認。PULLして更新。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/bf944836-3ee7-3bdd-3894-7a6e204d8243.png)

VSCodeはらくちんです。
##疑問 PULLとCheckOutの違い
なんとなくつかってましたが、pullこれはどう違うん？

![キャプチャpull.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/456f55fd-414a-4247-7851-65d9a33074f3.png)

fetch(pull)ローカルリポジトリに、リモートリポジトリの変更を取り込む。

![キャプチャcheckout.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/0da4c150-715b-2b66-984b-f1ea8c8c9922.png)

checkoutは特定のファイルを指定した変更履歴の状態に戻したいとき。

それ以外にも、compare with Remote/Compare with Working Tree
というのがあります。リモートと比較したり作業中のツリーと比較したり。

##学習を実行してみる
マニュアルに沿ってインストールするだけで、Windowsへのインストールは完了しました。
NVIDIAのインストールを忘れないこと。

[NVIDIA Download drivers](https://www.nvidia.com/Download/index.aspx?lang=en-us)

![キャプチャNVIDIA.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/030d2400-7f42-f775-3714-51c5a01a9a87.png)
この時、ドライバのタイプを標準でインストールすると、エラーが出てしまいます。
DCHドライバを選びます。

(WMD は Universal Windows Driver（UWD）とも呼ばれ、同じドライバーパッケージを複数の異なるデバイスで使用することができるようになります。
ドライバーパッケージは Windows DCH ドライバーという新しい名称で提供が開始されています)

Anaconda Poershell Prompt(Miniconda3)をメニューから選んで実行。
> conda activate donkey
> python manage.py train --model ./models/mypilot.h5

これで学習がはじまりました。

![キャプチャtrain.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/b5a8f373-e81f-48f3-7db0-b8ade7904049.png)
実行すると恐ろしい速度で学習を開始。
JETSON-nanoで15分くらいかかっていた処理を、1分もかからずに完了。
コマンドラインにはCUDAライブラリのオープンに成功しているとのコメントが出ているので、グラフィックスカードを使って学習しているようです。
問題は実機で動くかどうかです。学習モデルと実機のTensorflow関係のバージョンが不一致で動かないということが多発するので安心できません。

Jetson-nanoで30分以上かかっていた学習を実行して、ストップウォッチで測ってみたところ、GTX1660Tiのマシンでは1分16秒で完了。
PCが正常に動くのなら、PCで学習したいですね。

実際に取得したデータは、DonkeyCar3.0.2で取ったデータですので、3.1.0でとったデータが使えるかどうかはこれから確認します。

#JETSON-nanoにDonkey car 3.1.0を入れる
JETSON-nanoへのDonkey carのインストールはマニュアル通りに実行して完了。
（恐ろしいほど何事もなく）
WindowsのDonkeyCar3.0.2で学習したオートパイロットを3.1.0に入れて、正常に動作することが確認できました。

では、3.1.0でデータを取って、Windowsで動くかどうかの確認をしてみます。

##デバッグ用Donkey car
IMUを追加したいところですが、半田ごてが壊れてしまった上に、いろいろ問題があり工作ができていません。
LANカードだけは入れて、USBポートを空けたのですが、購入したアンテナが間違っていました。
LANカードにソケットがはまりません。交換のために再注文して取り寄せました。

LANカードはIntel 8265NGWです。これ以外のもので安定して動くものは無いらしいです。
アンテナをつけないと、LANもBluetoothも全く動きません。
画像の下側がMHF4コネクタで、この形状じゃないと8265には取り付けられません。MHF4のものを選んで注文しましょう。
![595DC8BE-983F-494A-87CD-543A7CEDB33F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/2af674d2-70a7-e7a3-1ff7-3234372c7a01.jpeg)

そして、デバッグ用にI/Oだけ取り付けたDonkey Carのダミー。
車輪がないので暴走しない。
![D5F089CB-7D9A-4A9D-AB31-5FABDEADEC3A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/1c60f3aa-9462-4bb5-b4b8-02e153b95eaa.jpeg)

ここを参考にして、VSCodeでターミナル実行をminicondaでできるようにしました。
[Visual Studio Code のターミナルから Anaconda Prompt を開くようにする (Windows)](https://qiita.com/_meki/items/5b4f06318f1a0986c55c)



作業中


#以下は2019/7にVer3.0.2を入れたときの記録です


#いつの間にか３.０.２にバージョンアップされている

中途半端なバージョンを色々いじっているうちに、バージョンが3.0.2まで上がっていました。
JOGスティックが動かなかったのも解消して特に問題なく動いてしまいました。

学習データは取れたけど、学習が不安定で、自動運転も安定しなかったので、ちょっとメモします。

学習データをJETSON nanoで学習してみると、異常が発生しました。
どうも、driveモードで動かし、電源リセットせずにそのまま学習を呼び出すと異常が発生するようです。

以下のコマンドでJOGSTOCKが動く状態でDonkeyCar3.0.2を起動
>cd ~/mycar/
>python manage.py drive --js

操作して画像データを収集することが出来ました。

#学習ができない(解決）
その後、学習させてみるのですが、なぜかエラーが発生して、メモリが足りないという感じのエラーを出します。
リセットして他の作業を何も行わず、ターミナルで学習を呼び出すと、問題なく学習が始まります。
わからないとパニックになるので、経験しておくのは大事。

>python ~/mycar/manage.py train --tub ./data/tub_10_19-07-06 --model ./models/mypilot.h5

>python manage.py drive --model ~/mycar/models/mypilot.h5

#動画作ったり解析したりしたい

ソースを眺めるとbase.pyにそれっぽい引数があります。

```php:base.py
def parse_args(self, args):
        parser = argparse.ArgumentParser(prog='makemovie')
        parser.add_argument('--tub', help='The tub to make movie from')
        parser.add_argument('--out', default='tub_movie.mp4', help='The movie filename to create. default: tub_movie.mp4')
        parser.add_argument('--config', default='./config.py', help='location of config file to use. default: ./config.py')
        parser.add_argument('--model', default='None', help='the model to use to show control outputs')
        parser.add_argument('--type', help='the model type to load')
        parser.add_argument('--salient', action="store_true", help='should we overlay salient map showing avtivations')
        parser.add_argument('--start', type=int, default=1, help='first frame to process')
        parser.add_argument('--end', type=int, default=-1, help='last frame to process')
        parser.add_argument('--scale', type=int, default=2, help='make image frame output larger by X mult')
        parsed_args = parser.parse_args(args)
        return parsed_args, parser
```

`donkey makemovie --tub ~/mycar/data/tub_8_19-07-06 --type linear`


`donkey makemovie --tub ~/mycar/data/tub_8_19-07-06 --type linear --out other.mp4 --salient --model ./models/mypilot.h5`

```
making movie other.mp4 from 3096 images
Moviepy - Building video other.mp4.
Moviepy - Writing video other.mp4

t:  11%|██▋                      | 324/3060 [37:18<8:31:31, 11.22s/it, now=None]
````


#以下はDonkey Car 3.0.0以前を入れたときの状況のメモ。とりあえず残しておく

#Donkey Car をJetson Nanoにインストールする

※作業中なう
https://medium.com/@feicheung2016/getting-started-with-jetson-nano-and-autonomous-donkey-car-d4f25bbd1c83
上のページに沿ってインストールしています。
現状、PWMまで動きました。
動かそうとするとKERASの呼び出しでシンタックスエラーが発生しますので、なにか対策が必要です。
上のページにも何か必要そうなことが記載されているのですが、詳細がわからないので、それくらいは自分で調べて対処しなさいということなのでしょう。
そこまで作業して時間切れで外出中なので、もどったら調べます。


JETSON nanoが2個届いてしまった。
片方は現在、産総研のOpenVSRAMのコンパイルを全力でやっている。
もう片方も有効活用するべく、Donkey Carに搭載することとした。
すでに先人達が難しいことをやってくれているので、私は部品を買い集めてインストールするだけ。（と甘くみている）

Shopから購入した中華RCベースの標準機から、RaspberryPi3を取り外し、Jetson　nanoに換装する。

#必要なものを確認する

+ Jetson nano
+ Donkey carボディ
+ 5V3-4A出せるモバイルバッテリー
+ 3-4A流せるmicro usbケーブル

Jetsonは足元に転がっている。
ボディは標準機を改造する。
その他の部品もAmazonから午後には到着する予定。

![A6AA747D-6DA4-461B-9F01-2EA5309FD395.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/84093da3-a837-40b4-b297-510199127c2b.jpeg)
タミヤの1/10マシンが出来たので引退かと思いきや、今度は JETSON化。酷使されるウチのdonkey

![213BDF6E-9FA1-4363-9C12-B867169590DC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/d968efa3-b565-6cf2-74c5-962115c051c9.jpeg)
スイッチサイエンスさんに注文したのに、連休過ぎても届かなかったので、在庫の発生したマルツから取り寄せた。直後に発送される。
片方は SLAMの練習に、片方はdonkeyに。

#ソフトウェア

コメント頂きました。
「コードを見るとPCA9685アクセラレータの初期化がラズパイと同じということは、CPIOは互換でハードウェアPWMもあるようですね。あとはpigpioが動くのかどうか・・・」

ということらしいです。
Slackで動く動くと言ってるので、動くでしょ。
どちらかというと気になるのは、先ほどツイッターで流れてきた、「TensorFlowがβになったよ」の方で、Colab使って学習している私としては、また何か仕様変更が発生していないか、そっちの方が気にかかります。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">The release of the Beta for TensorFlow 2.0 is here! We&#39;ve closed over 100 issues you reported against the alpha release. Your feedback has helped us get to where we are today, please keep it coming!<br> <br>Get more info here → <a href="https://t.co/glR25MmaQE">https://t.co/glR25MmaQE</a> <a href="https://t.co/rR38iAwH3p">pic.twitter.com/rR38iAwH3p</a></p>&mdash; TensorFlow (@TensorFlow) <a href="https://twitter.com/TensorFlow/status/1137036975893037056?ref_src=twsrc%5Etfw">2019年6月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とりあえず、カメラの調子を見ながら問題なさそうなので実行します。