概要
人工知能のディープラーニングを使った、NVIDIAの「JetBot」を製作して動かしてみました。JetBotは、NVIDIA製のAI用コントローラJetson Nanoを使用したミニサイズのAIカーのプラットフォームです。
1)衝突回避
AIカーが、床に敷いた板から落ちないように、また、障害物への衝突を回避して移動します。
2)物体追従
AIカーが、人を検出して追従します。追従の間も障害物への衝突を回避しつつ、目標に向かって移動します。
動画
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に対応 ロボット
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 |
モータドライブ回路(PCA9685とTB6612)の配線です。
PCA9685基板 | TB6612基板 |
VCC GND PWM8 PWM9 PWM10 PWM11 PWM12 PWM13 |
VCC GND PWMA AIN2 AIN1 BIN1 BIN2 PWMB |
(注意)TB6612のSTBYをVCCに接続しないとモータに電圧が出力されません。
3.ソフトウェア
ソフトウェアは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の設定から行いました。
basic_motion.ipynb のページを開きます。
上から順にプログラムを実行していきます。
モータが動くので、左右モータの配線、前進・後退の向きが合っていることを確認します。
違う場合は、モータへの配線のプラスマイナスを入れ替えます。
5.衝突回避(Collision avoidance)
AIカーが、床に敷いた板から落ちないように、また、障害物(缶)への衝突を回避して移動します。
1)データ収集
リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。
http://192.168.0.24:8888
collision_avoidance/data_collection.ipynb のページを開きます。
上から順にプログラムを実行していきます。
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 が作成されます。
best_model.pth をJetson Nanoに転送します。
3)実行
リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。
http://192.168.0.24:8888
collision_avoidance/live_demo.ipynb のページを開きます。
上から順にプログラムを実行していきます。
後ろの自在車(キャスター)の位置が、駆動輪から離れているため、AIカーが旋回したときに、キャスターが床に敷いた板から落ちることがありました。学習させる画像を集めるときに、旋回分の余裕を持っておけばよいかと思います。
6.物体追従(Object Following)
AIカーが、人を検出して追従します。追従の間も障害物への衝突を回避しつつ、目標に向かって移動します。
JetBotは、カメラの視線が低くほぼ床を見ているために、JetBotを床で移動させての人は検出しにくいです。そのため、NVIDIA JetRacerのカメラマウントに変更して、カメラ位置を高くしました。以下が変更後の写真です。
リモートPCからJetson NanoにWiFiで接続します。ブラウザで以下のページを開きます。
http://192.168.0.24:8888
object_following/live_demo.ipynb のページを開きます。
上から順にプログラムを実行していきます。