Jetson Nano を使った機械学習ロボット JetBot を作成しました。基本的には、シャーシキットを購入して組み立てた程度のものですが、リアルにモノが動くって楽しいですね。
本体の組立
シャーシキットはスイッチサイエンスで購入しました。 Amazon では他の種類のシャーシ・本体が購入可能だったりするのが、ちょっとお高いので。
このシャーシを使って、Sparkfun のページを見ながら組立を行っていきました。英語のページですが写真と自動翻訳でなんとかなります。
他に、広角のカメラが必要ですが、これは適当なところで購入しました。 FOV 160度あたりあれば良さそうだったので、 Jetson Nano で使えるモノならそれで良いかと思います。JetBot のページには Raspberry Pi カメラ v2 に、広角レンズを取り付けたモノが紹介されていたりします。
Jetson Nano を動かすのにバッテリーも必要となります。ちょっと出力電圧の観点から悩みどころですが、私は以下のモバイルバッテリーを組み込んで動作させています。
OSの設定など
JetBot 用に OS (JetPack 4.4) を書き込んで、リポジトリからコードを clone してきます。リポジトリに含まれている Docker コンテナ生成のスクリプトを用いて、この先使用するコンテナを準備します。
問題は、接続している OLED ディスプレイやモータードライバによってはこのリポジトリのコードでは認識してくれない、という点です。今回は Sparkfun の Qwiic システムで使えるモノを使用したため、 Sparkfun のほうで配っているイメージを参考にもしました。
現在では、リポジトリ最新バージョンにて、Qwiic 使用時でも動作するコードが含まれているようです。コンテナイメージは配っていないので、手元でのビルドが必要です。
障害物回避
JetBot のシステムを起動すると、Jupyter Lab を用いての操作になります。ここで collision avoidance のノートブックを開いて作業を進めていきます。作業の流れは以下の通りです。
- 進行 OK, 進行 NG の撮影画像を採取する。JetBot から見たときの画像を集める
- 収集した画像から学習を行う
- 障害物回避の学習であれば、 Jetson Nano での処理も現実的な時間で OK
- 学習結果を用いて、リアルタイムに推論を行い自動走行を開始
これらの3ステップはそれぞれにノートブックが用意されているので、切り替えながら作業を行います。
この作業の分かりやすい説明が以下のページに記載されていましたので、紹介します。安心の日本語解説記事です。
私の場合には、さすがにテーブルの上から落ちると困るので、地べたで作業を行っていました。またビニールテープとパズルマットを組み合わせて盤面変更もやりやすいような形でやりました。
色々と進めた結果、以下のような動作を実現できました。
突然現れる障害物
車といえば、子供が飛び出すなど、通常状態に割り込んでくる異常状態で回避を行わなくてはならないです。それと同じように、ここではあるマスコットを障害物として学習させて、うまく回避行動を取るように進めてみました。盤面の枠内学習の過程で、このマスコットも合わせて学習させた、という感じです。
このときの様子が以下の動画です。カメラにマスコットが入ったときにはそれを回避するように旋回を行います。
まとめ
うまく JetBot が動いてくれてほっとしました。最初の学習の枚数としては約100枚ちょっとの撮影で、枠内移動をするものが成功しました。マスコットありの場合では、200枚程度は追加していました。
上手くいかない場合には、失敗する条件の画像を撮影&追加して学習を行えばよいので、根気よくやればいつか成功するんじゃないかなと思います。JetBot のみで学習も完結させることが出来る(ちょっとは時間かかっちゃうけど)ので、とても始めやすいと感じました。
コメント