自律走行型のロボットをNVIDIA JetBot で作ってみる【起動編】


[SENSYN ROBOTICS（センシンロボティクス） Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sensyn-robotics) の 21日目 担当の @Chitama です。

前回に引き続き、AIコンピューターを乗せた自律走行型のロボットを作ってみます。

## 自律走行型のロボットを走らせるまで

1. [必要な部品を揃える](https://qiita.com/Chitama/items/9f6cbc9d220a49b8cef9)
2. [ハードウェアを組み立てる](https://qiita.com/Chitama/private/8d4789ccc534f3e63782)
3. ソフトウェアのセットアップする <font color="Blue">← 今回はココ</font>
4. 自律走行を試してみる

# 3. ソフトウェアのセットアップする
今回の流れ。
3-1. JetBotイメージの確認
3-2. 電源の確認、JetBotの起動
3-3. wifiの設定
3-4. Webブラウザでの接続
3-5. 電源モードを調整する
3-6. Jetson 「Jetpack」の確認

出典：
[Github Jetbot Software Setup](https://github.com/NVIDIA-AI-IOT/jetbot/wiki/software-setup)
[Sparkfun 5. Software Setup Guide from NVIDIA](https://learn.sparkfun.com/tutorials/assembly-guide-for-sparkfun-jetbot-ai-kit/all#5-software-setup-guide-from-nvidia)

# セットアップに必要なもの
- microSDカード 16GB以上 UHS-I対応
- HDMIまたはDisplayPortに対応したディスプレイ
- USBキーボード
- USBマウス
- 5V-2A USB電源(及びmicroBケーブル)
- USBワイヤレスWiFiアダプタ

## Sparkfun Jetbot Kitに含まれているもの
- microSDカード 64GB UHS-I対応
- リチウムイオンバッテリーパック-10Ah（3A / 1A USBポート）
- Bluetooth USBワイヤレスWiFiアダプタ

# 3-1. JetBotイメージの確認
Sparkfun Jetbot KitのSDカードは、起動用のイメージがフォーマット済みなので、ここの手順はスキップします。
NVIDIA公式の手順のステップ2から4のみで起動できます。
そのため、SDカードをフォーマットしないように注意してください。

通常、`Jetson nano` 購入したら、公式サイトからイメージをダウンロードして起動用のmicroSDカードを作成します。
1. JetBotのSDカードイメージ [jetbot_image_v0p3p2.zip](https://drive.google.com/open?id=1GF2D814hkViwluZ5SgNKW56cQu_5Ekt5) をダウンロードします
2. [Etcher](https://www.balena.io/etcher/)を使用して、ダウンロードしたイメージをSDカードをフォーマットします。
推奨容量は、32GB以上です。何かしらのエラーが発生した場合は、64GBに上げてみてください。 
フォーマットが完了したSDカードは、USBコネクタがついてる側の反対側にある`マイクロSDカードスロット` にマイクロSDカードを下向きで差し込みます。

# 3-2. 電源の確認とJetBotの起動

1. MicroSDカードを挿入
2. HDMIケーブルを接続
3. キーボード＆マウスを接続
4. wifiアダプタを接続
5. 電源を接続

今回は、Kit付属のリチウムイオンバッテリーパックをmicro USB ソケットに接続します。
ソケットの横の緑色のランプが光れば、給電が開始され、`Jetson nano` が起動します。
起動するとNVIDIAのロゴが表示されます。


# 3-3. wifiの設定
UbuntuデスクトップGUIで設定を行います。
ユーザー`jetbot`とパスワード`jetbot`を使用してログインします。
利用したいWiFiネットワークに接続します。

接続に成功すると、今後Jetson Nanoの起動時にWiFiに自動的に接続され、PiOLEDディスプレイにIPアドレスが表示されるようになります。
また、以降は、`Jetson nano` にWeb経由で接続できるため、HDMIケーブル、キーボード＆マウスは不要になります。

UbuntuのターミナルでIPアドレスを確認しておきます。

# 3-4. Webブラウザでの接続
確認したIPアドレスで`Jetson nano` に接続してみます。

```
http://<jetbot_ip_address>:8888
```
接続に成功すると `Jupyter notebook` の `Launcher` が表示されます。


# 3-5. 電源モードやパフォーマンスを調整する
## 電源
Jetson Nanoにバッテリーパックが供給できる以上の電流が流れないようにしておきます。
そのために、次のコマンドで呼び出して `5Wモード`にします。

```
$ sudo nvpmodel -m 1
```

現在の状態は次のコマンドで確認できます。

```
$ sudo nvpmodel -q
```

`-m`の後の数字が`0`の場合、最大(Maxモード）で、`1`の場合、最小（5Wモード）です。

```
$ sudo nvpmodel -m 1
$ sudo nvpmodel -q
NVPM WARN: fan mode is not set!
NV Power Mode: 5W
1
```

```
$ sudo nvpmodel -m 0
$ sudo nvpmodel -q
NVPM WARN: fan mode is not set!
NV Power Mode: MAXN
0
```

## クロック周波数などのパフォーマンス


現在の設定は以下コマンドで確認できます。

```
$ sudo jetson_clocks --show
```

```
$ sudo jetson_clocks --show
[sudo] password for jetbot: 
SOC family:tegra210  Machine:NVIDIA Jetson Nano Developer Kit
Online CPUs: 0-1
CPU Cluster Switching: Disabled
cpu0: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=921600 CurrentFreq=921600 IdleStates: WFI=1 c7=1 
cpu1: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=921600 CurrentFreq=921600 IdleStates: WFI=1 c7=1 
cpu2: Online=0 Governor=schedutil MinFreq=102000 MaxFreq=921600 CurrentFreq=921600 IdleStates: WFI=1 c7=1 
cpu3: Online=0 Governor=schedutil MinFreq=102000 MaxFreq=921600 CurrentFreq=921600 IdleStates: WFI=1 c7=1 
GPU MinFreq=76800000 MaxFreq=614400000 CurrentFreq=153600000
EMC MinFreq=204000000 MaxFreq=1600000000 CurrentFreq=1600000000 FreqOverride=0
Fan: speed=0
NV Power Mode: 5W
```

次のコマンドで、クロック周波数などのパフォーマンスを最大化できます。
FANがついていれば、FANも最大速度で動作します。

```
$ sudo jetson_clocks
```

# 3-6. Jetson 「Jetpack」の確認
JetPackとは、Jetson向けのカーネルモジュール・CUDAや各種ライブラリ・各種開発ツール・サンプルコードがまとまったものです。
つまり、追加でインストールすることなくいろいろなAIライブラリを試せる環境になっているということです。


## CUDA
CUDAのサンプルコードは次のディレクトリににインストールされています。

```
/usr/local/cuda-10.0/samples/
```

念のためにフォルダをコピーしてから、サンプルを試してみます。

```
$ mkdir _dev
$ cp -a /usr/local/cuda-10.0/samples/ ~/_dev
```


デモ実行の流れは、

1.サンプルファイルがあるフォルダまで移動

```
$ cd _dev
```

2.ターミナルでコンパイルを実行

```
$ sudo make
```

3.２で生成されたファイルをターミナルで実行

```
$./ファイル名
```


# 次回
自律走行に挑戦です。

## 参考資料
[Getting Started with Jetson Nano (日本語)](https://www.slideshare.net/NVIDIAJapan/getting-started-with-jetson-nano)