今回はNVIDIAのJetsonNanoが搭載されているJetBot(AIロボットカー)を購入して実際に動かしてみましたので、それの紹介していきたいと思います。
JetBotキットに関してはすでにいろいろな会社から販売されていますので、デザインや価格などを考慮して購入して試してみるといいと思います。
JetBotとは?
JetBotとは、NVIDIA社が販売しているJetson NanoというGPU付きのシングルボードコンピューターが搭載されたオープンソースのロボットのことです。オープンソースなので公開されているサンプルコードでロボットを動かすことはもちろん、自分でプログラムを作って動かすことも可能となっています。特徴としてはGPUが付いていますのでAI(深層学習)との相性もいいところです。Jetson Nanoとキーボード、マウス、ディスプレイなどを接続したら普通のPCのように使用することもできます。AIとロボットを学習したい方であれば最適な学習教材になること間違いないと思います。
JetBotのキット購入&開封する
今回はAmazonでこちらのJetbotキットを購入しました。中国のメーカーのものですね。他のキットと比較するとJetsonNano以外の付属品が異なってきます。下記で説明するゲームパッドによる遠隔操作を行いたい方は別途ゲームパッドも購入しておく必要があります。こちらのキットを購入するとOSがセットアップされた状態で届くのでそこがメリットです。
・XiaoR Geek Jetbot AI kit with Nvidia Jetson nano 自動運転車の学習 (Orange, With Jetson nano)
今回は以下のような箱で宅配されてきました。クッション材もしっかり入っていたので安心です。
本体はアンテナ以外はほぼ組み立てた状態で届くのでハードウェア的には何もする必要がありません。
コロナで退屈しないようにAIロボットカーを購入しました。
これが自動で動くのをイメージすると楽しみ過ぎます。
ほぼ組み立て済みで届くのであとはソフトウェアの設定をして動かすだけです。#jetbot #JetsonNano pic.twitter.com/TBLUyVanRY— Kazuki (@RoomKazuki) March 28, 2020
JetBotをセットアップして起動してみる
今回購入したこちらのJetBotキットではOSがセットアップされた状態で届きますので以下の作業以外はほとんどすることがありません。楽ちんですね。
アンテナは外された状態で届きますので取り付けてしまいましょう。
JetBotにモニターのHDMIとマウスを接続して電源を入れます。電源を入れてモニターにパスワードを入力するところから始まりますので「jetbot」と入力してエンターボタンを押します。これでJetbotの画面を表示することができました。
英語のマニュアルを読んでやっとセットアップできたと思ったら今度は中国語の操作画面が立ちはだかる。
全部解読してやろうじゃないか。Google翻訳さんまたお世話になります。 pic.twitter.com/LtkuBFaa6y— Kazuki (@RoomKazuki) April 2, 2020
WiFiにつないでみる
JetsonNanoは普通にPCとしても使用できますのでまずはインターネットに接続してみます。イーサネットがあればLANケーブルを接続、WiFiがあればデスクトップの右上に表示されているWiFiの接続アイコンをクリックして、パスワードを入力して自宅のネットに接続します。
試しにブラウザを立ち上げてみるとネットサーフィンができるようになっているはずです。
ブラウザからJetsonNanoにリモートで接続してみる
JetsonNanoをネットに接続することができたら、手持ちのPCのブラウザを立ち上げてJetsonNanoにアクセスできるか試してみます。
JetbotのLEDに表示されているIPアドレスを入力してアクセスしてみましょう。するとJupyter Notebookが起動して表示されるはずです。
XiaoR Geekのサンプルコードの説明は全て中国語で書かれていますので分からない部分は翻訳して理解していきます。
JetBotのExamplesでできること
今回はJetbotでできることを紹介させていただきたいと思います。XiaoR GeekのJetbotキットを購入すると以下のサンプルコードが全てセットされた状態で届きます。今回はGitHubからダウンロードできるサンプルコードのほうについて紹介していきたいと思います。
基本的にできることはこちらのGitHubに記載されています。翻訳して読んでみましょう。
JetbotにはNVIDIAのGPUが搭載されていますので深層学習を用いたAIで判断して走行することが可能です。
以下にできることを列挙していきます。
例1-基本的なモーション(Basic Motion)
例1ではブラウザのボタンにボタンが表示され、それを押下することでJetbotを動かすことが可能です。上から順番に実行してみましょう。いきなりロボットが動き始めますのでJetBotは広い場所に置いてから始めてみてください。
例2-遠隔操作(Teleoperation)
ゲームパッドをPCに接続し、ゲームパッドからの入力でJetBotを遠隔操作することが可能です。ゲームパッドが必要となりますので別途購入しておきましょう。ゲームパッドのボタンの割り当てが完了するとラジコンのようにして操作することが可能です。今回購入したゲームパッドはこちら。
まずゲームパッドとJetsonNanoを接続したらこちら( https://html5gamepad.com )のページにアクセスし、ゲームパッドが認識されるか確認してみましょう。有効な場合、ボタンを押したら反応が出るはずです。このとき左上に表示されている「index」の番号を覚えておきます。
ゲームパッドが認識されていることを確認したら以下のコードを上から順に実行していきます。このとき「index=1」となっているので、上記で確認した番号に書き換えてから実行します。私が購入したゲームパッドの場合は「index=0」で設定しています。
ゲームパッドが認識されると以下のように表示されます。ボタンを押下してみたら反応があるはずです。「left_link」「right_link」まで実行すると、左右のモーターとリンクされて動かせるようになるはずです。
次にカメラの表示をしていきます。インスタンスを作成して接続するところまで実行するとカメラの映像が見れるようになります。これでカメラを見ながら遠隔操作できるようになりました。
例3-衝突回避(Collision avoidance)
この例ではまずデータセットを収集していきます。ボタンを押下してブロックが無いときと、ブロックがあるときの画像を収集していきます。画像を追加するとカウントが増えていきます。サンプルではそれぞれ100枚程度集めると十分だと思います。
次に、集めたデータセットをトレーニングすることが可能です。データセットを読み込んでトレーニングするところまで実行してみましょう。
モデルのトレーニングが完了したら、それを使用してJetBotを動かして衝突回避することが可能です。
例4-オブジェクトの追跡(Object Following)
カメラに映った物体の追跡が可能です。例3ではデータセットの収集してモデルを作成しましたが、今度はもともと用意されているモデルをロードして物体追跡をしてみましょう。今回はボトルを追跡してみようと思います。
サンプルの説明にあるようにこちらのページから物体のラベル番号を知ることができます。
上記のページを確認するとボトルのラベル番号は44であることが分かりますので、追跡したいラベル番号に44を指定します。
するとボトルが認識された際には枠が緑で表示されます。このときロボットは直進します。
追跡しない物(ブロック)が認識されたときは回避したいので回転します。このようにして追跡したいものを認識したときだけ直進するようになっています。
例5-道なり走行(Road Following)
GitHubのサンプルコードをダウンロードすると、道なり走行するサンプルもあるようです。ですがこちらのサンプルコードは使い勝手が悪かったので、こちらで紹介されているFaBoのサンプルコードを利用することにしました。以下からサンプルコードをダウンロードしておきます。
まずは「data_collecion.ipynb」の上から順に実行していき、データセットの作成を行います。以下のようにカメラの映像が写ったらロボットが進行してほしい方向をマウスでクリックして追加ボタンを押下します。するとX座標とY座標がファイル名として保存されます。その操作を繰り返し行ってデータセットを作成します。
データセットができたら「train_model.ipynb 」を開きトレーニングを行っていきます。トレーニングが完了したら「live_demo.ipynb」で推論に使う「best_steering_model_xy.pth」が生成されます。
トレーニングが完了したらいよいよ「live_demo.ipynb」でJetBotを動かしていきます。画面にはスピードとゲインのパラメータが変更できますので、それらを調整して良い感じに動くようにします。実際に動かしてみた様子がこちら。
部屋にコースを作って走行させてみました。ちゃんとコースに沿って動いてくれると楽しいです。#Jetbot #JetsonNano pic.twitter.com/IZFSFccXNn
— Kazuki (@RoomKazuki) April 21, 2020
その他できること
XiaoR Geekのオリジナルのサンプルコードを使用するとGPIOの入出力であったり、LEDの点灯などができたりします。このあたりはRaspberryPiやArduinoでもできたりすることですね。JetsonNanoではGPUが付いているのが強みなので、そのあたりを生かしたロボットを作れるとより楽しむことができると思います。
さいごに
以上、今回はJetBotの基本的な動かし方についてご紹介させていただきました。この記事を読んでやってみよう!と思う方が一人でも増えたら嬉しいなと思います。また、そのときはTwitterでブログなどで発信していただけると嬉しい限りです。
Jetson Nanoまとめ。セットアップ記事や活用事例を紹介。 | ラズパイの実