概要

人工知能のディープラーニングを使った、NVIDIAの「JetBot」を製作して動かしてみました。JetBotは、NVIDIA製のAI用コントローラJetson Nanoを使用したミニサイズのAIカーのプラットフォームです。

1)衝突回避
AIカーが、床に敷いた板から落ちないように、また、障害物への衝突を回避して移動します。

JetBot衝突回避の動作中

JetBot衝突回避の動作中

2)物体追従
AIカーが、人を検出して追従します。追従の間も障害物への衝突を回避しつつ、目標に向かって移動します。

JetBotの人追従の動作中

JetBotの人追従の動作中

動画

AIカーJetBotの衝突回避の動画

 

説明

1.使用した部品

コントローラ NVIDIA Jetson Nano
WiFi インテル Intel Dual Band Wireless-AC 8265 5GHz/2.4GHz 802.11ac/agn 867Mbps Wi-Fi + Bluetooth 4.2 Combo M.2 無線LANカード 8265NGW
WiFiアンテナ 2042811100 (Molex)
マイクロSDカード 128GB SanDisk サンディスク Extreme UHS-I U3 V30 A2 R:160MB/s W:90MB/s  SDSQXAF-128G-GN6MA (A2)
カメラ SainSmart IMX219カメラモジュール、NVIDA Jetson Nanoボード用8MPセンサー160度FoV 3280×2464解像度
ロボットカー 2WDモータースマートロボット車(SODIAL)
I2C-PWM基板 PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール基板(KKHMF)
モータドライブ基板 TB6612FNG基板(SNOWINSPRING)
DCDCコンバータ(Jetson Nano用) OKL-T/6-W12N-C使用 小型高効率DCDCコンバーター可変電源キット(降圧)K-07728(秋月電子通商)
DCDCコンバータ(モータ用) LM2596S 3A DC-DC 1.25V-35V 調整可能 降圧 コンバータ ステップダウン モジュール(KKHMF)
電圧計 小型デジタル電圧計 赤 DC 2.5V~30V 2線式(KKHMF)
冷却ファン ELUTENG ファン 40mm 静音 USB 扇風機 小型 卓上 5500RPM CPUクーラー 冷却 4cm ミニ 送風機 強力 サイレントDC モーター Mini PC/PS4/PS3/PC/ルータなど適応 USB ファン
バッテリー Turnigy 7.4V 1800mAh 20C30C リポバッテリー
PC Windows 10 Pro  OMEN by HP 15 Corei7-8750H 32GB GeForce GTX1070 with Max-Q Design(8GB)
カメラマウント camera_mount.stl(3Dプリンタで印刷)、jetracer_cam_mount.stl(NVIDIA JetRacer用のカメラマウントを3Dプリンタで印刷)

(注意)ロボットカーのシャーシ、モータドライブ回路は、JetBot公式の部品とは違います。
(注意)公式のカメラマウント(camera_mount.stl、jetracer_cam_mount.stl)では、このカメラの取り付け穴の位置が合いません。取り付け穴4個のうち2個で固定しています。

amazonの商品ページのリンク
SainSmart IMX219カメラモジュール、NVIDIA Jetson Nano用8MPセンサー160度FoV 3280×2464解像度,RoHS認証あり

KKHMF PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール Arduinoに対応 ロボット

ELUTENG 小型ファン 4cm 静音 USB扇風機 薄型 風量調節可 長寿命 5V USB ファン 冷却 卓上 40mm ミニファン 7枚羽根 PC 冷却 省エネ クーラー パソコン XBox PS4 PS3 ゲーム機 ルーター TV Box クーリングに対応

2.配線

Jetson Nano の配線です。

Jetson Nano J41 Header PCA9685基板
1 3.3 VDC
3 I2C_2_SDA
5 I2C_2_SCL
9 GND
VCC
SDA
SCL
GND

 

JetBotの部品配置と配線

JetBotの部品配置と配線

モータドライブ回路(PCA9685とTB6612)の配線です。

PCA9685基板 TB6612基板
VCC
GND
PWM8
PWM9
PWM10
PWM11
PWM12
PWM13
VCC
GND
PWMA
AIN2
AIN1
BIN1
BIN2
PWMB

(注意)TB6612のSTBYをVCCに接続しないとモータに電圧が出力されません。

PCA9685とTB6612

PCA9685とTB6612

 

3.ソフトウェア

ソフトウェアはJetBot公式のものを利用しました。手順も、JetBotの説明通りに行いました。

>> JetBotのページ

私の使用したI2C-PWM基板の、I2Cのアドレスが公式のものと違っていたために修正しました。I2Cアドレスの確認と修正手順は以下です。
I2Cアドレスを確認します。

sudo usermod -aG i2c jetbot

jetbot@jetbot:~$ sudo i2cdetect -r -y 1
[sudo] password for jetbot: 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --                         

エディタを起動してI2Cのアドレスを変更します。

sudo gedit /usr/local/lib/python3.6/dist-packages/Adafruit_MotorHAT-1.4.0-py3.6.egg/Adafruit_MotorHAT/Adafruit_MotorHAT_Motors.py  

0x60から0x40に変更しました。

    def __init__(self, addr = 0x40, freq = 1600, i2c=None, i2c_bus=None):

 

4.モータの動作確認(Basic Motion)

リモートPCからJetsonNanoにWiFiで接続します。ブラウザで以下のページを開きます。

http://192.168.0.24:8888

ID、パスワードは、デフォルトでは jetbotです。
IPアドレスを固定するには、Jetson Nano のubuntuの画面右上のwifiの設定から行いました。

固定IPアドレスの設定

固定IPアドレスの設定

basic_motion.ipynb のページを開きます。
上から順にプログラムを実行していきます。
モータが動くので、左右モータの配線、前進・後退の向きが合っていることを確認します。
違う場合は、モータへの配線のプラスマイナスを入れ替えます。

5.衝突回避(Collision avoidance)

AIカーが、床に敷いた板から落ちないように、また、障害物(缶)への衝突を回避して移動します。

1)データ収集

リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。

http://192.168.0.24:8888

collision_avoidance/data_collection.ipynb のページを開きます。
上から順にプログラムを実行していきます。

JetBotデータ収集プログラムの画面

JetBotデータ収集プログラムの画面

AIカーを静止させた状態で、以下の2種類の画像を記録します。
AIカーの位置や角度をさまざまに変えて、各60枚程度撮影しました。
・前方に障害物がなくて直進可能な場合はフリー(free)
ここでは、床に敷いた板の上で、直進しても落ちない場所
缶の障害物が遠くまたは左右にあり、直進してもすぐには当たらない場所

・前方に障害物があり回転動作が必要な場合はブロック(blocked)
ここでは、床に敷いた板の端付近で、直進すると落ちる場所
缶の障害物が前方のすぐ近くにあり、直進すると当たる場所

撮影した画像は、
/home/jetbot/Notebooks/collision_avoidance/dataset に保存されます。
これをリモートPCに転送します。

2)学習

リモートPC(Windows10)で、AnacondaでPytorchの環境を構築します。
Jupyter Notebookで train_model.ipynb を実行します。

しばらくすると、学習が終了し、best_model.pth が作成されます。

JetBot学習プログラムの画面

JetBot学習プログラムの画面

best_model.pth をJetson Nanoに転送します。

3)実行

リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。

http://192.168.0.24:8888

collision_avoidance/live_demo.ipynb のページを開きます。
上から順にプログラムを実行していきます。

JetBot衝突回避プログラムの画面

JetBot衝突回避プログラムの画面

JetBot動作中

JetBot動作中

JetBot衝突回避の動作中

JetBot衝突回避の動作中

後ろの自在車(キャスター)の位置が、駆動輪から離れているため、AIカーが旋回したときに、キャスターが床に敷いた板から落ちることがありました。学習させる画像を集めるときに、旋回分の余裕を持っておけばよいかと思います。

 

6.物体追従(Object Following)

AIカーが、人を検出して追従します。追従の間も障害物への衝突を回避しつつ、目標に向かって移動します。

JetBotは、カメラの視線が低くほぼ床を見ているために、JetBotを床で移動させての人は検出しにくいです。そのため、NVIDIA JetRacerのカメラマウントに変更して、カメラ位置を高くしました。以下が変更後の写真です。

JetBotのカメラマウントを高く変更

JetBotのカメラマウントを高く変更

リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。

http://192.168.0.24:8888

object_following/live_demo.ipynb のページを開きます。
上から順にプログラムを実行していきます。

JetBotの物体追従のプログラムの画面

JetBotの物体追従のプログラムの画面

JetBotの人追従

JetBotの人追従

<参考>

JetBotの公式ページ

JetRacerの公式ページ

[深セン合宿6日目] JetBotのデバックと修正