2019年3月にサンノゼで行われたGTC2019にて、エッジAI製品「Jetson Nano」(参考記事)が発表されました。丁度同僚がGTC2019に参加しており現地で購入してきたので、早速試してみました。既存のJetsonシリーズ「Jetson TX2」や「Jetson AGX Xavier」と比べて小型で低価格でセットアップも簡略化されているので、とりあえず触ってみる目的にも良いと感じました。
本連載では「Jetson Nano」を使ったAI自律走行車「JetBot」(公式Wiki)について紹介します。第1回では部品の調達から衝突回避走行デモの実行、車体や周辺環境に合わせたモデルの作成までの流れを紹介します。また第2回ではハードウェアのセットアップについて詳しい解説をしていく予定です。
Jetson Nanoを買い求める参加者

Jetson Nano本体

JetBotを走らせるまで
以下の順に説明します。
- 必要な部品一覧
 - ハードウェアのセットアップ
 - ソフトウェアのセットアップ
 - 衝突回避走行デモの実行
 - 車体と周辺環境に合わせたモデルの作成
 
1. 必要な部品一覧
基本は公式Wikiの部品リストで指定されているものを購入します。しかし日本国内で流通していない部品が一部存在するため、その場合はなるべく仕様が近く、かつ日本国内で購入できる部品を選定しました。今回JetBotを作るに当たって購入した部品一覧は以下の通りとなります。(価格は2019年4月24日時点のものです)
- 下記部品一覧は以下の記事で公開されているものを参考にしています。
 
公式Wikiの部品リスト:https://github.com/NVIDIA-AI-IOT/jetbot/wiki/bill-of-materials
国内で調達可能な部品リスト: https://qiita.com/lekto/items/39d7de950ce1083a1774
| 部品名 | 商品名 | URL | 価格(¥) | 個数 | 公式仕様 | 
|---|---|---|---|---|---|
| Camera | Raspberry Pi Camera Module V2 | Amazonで買う | 2,799 | 1 | ✔ | 
| Camera lens attachment | Raspberry Pi Camera Module V2用160度FoVレンズ | Amazonで買う | 3,800 | 1 | ✔ | 
| Motor、Wheels | HiLetgo 2個セット(プラスチックタイヤホイール、DC 3-6Vギアモーター) | Amazonで買う | 760 | 1 | |
| Motor Driver | DC MOTOR + STEPPER FEATHERWING A | マルツで買う | 2,615 | 1 | ✔ | 
| Micro SD card | Transcend マイクロSDカード 128GB | Amazonで買う | 2,780 | 1 | |
| USB cable pack | Rerii 右向き両端L型 マイクロUSBケーブル | Amazonで買う | 799 | 1 | ✔ | 
| USB cable pack | Rerii 左向き両端L型 マイクロUSBケーブル | Amazonで買う | 799 | 1 | ✔ | 
| Battery | INIU モバイルバッテリー 10000mAh  | 
Amazonで買う  | 
1,999  | 
1 | |
| Caster ball | 樹脂ボール(ジュラコン)(インチサイズ) | 359 | 1 | ✔ | |
| PiOLED display | ADAFRUIT PIOLED - 128X32 MONOCHR | マルツで買う | 1,959 | 1 | ✔ | 
| PiOLED header | uxcell ピンヘッダー(2.54mmピッチ、2x20、40ピン ライトアングル) | Amazonで買う | 839 | 1 | ✔ | 
| WiFi Dongle | BUFFALO WLI-UC-GNM2S | Amazonで買う | 1,144 | 1 | |
| 合計金額 | 24,152 | 
※追記(2019/05/20):公式Wikiで推奨されているバッテリーが国内でも購入できるようになっていますので、今後購入される方はそちらを購入したほうが良いです。
また、下記の部品は公式のGithubで公開されているモデルデータを使って、3Dプリンタで出力します。ちなみに購入したホイールの径が65mmのため、モデルデータも65mm用のものを使用しています。
| 部品名 | URL | 個数 | 
|---|---|---|
| Chassis | chassis.stl | 1 | 
| Camera Mount | camera_mount.stl | 1 | 
| Caster base | caster_base_65mm.stl | 1 | 
| Caster shroud | caster_shroud_65mm.stl | 1 | 
- 3Dプリンタで出力した部品群

 
2. ハードウェアのセットアップ
公式WikiのHardware Setupに従えば、基本的に問題ありません。セットアップ工程の詳細については第2回の記事で解説します。
組み立て部品全体

JetBot完成図

3. ソフトウェアのセットアップ
公式WikiのSoftware Setupに従って、Jetson Nanoをセットアップしてください。
セットアップの注意点
JetBotのOSイメージは通常版が64GBを超えているため128GB以上のmicroSDカードが必要になります。(64GBのmicroSDカードでも収まる63GBの縮小版イメージもありますが、後述の教師データの収集等を考えると、大きなサイズのmicroSDカードを準備することをお勧めします)
4. 衝突回避走行デモの実行
ハードウェアとソフトウェアのセットアップが完了したので、次はhttps://<jetbot_ip_address>:8888のアドレスから作成したJetBotへアクセスし、JetBotの衝突回避走行のデモを実行していきます。デモの実行手順は公式WikiのExamples内で「Example 3 - Collision avoidance」の節に記述されています。
4.1. 学習済みモデルのダウンロード
「Example 3 - Collision avoidance」の節はStep1の教師データ収集から始まりますが、ここでは公開されている学習済みのモデルを利用し、Step3の走行デモを実行します。
- 下図で示すリンクから学習済みモデルをダウンロード

 
4.2. デモの実行
衝突回避走行デモのスクリプトを開き、順にコードを実行していきます

5ブロック目のコードまで実行するとJetBotに搭載したカメラの動作確認ができます

8ブロック目の
camera.observe(update, names='value')まで実行すると衝突回避走行のデモが動作します。走行を終了する場合は9ブロック目のcamera.unobserve(update, names='value')とrobot.stop()を実行します
実際の走行デモが下の動画になります。動作はしましたが配置した障害物にぶつかったり、机上から落下しそうになっています。
これは下記のような問題から、公開されている学習済みモデルを活かせていないためです。
- ホイールが公式仕様より厚みがあり、カーブの挙動が異なる
 - ホイールのタイヤ部分が車体の重さで歪み、直進時に左によれる
 - バッテリーが公式仕様より大きく、車体の重心が異なる
 
5. 車体と周辺環境に合わせたモデルの作成
次は現在の車体と周辺環境でも障害物を避け、机上から落ちないように学習を行ったモデルを作成します。
教師データについて
作成したJetBot上で教師データを収集します。衝突回避走行モデルはJetBotに搭載したカメラから取得した画像を下記のように2クラスに分類し、クラスごとに車体の動きを制御します。- 衝突回避走行モデルの分類クラス
 
クラス名 車体の制御 free 直進 blocked 左折 教師データの収集
教師データ収集用のスクリプトは、手動で撮影画像を1枚1枚クラスラベルを付加しながら保存していくものです。このままでは少々非効率なのでこのスクリプトをベースにJetBotを遠隔で操作しつつ、撮影画像を連続で保存していくスクリプトを作成しました。
上図で表示されているカメラの撮影画面を確認しつつ、ブラウザ上のボタンでJetBotを操作します。前進している間はfreeのラベルを付加して、左折している間はblockedのラベルを付加して自動で画像を保存し続けます。
モデルの学習
収集した教師データで、学習用スクリプトを実行します。教師データが2クラスそれぞれ約500枚ずつ、エポック数50回で学習しました。なお学習はJetson Nanoではなく別のGPU搭載PCで実施しました。
結果が下の動画となります。以前より手前で障害物を回避しています。
さいごに
今回は日本国内で調達した部品でのJetBotの組み立てと、モデルの学習により自分の環境でJetBotを衝突回避走行させるまでを紹介しました。次回は、JetBotのハードウェアセットアップについて詳しく紹介していきます。
