見出し画像

自律走行ロボット『JetBot』を作って、ボールを追いかける子犬や、煽り運転のデモをした話

この記事は、LeapMind Advent Calendar 2019 11日目の記事です。

この記事の目的

LeapMindでは、通常の業務から離れて好きなものを自由に開発して社内発表して良い『Hackdays』というイベントを、年に数度のペースで開催しています。本記事では、そのHackdays期間中に作成したJetBotという自律走行ロボットのデモについて紹介をします。

自己紹介 (簡易バージョン)

まず簡単な自己紹介ですが、新卒で入社したSIerでプロジェクトリーダーをやっていた過去などあり、IT技術への理解が私のバックグラウンドの1つです。とは言え、コードを読んで理解して修正することはできますが、0からバリバリとコーディングできる程のスキルは無いため、一般的には「非エンジニア」に当たります。

その後、外資系コンサルティングファームや経営学修士(MBA)取得などを経て、現在は営業支援(プリセールス)やコンサルティング業務を担当しています。Business(経営) × Technology(技術) に跨る領域で、その両方を理解して動ける人材を目指しています。

Hackのテーマ選び

Hackdaysイベントはエンジニアだけが対象なのではなく、営業(セールス)やコンサルタントといった非エンジニアも自由に参加することができます。今は『AIの民主化』が進み、コーディングスキルの高くない人でも色んなプロジェクトを自分で開発できる環境がどんどん揃っている状況ですので、下記の観点から、Nvidiaから発表されたJetBotという自律走行ロボットを作成してみることにしました。

・LeapMindの主戦場であるEdge Deep Learningとの関係が深い
・敢えてLeapMindが注力していないデバイス (今回は Nvidia Jetson Nano)
・ソースコードが公開されていて一定期間での成功確率が高そう
・せっかく会社に3Dプリンタがあるので、使ってみたい
・費用が掛かり過ぎない (数万円の会社補助の範囲内)
・自分の娘(幼稚園~小学生)に自慢できる分かりやすいデモ
・先端技術領域で、取り組んで楽しそうなテーマ

画像2

【買う編】JetBot の日本版BoM(部品リスト)

JetBotはNvidia社から発表されたオープンソースのロボット開発プロジェクトで、税別99ドルという低価格で話題となったJetson Nanoというエッジデバイス用の小型GPUモジュールを活用し、安価かつ簡単に開発できるのがポイントです。

NVIDIAによれば99ドル(税別)のJetson Nanoと、150ドル以下の市販の各種部品、そしてその購入にかかる送料だけがコストで、総額250ドルで、AI画像認識が可能なロボットが組み立てられることが可能になるという。
(Impress PC Watch)

必要な部品リスト(BoM: Bill of Materials)はGitHub上で公開されているのですが、購入先がUSのAmazon.comなどになっているため、まずは日本で入手可能な日本版BoMを作成することから始めました。(※価格は2019年7月時点)

■GitHubには64GBmicroSDカードを買えと書いてあるが、良く見るとOS容量の関係でトラブルが発生するissueが上がっており128GB以上が正解
モバイルバッテリー3A出力するものを選ぶ必要があり、かつ形や大きさから重心が決まるため、安価な代替品はスルーして標準指定品を選ぶ
WiFiドングルもドライバの関係でトラブルが報告されており、標準指定品か、それに近い機種(使用チップが同じなど)を選ぶのがベター
■1台で少ししか使用しない部品や、購入時に送料が掛かる部品は、メンバーを誘って数人でまとめ買いするのがおススメ
カメラ魚眼レンズが意外と高い・・(2つで計6,000円程度)

などなど、部品を買い揃える段階で、既に幾つかのトラップがありますので、充分注意して調達部品を選定することが大切な第一歩です。

【作る編】JetBot の組み立て作業

部品が揃ったら、次はいよいよ組み立てです。組み立て方法もGitHub上にハードウェア編が公開されているので、基本的にはマニュアル&画像を見ながら丁寧に作業していけば完成します。ソフトウェア編ではOSイメージも公開されているので、セットアップも比較的簡単。

画像3

■一部の部品については、ハンダ付け接続が必要!ここで接続不良や、せっかく購入したディスプレイがお亡くなりになる悲しい事態が頻発。。(泣)
■購入したUSBケーブルをバッサリ切断して中の細ケーブルを直接繋ぐなど、想像以上にHackな(?!)組み立て工程が続く
一部GitHub上の画像に誤りがあり、マニュアル通りに組み立てると電流の+/-が逆転してモーターが逆回転してしまうというトラップあり
3Dプリンタでメインボディや付属パーツを出力!データはGitHubで公開されているが、出力時のサポート材(仮支柱)は各プリンタ性能に合わせて各自で追加する必要がある
■メインボディの出力は30時間/台かかった (4人で各自1台ずつ作成したので、合計で1週間程度かかった)
■3Dプリンタでの出力は簡単だが、その後の後処理が意外と大変・・バリ取り&やすりがけや、ネジ穴拡張の際に電動ドリルが大活躍!
■WiFi接続でトラブルが発生するので、ドライバーを変更して省電力設定をOFFにする必要がある (でないとネット接続が頻繁に切断されてしまう)

画像1

↑ Hackdays期間中の浴衣Dayで、浴衣のままハンダ付け作業する同僚☆

なんでも公開されているから簡単・・ではあるのですが、実際にやってみると色々と苦労するポイントもありました。だからこそ楽しいし、完成した時の喜びが大きくなる。。やはり手を動かすことは大切ですね!!

【動かす編】JetBot を動かしてみる

次は、完成したJetBotを動かしてみました。デモプログラムがOSイメージの中にプリインストールされているので、GitHub上の操作マニュアルに従ってボタンをポチポチしていけば、コーディング無しで基本デモが実施できます。PCのブラウザ経由でJetBotのJupyter Notebookにリモートアクセスできるので、操作も簡単です。

『Basic Motion (基本動作の確認)』は、PCからの遠隔マニュアル操作、つまりラジコン操作で基本動作を確認し、組み立て時の配線ミスなどないかを確かめるためのデモです。

『Collision Avoidance (分類モデルを活用した衝突回避走行)』は、カメラからの入力画像に対してリアルタイムでDeep Learning分類モデルが実行され、直進可能かそうでないかが判定されます(2クラス分類)。直進不可と判断されたら左旋回するようにプログラムされています。学習済みのモデルが公開されており、障害物を避けたり、テーブルから落下しないように端でクルッと回るデモを実行できます。この時点でマニュアル操作を離れて自律走行が実現するので、急にペット感が出て自分のJetBotが愛おしくなります。

『Object Following (物体検出モデルを活用した自動追尾走行)』は、Deep Learning物体検出モデルが実行され、指定したオブジェクトを見つけて追いかけるというデモです。上記の衝突回避モデルも同時並行で動いているため、見つけた物体を追尾して近づいていくものの、近づき過ぎるとクルッと左旋回して離れていくというデレツンな動きになります。(都合の良い時だけ近づいてくるのようなイメージです)

■WiFi接続さえ安定していれば、とっても簡単。WiFi接続さえ安定していれば・・(ドングル選びやドライバー設定が超重要!)
■カメラからのキャプチャ画像が固まるという事象が結構な高頻度で発生し、JetBotが「真っすぐ進む君」「ぐるぐる回る君」に変身してしまう。同じ事象がForum上でも報告されているが、Jupyter Notebookを再起動する対処法しか無いらしく、デモ実施前に毎回くじ引き感あり。。Orz

【Hackdays編】JetBot ×4台 でカッコ良くデモする!

さぁ、これでようやくGitHubで公開されている情報を再現できたことになります。ただし、ここで終わってしまうとHackとは呼べませんので、モデルやデモを改変しました。

まずは、公開されているものをそのまま流用していた衝突回避用の分類モデルを、カスタムのモデルに差し替えました。自分のデモ環境で撮影した教師データを使って、学習済みのAlexNetから2クラス分類モデルを転移学習させます。データ収集(撮影)や転移学習についても、Jupyter Notebookが用意されているので、『ここは直進OK、ここは直進NG・・』というように地道にポチポチと操作を進めていけば完了します。デフォルトモデルで認識ミスしていた箇所がうまく認識できるようになっていれば成功です!

デレツン猫な動きだったObject Followingのデモも、もう少し子犬感が出るように改変しました。追いかけている途中ですぐに左旋回するのは不自然なので、直進不可と判定されたら一定時間Waitが発生するように処理ループを改変して『Stop&Go』の動きに変えました。直進不可の連続判定回数をカウントしておき、本当に行き止まりの時に初めて旋回動作をさせます。旋回方向も常に左だと非常に機械的なので、方向を左右ランダムに変更します。これで、ボールを追いかける子犬のようなデモが実現しました。

もう1つ、GitHubには『Road Following (ライントレーサ)』デモも公開されています。カメラ画像から旋回角度を出力するDeep Learning回帰モデルを学習させる内容なので、トミカの道路キット上を自律走行するデモに決めました。せっかく複数人のメンバーで取り組んだので、同時複数台のJetBotを走らせて、かつ、JetBot同士が衝突することなく、道路上の歩行者などの障害物も検知してちゃんと止まれるデモにします。(1)たくさん教師データを撮影して道路を自律走行できる回帰モデルを学習する、(2)デフォルトのデモプログラムは道路上をただ辿るだけなので衝突回避用のモデルを同時実行するよう変更して『Stop&Go』を実装する、(3)JetBotや道路上の障害物を認識できるよう教師データを撮影して衝突回避用の2クラス分類モデルを転移学習する、という計3Stepでデモを改変しました。JetBot毎に走行コースや速度を変えて複数台を同時に走らせれば、『あおり運転デモ』の完成です!!

↑遅い水色JetBotを、速い白色JetBotが煽る煽る・・っ!!
(危険なので良い子はマネしないようにね☆)

■デモ実行時(推論時)と違い、学習時はJetson NanoをAC電源アダプタに接続するのがおススメです(学習時は計算処理量が多く電力も多く消費するため)。ボード上のジャンパーピンでUSB給電/AC電源の切り替えができます。電源と同時に動作の電力モードを切り替えるとパフォーマンスも最大化できます。
■Road Followingの教師データ作成時にゲームコントローラをPCに接続する必要があります。なぜかLeapMindにはPlayStation3用コントローラが転がっていたので、MacにUSB接続して使用しました。
■用意した道路キットはトミカ用なのでJetBotとは車幅が合わず正直微妙でした・・2車線をまたいで走っている、かつ、段差に引っ掛からないように道路以外の部分を段ボールで埋めて路面の高さをフラットにしています (これが面倒臭かったのでオススメできない。。)
■段ボール面との摩擦が少なくタイヤが空転したり、パワーに対して車体(特にモバイルバッテリーとJetson Nano)が重いので、どうしても左右にゆらゆらとフラつきながら走行します。路面の工夫や、モバイルバッテリーと車体の固定が重要になります。あとは実際に走らせながら、Jupyter Notebook上で速度と曲がり幅のゲイン値を少しずつ調整して・・(凄く地味だが重要)

まとめ

JetBotは、組み立て方法だけでなく、OSイメージやデモプログラムまで全てがオープンソースになっていて、コーディングスキルが高くない人でも比較的簡単に自律走行ロボット作成ができる素晴らしいプロジェクトです。会社のHackdaysという自由開発イベントを活用して、モデル&プログラムを改変することで『ボールを追いかける子犬』『危険な煽り運転』のデモを実現できました。

色々なデモや事例を目にする機会も多いと思いますが、『見る』『読む』のと『実際に手を動かしてやってみる』のとでは、想像以上に大きな差があります。『AIの民主化』が進み、手軽にトライできるJetBotのようなプロジェクトもたくさん増えて来ましたので、皆さんも御興味ある方は是非ご自身の手でチャレンジしてみてください!

LeapMindは、今回扱ったエッジ向けGPUよりも更に省電力なデバイス上でDeep Learning画像認識モデルを軽く速く処理する技術を開発しており、機械学習を組み込んだ製品やサービスの共同開発を進めているベンチャー企業です。Hackdaysのように自由でユニークな制度もありますので、LeapMindに御興味を持っていただいた方は、是非オフィスに遊びに来てくださいね!

P.S. (おまけ)

6-7月当時は存在していませんでしたが、現在は幾つかの販売代理店からJetBotの組み立てキット一式がセット販売されていて、これを入手すれば【買う編】と【作る編】はかなり省略して、すぐに【動かす編】をスタートさせることができそうです。(でも、3Dプリンタを使った部品の作成や組み立てもスリリングなのでオススメですよ)

この記事が気に入ったらサポートをしてみませんか?