Donkey Carの操作と管理をVSCodeで行う

#VSCodeだけでDonkeyCarを管理したい
半年くらい**Donkey Car**で遊んでいましたが、操作と管理の方法をしょっちゅう変えていました。
面倒になってきたので、ツールを固定することにしました。
選んだのは**VSCode**。
VSCodeの拡張機能を使って一元管理する方法を試してみました。

環境は以下の通り

+ **JETSON-nano**
+ モバイルディスプレイ
+ Windows10(*NVIDIA GTX1650Ti*)

方針

+ イベント会場を想定して無線LANを使わない[^1]
+ 操作と管理はPCで行う
+ 学習はPCで行い、JETSON-nanoでは学習しない [^2]
+ VSCodeの拡張機能を当てにして、他のアプリは使用しない[^3]

[^1]: *方針に反しますが、VSCodeのテストのほとんどを無線LANを用いて実施しました。有線LANで接続すると数分で切断された上に、再接続ができませんでした。後日、USB-有線LAN変換を使って再テストします。
→固定IPにすることで簡単に接続できるようになりました*

[^2]: *2019/8/3,4のMF-TokyoでのDonkeyCarトーナメントでは、データ収集走行と学習処理をすべてJETSON-nanoで行うことで、無線LANの込み合うイベント会場で驚くほどの安定度で自動運転ができました。しかし、12000を超えるデータ量の学習は30分を超えてしまうため、会場での学習を断念しました。蓄積したデータが生かしきれずにやや不完全燃焼でした。*

[^3]: *本文の随所に出てくるVSCodeの拡張機能は、VSCode上で[Shift]+[Ctrl]+X して出てくるテキストボックスに、入力して検索できます。インストールボタンで簡単に導入できます*


#1.Windows側、VSCodeでGitHubからPULLする
**GitLens**をインストールしました。
DonkeyCarを自分のリモートリポジトリにフォークし、そこからmasterをpullしました。
![無題VSCode_git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/c1b0f99e-1c04-2df1-31d5-c48995348907.png)

VSCodeのターミナルで**Anacondaのプロンプト**を動かせるようにしてから、マニュアルに沿ってインストール。
こちらの記事を参考にさせていただきました。
[Visual Studio Code のターミナルから Anaconda Prompt を開くようにする (Windows)](https://qiita.com/_meki/items/5b4f06318f1a0986c55c)

設定完了後、DonkeyCarのマニュアル通りに実行します。
[WindowsにDonkeycarをインストールする](http://docs.donkeycar.com/guide/host_pc/setup_windows/)
インストール後に、コンソールから何か動かすときは、
>conda activate donkey

を忘れずに。

#2.JETSON-nano にDonkey Carをインストールする
ターミナルで接続してから、普通にコマンドを打ちます。
私は3.0.2のインストールでドライバなどは全部入っているので、DonkeyCarだけインストール。
まっさらな状態から入れる場合は、**opencv**のインストールなどで、かなり大変ですが、頑張ってください。

``` :ドライバが全部インストール済みの場合
git clone https://github.com/autorope/donkeycar
cd donkeycar
git checkout master
pip install -e .[nano]
pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3
```

DonkeyCarアプリケーションの生成は、ディレクトリを切り替えて実施できるので、
>donkey createcar --path ~/mycar3

別のディレクトリに作って実行することにします。

#3.myconfig.pyの編集
VSCodeに**SSH FS**をインストールします。
設定を開いてHOST OptionalをIPアドレスで直接設定するか、ホスト名を入れ(.localを付けないこと）、ユーザー名とパスワードを設定して接続します。[^4]

[^4]: *有線LANで接続すると、比較的短時間で切断され、ケーブルを一度抜き差ししないと再接続できませんでした。私のPCの有線LAN固有のものかと思われます。無線LAN側では問題なく動作しています。USB-LAN変換コネクタを用意して有線LANでの実施を予定。*

![無題VSCode_fs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/4b0a5f02-fa57-61f6-ff39-497c0a3dc1c6.png)

環境を切り替えずに同じエディタ上で編集できるので楽ですね。

##4.DonkeyCarを動かしてみる
ターミナルからsshコマンドでDonkeyCarを動かしました。

>cd mycar3
>python manage.py drive --js

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/4f682f7b-e6ae-c96f-3832-e20081093f63.png)

とりあえず、動いているようです。

dataディレクトリに新しいtubディレクトリが追加され、画像ファイルが大量に書き込まれていますので、データの収集ができています。

#5.PC側にファイルを持ってくる
ZIP圧縮してPC側にコピーします。圧縮せずに大量コピーするとデータが化けてしまうことがあったので、圧縮するのが無難です。
![無題VSCode_fs_zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/2a7f7248-dcbf-a2ba-d20f-14c79ed822fa.png)

出来上がったZipファイルをコピーして、ローカル側にペーストします。
VSCodeがファイラーとしても機能するので楽にできます。
![無題VSCode_fs_cp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/0fa22fab-f79c-b90b-afad-985fa691db58.png)

PC側にペースト
![無題VSCode_fs_past.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/50a6f058-73df-c657-d4cb-d8ca1a01547a.png)

解凍します。
**Zip File Explorer**を入れておくと、右クリックメニューで解凍できます。

![無題VSCode_fs_extract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/55e60c84-263e-f19e-1514-8636f7e31679.png)

これで、PC側で学習する準備ができました。

#6.学習
VSCodeのターミナルで実行します。
>conda activate donkey
>cd mycar
>python manage.py train --model ./models/mypilot.h5

完了すると学習グラフのウィンドウが開きます。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/61ff7290-f4d3-2679-7f0e-da23dc19458f.png)

mypilot.h5ファイルができていますので、JETSON-nano側にコピーします。
前のファイルが残っていると、別名でコピーされることに注意。

![無題VSCode_fs_mypilot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/a04cc479-6d53-7b8d-d909-465c89854c7c.png)


![無題VSCode_fs_mypilot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/327b9fde-c071-a644-c298-c7ac8c001875.png)

#7.オートパイロットを実行
>python manage.py drive --model models/mypilot.h5

このコマンドでブラウザで接続して、ローカルパイロットが動きます。
無線LANが使えない環境では、Jetson-nanoの上で自分自身に接続して動かしました。

オートパイロット実行時のJETSON-nanoのCPUの負荷を見ると、コアの1つは100%、他は80%で、かなり高い負荷で動いていました。（メモリ3G使用）
しかし、毎回高負荷になるわけではなく、それ以外の時はコアはすべて20%そこそこの負荷で動いていました。（メモリは２．７G使用）

どのタイミングで発生するかはわかりませんが、調子が悪くて走らないときは、この高負荷状態に陥っていたようです。
少しでも負荷を減らすために、ブラウザ無しでオートパイロットが起動できないものでしょうか。

#8.なにができるようになったか
一連の動きをVSCodeでコントロールすることができるようになりました。
GitHub、学習用PC、DonkeyCar(JETSON-nano)のそれぞれで別の装置を使わなくても、VSCodeの操作を覚えるだけでDonkeyCarを操作できます。
VSCodeは本当に優秀ですね。