AIステアリングカーの製作

今年度の山梨テクノICTメッセでは、表題「AIステアリングカー」を展示した。この記事ではその詳細について説明する。

概要

「AIステアリングカー」はタイトルの通り、AIによってステアリングを制御しながら動くクルマのことである。(長いので以降「AIカー」と省略する)

AIカーは以下で構成されている。

  • Webカメラ(M5Camera)
  • コントローラ(micro:bit)
  • I/Oボード(moto:bit)
  • ボディ(タミヤ 楽しい工作シリーズ バギー工作基本セット)
  • DCモータ(タミヤ 低回転型 130モーター)
  • マイクロサーボモータ(SG90)
  • モバイルバッテリー(USB出力をDCプラグにて moto:bit に接続)
  • PC(Windows 10、TM2Scratch)

システム構成

システム全体のブロック図は以下の通りである。

M5Cameraに実装した Webカメラから送られた画像に対して、OBSがその画像をソースとする仮想カメラを提供する。TM2Scratch は、Teachable Machine で学習させておいたAIモデルを使って、仮想カメラからの画像の認識(分類)を行う。

micro:bit の制御には正式版で提供されているmicro:bit 拡張機能を用いており、ScratchLink を使って Bluetooth 経由で micro:bit と通信を行う。

micro:bit は接続した moto:bit を通じて(マイクロ)サーボモータとDCモータを動かすことで、AIカーのステアリング操作と前後駆動を行う。

製作の詳細

以下、画像入力からモータ制御まで順に説明していく。

Webカメラによる画像入力

AIカーではM5Camera によるWebカメラを使って画像入力を実現している。このためのソフトウェアは SimpleWebcamServer を用いている。Arduino IDE を使ってビルドし、あらかじめ M5Camera に書き込んでおく。

なお、このソフトウェアでは Wi-Fi 接続に APモード・Station モードの両方に対応しており、どちらを選んでも構わないが、イベントでは APモードを使用したため、SSID=SimpleCameraServer, Password=12345678 にてPCから接続している。

OBSを用いた仮想カメラの提供

TM2Scratch では画像の入力に Webカメラの画像を直接利用することができない。そこで、OBSを用いた仮想カメラを利用することで画像入力できるようにする。

OBSをインストールし、ソースにブラウザを指定する。ブラウザのプロパティに SimpleWebcamServer のアドレス(APモードの場合は http://192.168.4.1 )を指定するとカメラ画像が表示されるようになる。

仮想カメラの開始ボタンを押して仮想カメラをスタートさせておく。

Teachable Machine によるモデルの学習

Google のTeachable Machine を使うと手軽に画像分類を行うモデルを作成することができる。

OBSの仮想カメラを使えば Webカメラ の出力画像をもとに学習させることもできる。

イベントでは「人形が写っている状態」と「写っていない状態」の2つのクラスで学習を行わせることにした。それぞれのクラスでビデオ画像から画像サンプルを追加していき、トレーニングを行う。

トレーニングが終了したら学習モデルのテストを行い、問題なければモデルをエクスポートする。

エクスポートしたモデルは Javascript 用にアップロードし、Teachable Machine がホストするアドレスをコピーしておく。

TM2Scrarch による画像分類

Teaching Machine で学習したモデルは、 TM2Scratch を使ってブロックプログラミングに取り入れることができる。TM2Scratch を起動してTM2Scratch 拡張機能を有効にする。カメラとして仮想カメラを指定すれば、ステージに Webカメラの画像が表示されるようになる。

画像モデル分類のブロックに Teachable Machine でアップロードしたURLを設定して実行すれば、学習モデルを用いてカメラ画像の分類がリアルタイムでできるようになる。あとは、適切なブロックで分類結果にもとづいた処理を行うプログラムを作成すればよい。

micro:bit との接続

Scratch から micro:bit を制御する方法として、公式の拡張機能である micro:bit の他に、micro:bit MORE がある。TM2Scratch にはどちらの拡張機能も利用できるようになっているので用途に合わせて選べばよい。

micro:bit MORE のほうが公式の micro:bit拡張機能よりずっと機能が多いので、イベントではそちらを使う予定だったが、何度やってもファームウェアの転送に失敗してしまうため、限られた準備期間の関係から利用を断念した。そこで、代わりに公式のmicro:bit拡張機能を使うことにした。

公式の micro:bit機能拡張は、 micro:bit の制御のために ScratchLink を使う。(Chrome ならば ScratchLink は不要だが、イベントでは Edge を使う予定のため ScratchLink を用いた)

micro:bit 拡張機能を有効にすると、まず、Websocket を使って ScratchLink との通信を確立させ、その後、ScratchLink が bluetooth を使って micro:bit と接続する。

Scratch 側には micro:bit のLEDを点灯させるブロックと一部のセンサ値を取得するためのブロックなど、利用できるブロックには限りがあり、そのままではDCモータやサーボモータを制御することはできない。

昨年のイベントでは ScratchLink を偽装した Python プログラムを通じて M5Stack を制御したが、今回は micro:bit 側のファームウェアを工夫することで対応することにした。

MakeCode による micro:bit ファームウェアの生成

micro:bit MORE のトラブルシュート方法を探している過程で、以下のような記事を見つけた。

Scratchからmicro:bitを操作できるC++な「micro:bit拡張機能」開発キットをMakeCodeで開発してみよう

この記事は、 MakeCode for micro:bit で ScratchLink と接続可能な micro:bit ファームウェアを作るというものである。MakeCode がもともと対応している機能に加えて、ScratchLink との bluetooth 通信ができるようになるため、 ScratchLink を経由した micro:bit の制御が可能となる。

MakeCode で ScratchLink と通信可能なプログラムを作るには、MakeCode にS3Link UDKとBLADVという2つの拡張機能を組み込む必要がある。

まず、Microsoft MakeCode for micro:bit を起動してプロジェクトを作り、拡張機能をクリックしたら以下を入力して S3Link UDK を見つけ、クリックしてインポートする。(警告が出るがそのままインポートする)

https://github.com/jp-rad/pxt-s3link-udk

同様に BLADV もインポートする。

https://github.com/jp-rad/pxt-ubit-bladv

これらの拡張機能を用いて、サーボモータやDCモータを制御するプログラムを作成する。

このプログラムを micro:bit にファームウェアとして書き込めば、 ScratchLink で接続できるようになる。

TM2Scratch からの micro:bit 制御

あらかじめ ScratchLink を起動しておき、TM2Scratch で micro:bit 拡張機能を有効にする。micro:bit との接続ダイアログには、先程作成したファームウェアを書き込んだ micro:bit が反応するので、接続してエディターに戻る。

公式の micro:bit 拡張のブロックのうち、LEDへのメッセージ出力だけを使ってモータを制御するようにした。

MakeCode のプログラムと対比すれば容易にわかるように、F, Bを表示することで前進・後退し、L, Rで左右操舵、Cで操舵を中心に戻すようにしている。TM2Scratch の認識機能と組み合わせることで、人形がなければ前進、人形があれば停止といったプログラムを簡単に作ることができる。

ステアリング機構について

AIステアリングカーのステアリング機構については、以前の記事で詳しく紹介しているのでそちらを参照してほしい。

イベントで展示してみて

イベントで展示するにあたり、いくつかのトラブルがあった。

まず、研究室にある自分のPCでは問題なく動作したが、展示用のレンタルPCではOBSの仮想カメラを Teachable Machine が認識しない(PCのカメラ画像が表示されてしまう)という問題が発生した。使用しているカメラデバイスやウェブブラウザを変えてみても結果は同じであった。

TM2Scratch では問題なく使えるので、OBSで録画した動画を Teachable Machine にアップロードすることで学習を行うことにした。

つぎに、Webカメラが不安定で頻繁にストリーミングが止まるという不具合が発生した。以前から何度も遭遇している不具合なので覚悟していたが、今回のように画像認識の結果でデバイスを動作させる場合、遅延は致命的である。これはイベント会場のネットワーク環境下でより鮮明になり、ほとんど正常に動作することがなかった。

あとはTeachable Machineのテストでは妥当な分類だったのに、TM2Scratch で分類させると適切に分類できないといった不具合が発生した。この原因は最後までわからず、イベントの期間内では改善することができなかった。

以上より、満足のいく結果ではなかったものの、イベントの展示物として他の参加者に興味を持ってもらうことはできた。特に、micro:bit や Scratch に慣れた人には特に関心を持ってもらえたようである。

子どもたちの反応を見ると、AIのメカニズムよりも Scratch を通じて micro:bit のクルマを制御できることのほうが関心が高かったようである。展示発表としては機能をてんこ盛りせずとも、シンプルな内容にしたほうが参加者の満足度は高められたのかもしれない。

今後は以下の点について改良を検討していく予定である。

  • Webカメラの性能向上(特にネットワークが不安定な状態での安定的なストリーミング)
  • TM2Scratch での画像分類失敗の分析と対策