AIカーを作ってみた PART2 <ソフトウェアセットアップ編>

##0. はじめに

前回はwaveshare製JetRacer Proのハードウェアセットアップ方法について記事を書きました。

https://qiita.com/CAYK/items/90142bdade651b34de03

本記事ではJetRacer Proのソフトウェアセットアップ方法についてまとめます。
基本的には、下記二つの情報をベースに話を進めていきます。

https://www.waveshare.com/wiki/JetRacer_Pro_AI_Kit

https://github.com/NVIDIA-AI-IOT/jetracer/blob/master/docs/software_setup.md

**<前提条件>**
本記事は、下記が揃っていることを前提とします。

・Jetson Nano developer Kit(B01)
・データ通信可能なMicro USBケーブル
・128GB以上の容量があるmicro SDカード


##1. OSインストール

まずは、Jetson nano以外のPCで作業を行います。

**1-1. JetRacer Pro用OSをダウンロードする**

最初にOSをダウンロードします。

https://www.waveshare.com/wiki/JetRacer_Pro_AI_Kit
こちらのStep1に記載の通り、Jetson Nano developer Kit(B01)を使用している場合、Pre-build imageが使用可能です。
ただし、60GBほど使用するので、SDカードは128GB以上のものを用意してください。
このイメージを使用することでPythonなどのダウンロードが必要なくなります。
より具体的には、上記waveshareのURLにおけるSoftware setupに関して、Step4まで実施すればOKになります。
楽できることは楽しましょう！


**1-2. SDメモリカードのフォーマット**

下記からSDメモリカードフォーマッタをダウンロードしてインストールをします。

https://www.sdcard.org/ja/downloads-2/formatter-2/sd-memory-card-formatter-for-windows-download/

その後、SDメモリカードをPCに接続し、SDカードフォーマッタを起動します。
すると、自動的にSDカードを認識してくれるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/1193bb8f-12eb-6de4-fe82-4bc1ca162b6e.png)
そうしましたら、クイックフォーマットが選択されているのを確認してフォーマットを実行します。


**1-3. Jetson nano用SDカードにOSを書き込む**

まず、OSを書き込むためのソフトとしてbalenaEtcherをインストールします。

https://www.balena.io/etcher/

その後、balenaEtcherを起動すると下記のようなGUIが表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/4a00c480-7c4b-fd8e-cd5e-38a3529d4c4b.png)

Flash from fileを押し、先ほどDLしたzipファイルを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/50a335e0-bb0a-3732-d42b-3eb4a0b3af90.png)


Select targetから書き込みたいSDカードを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/f9335861-81ff-db53-7059-678bc62ee468.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/3f2f3aad-a38a-f41d-f8fc-6263611a956f.png)

SDの容量が大きいせいか上記の表示が出てきますが、念のためターゲットを再確認し、問題がなければ書き込みを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/e767fd1f-5ec5-4b16-7f4e-fcff9a6ca098.png)


書き込みが始まると上記の画面が表示されます。
書き込みが完了したら、最後にSDカードをJetson nanoに挿入し、電源を入れましょう。
Jetson nanoの電源の投入方法としては(1) USB給電 (2)ACアダプタによる給電による2種類があります。
また、JetRacer Proはリチウム電池から電源を投入することもできます。
今回は初回セットアップですのでUSB給電を行いましょう。USBを活用することで、Wifiの設定が終わっていなくてもJetson nanoにリモートアクセスができるようになります。

##2. OSの初回起動と設定

**2-1. Jetson nanoの起動**

・Gitの説明では、Micro USBを使用することで192.168.55.1:8888にアクセスしてTerminal操作をJupyter Notebookで行うようになっています。
この操作の目的は、Jetson nanoからWifiをつなげることが出来るようにSSIDとパスワードの設定をすることです。
ただし、**注意が必要なのはケーブルによっては上記操作が行えない可能性がある事です。
Micro USBケーブルにはデータ転送できるタイプと充電専用のタイプがあります。**

https://www.hulft.com/special-column/file-transfer/file-transfer_29

例えば、下記のケーブルは充電専用です。

https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADUSB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-microusb-%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89-MPA-AMBC01BK/dp/B00DVT96RK


データ転送ができるタイプですと、PCとJetsonをつなげたときにPCにポップアップが出てくるはずです。
上記を知らないままPCから操作しようとすると、知らぬ間にデータ転送できないUSBケーブルを使用していて、余計なトラブルシューティングをして大はまりするかもしれません。

さて、実際にUSBとJetson nanoをつなぐとJetson nanoが起動するはずです。
![2021-04-18 09_46_56 PM からスキャン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/b977a3ec-b83d-4801-6e8c-60d73098e86e.jpeg)

JetRacerについている液晶パネルでは、Jetson nanoの出力に関する情報やバッテリーの電圧が表示されます。

**2-2. ブラウザからJetson nanoへアクセス**

Jetson nanoが起動したらUSBでJetson nanoと繋がっているPC上でブラウザを立ち上げてください。
ブラウザはChromeが推奨です。
ブラウザから192.168.55.1:8888に対してアクセスしましょう。
すると、下記のようなログイン画面が現れてくるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/3111023b-8027-3d49-93a5-0e1046ee13e0.png)

ここでは、パスワードとして「jetson」と入力してください。
ログインが完了すると、下記のような画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/049f64ec-f4da-0d76-03bd-040d0dc5a911.png)

**2-3. Jetson nanoにWifi接続を可能にする**

・JupyterLabのOtherのところにある、Terminalをクリックするか、File > New > Terminalを選択してTerminalを立ち上げましょう。

・jetsonが認識可能なwifiをリスト化します。

```sh
sudo nmcli device wifi list
```

・接続するSSIDとパスワードのセットをjetsonに教えます。

```sh
sudo nmcli device wifi connect <ssid_name> password <password>
```
うまく接続できれば、接続に成功した旨がTerminalNi表示されます。


・念のためwlan0にIPが割り当てられているか確認します。

```sh
ifconfig
```

・最後に、ブラウザからwlan0に割り当てられたIPアドレスを使用してJupyterLabにアクセスできるかチェックします。
アクセスできたらUSBを使わなくてもJetsonにアクセスできるようになります。
ここで一回電源を落とし、USBを外してJetRacerのスイッチを入れましょう。この時、付属のACアダプタを接続しておくとよいです。



# 3. デモの実行

**3-1. Basic Motion**
・JupyterLabから~/jetracer/notebooksにアクセスします。
・basic_motion.ipynbを開きます。
・NoteBook上の説明に従って実行していきましょう。
　この時、JetrRacerのシャーシに搭載されている赤丸のスイッチを入れておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/ff97703b-9495-38bd-a1f9-2a6331641a94.png)

すると、下記のように光るはずです。

![2021-04-18 10_56_43 PM からスキャン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/ac9b603f-89ae-8acb-1a3d-b60cd8313074.jpeg)

基本的に、Jetracerを使用する際は、このスイッチを入れた状態にしておきましょう。


ここから少しだけ、デモを実行する際のポイントを触れておきます。

```py
from jetracer.nvidia_racecar import NvidiaRacecar
car = NvidiaRacecar()
```
上記を実行すると「ピー」っという音が鳴るはずです。

```py
car.steering = 0.3
```
上記のコマンドでは初期のステアリング位置を定義します。
このタイミングでステアリングが「キュ」っと動くはずです。

最後までエラーが出ずに実行できたら完璧です。


**3-2. teleoperation**
・JupyterLabから~/jetracer/notebooksにアクセスします。
・teleoperation.ipynbを開きます。
・NoteBook上の説明に従って実行していきましょう。


ここでもいくつかポイントを取り上げてい行きます。

下記のゲームパッドを使用します。実行前に電源を入れておきましょう。
![2021-04-18 11_17_35 PM からスキャン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582812/01def906-d718-5a89-b6f8-13aa4096332e.jpeg)
また、ゲームパッドに付属しているUSBはJupyterLabを実行しているPCに繋ぎます。

下記のコードを実行すると、JupyterLab上でコントローラの動きがインタラクティブに分かるはずです。

```py
import ipywidgets.widgets as widgets
controller = widgets.Controller(index=0)  # replace with index of your controller
display(controller)
```

このとき、Gamepad TesterでINDEXの値に相違がないがチェックします。

https://gamepad-tester.com/
たまにINDEXが1だったりするので、そのときは上記コードのindex = 0という値とindex = 1に書き換えます。

また、コントローラのHOMEボタンを10秒ほど長押しすると、再度接続を確立します。
HOMEボタンを数回押すとコントロールの仕方が変わります。
コントローラ上で赤いLEDが二つ点灯する状態が推奨です。

```py
from jetracer.nvidia_racecar import NvidiaRacecar
import traitlets
car = NvidiaRacecar()
car.throttle_gain = 0.3
```

このコードを実行するとマシンから「キュ」と音がするはずです。

```py
left_link = traitlets.dlink((controller.axes[0], 'value'), (car, 'steering'), transform=lambda x: -x)
right_link = traitlets.dlink((controller.axes[5], 'value'), (car, 'throttle'), transform=lambda x: -x)
```

上記のコードが実行されると「キュ」という音がマシンから聞こえます。
そして、ついにゲームパッドでマシンを制御できるようになります。
左スティックがステア、右スティックがアクセルです。

#4 まとめ
今回はJetRacer Pro用のOSのインストールからセットアップ、二つのデモのちょっとした解説を行いました。
JetRacer Proを使用している方々や購入を検討されている方などの参考情報になれば幸いです。