機械学習で障害物を避けてみる #ML2Scratch #ev3

機械学習で障害物を避けてみる #ML2Scratch #ev3

AI Car

巷では、AWS DeepRacerDonkey CarJetBotといった機械学習を使った自走ラジコンが盛り上がっているようです。

というわけで、機械学習(TensorFlow.js)とScratchをつなげる拡張機能ML2Scratchでも似たようなことができないか、お正月休みに試してみました。

見た目やスピードやスムーズさ等諸々はさておき、とりあえず障害物を避けて自走してくれました😆

道具

  • ノートPC(chromeでML2Scratchを動かす)
  • USBカメラ(ML2Scratchの画像入力に使う)
  • LEGO mindstorms EV3とモーターで作った自走車両

動作の概要

車両は、(ノートパソコンが重そうなので)左右2個ずつ(計4個)のEV3 Lモーターで移動する構造にしました。動作的には、「左折」と「右折」の組み合わせで、前進・後退と方向転換をしています。

  • 前進:「左折」と「右折」を同時に実行
  • 方向転換:「後退」の後に「左折」を実行

ML2Scratchを使った機械学習の概要

今回、ML2Scratchでは以下の2パターンのラベル付けをしました。

ラベル1(= 床の上に障害物がない状態)

板の模様や角度、光の当たり方が違った色々な見え方の床を含めるように意識しながら100枚弱ラベル付けしました。方向転換が可能な範囲で端に障害物がちらっと映る画像も含めました。

このラベルと同様と判断された場合は、車両を前進させます。

ラベル2(= 床の上に障害物がある状態)

障害物を検知して避ける場合用に学習させます。画像の上部に床以外の何かが映った状態です。こちらもだいたい100枚弱ラベル付けしました。

このパターンと判断された場合は、(車体の幅が大きくてそのまま方向転換したら障害物に引っかかるので)一旦車両をバックさせてから左折させています。

もう少し手間をかけるなら、「障害物が右側にある」「障害物が左側にある」を別々に学習させて、回避動作を左右に分けてもいいと思います。

ScratchのEV3拡張

Scratchには、LEGO EV3をコントロールする拡張機能が元々有るので、それを使いました。

ただ、モーターを動かすために用意されているブロックには「こちら向きに○秒間回す」といったものしかありません。回転数や角度の指定、回しっぱなしなどができません。EV3自体は色々なことができるだけに、拡張機能自体はちょっと物足りない感じです。

これと、ML2Scratchを組み合わせてざっとこんな感じになりました。

方向転換時は内輪を逆回転させるようにすれば、後退する必要なくもう少し奥まで突っ込めるのかな?とか、もう少しうまく制御できそうですが、まずは動かしてみるということで。

感想

障害物なし、有りで各100枚弱のラベル付けによる学習ですが、意外にうまく障害物を避けながら自走してくれました。

ほほーと思ったのは、障害物の学習画像に含まれていなかった障害物(例えばこの場合は学習していないカラーボックス)でも、しっかり「障害物あり」と判断して避けたのには感動しました。

今回は、車両の上にPCをドカッと載っけて走りましたが、AndroidスマホがWifi接続でPCのカメラにできるそうなので、それを使えば、PCは切り離してもっとシンプルな機械学習車両が組み立てられそうです。

Scratchは公式の拡張機能や独自拡張を組み合わせると、できることがどんどん増えるから、なかなか奥が深いですね。

というわけで、今年もちょこちょこと「やってみた」「作ってみた」をアウトプットしていきたいと思います!😆