はじめに
たぶんTwitterで見たんだと思いますが、今年の夏頃にM5StickC/Vというものを知りました。
- プログラミング可能
- ネットにつながる
- 画面がついてる
- 電池内蔵
- 安い
- RISC-V
- AI?!
「3000円のこれでKerasで学習したモデルを実行できるらしい」
「カメラが付いてるから画像認識系いろいろできるはず」
「マイクが付いてるからアレクサみたいなのもできるよね?」
面白そうなので「到着するまでに何を作るか考えよう」ってことにしてAliExpressで注文しました。
...
で、いろいろ考えた結果、
「BeetleCってのもあるし、AIといえばとりあえず自動運転だよな」ということで、
M5だらけのちっちゃい自動運転、はじまりーはじまりー。
https://twitter.com/urekat/status/1162870557513142273M5StickC+BeetleC+M5StickVで自動運転する|ノート君|note(ノート) https://t.co/mHNUd8a9rt
— 佐々木竹充/SASAKI TAKERU (@urekat) August 17, 2019
ハードウエア
まずはこの3つを接続しました。
- M5StickC
- M5StickV
- BeetleC
AI自動運転カーのハードウェア部分できた #M5StickV #M5StickC pic.twitter.com/pLmzHge7YB
— 佐々木竹充/SASAKI TAKERU (@urekat) September 2, 2019
BeetleCにCを刺し、GroveケーブルでCとVを接続します。
CとVはシリアル通信でアレコレやり取りします。
ラジコン化
とりあえず、まずはラジコン化します。
BlynkというiPhoneのアプリでBLE接続してラジコン
https://twitter.com/urekat/status/1169465715318915073タイヤ空回りしまくり。AIカーがこの悪条件でスイスイまわれるなら意味あるAIだなと思う。人間には難しいことをやる。 #BeetleC #M5StickC #M5StickV pic.twitter.com/HaSubTbUAS
— 佐々木竹充/SASAKI TAKERU (@urekat) September 5, 2019
微妙なモーター制御に向いてなかったBeetleC
https://twitter.com/shikarunochi/status/1169256028317159425BeetleC、ゆっくり動かして、だいぶ制御できるようになりました!#M5StickC#BeetleC https://t.co/Gemn01DS0g pic.twitter.com/DxaydDtXb5
— Nochi (@shikarunochi) September 4, 2019
WiiリモコンとESP32がつながった
https://twitter.com/urekat/status/1172336625629548545BeetleC、なんとか操作できるようになった|ノート君|note(ノート) https://t.co/0kU92E5Y6G
— 佐々木竹充/SASAKI TAKERU (@urekat) September 13, 2019
BeetleCは細かいゆっくりとした制御に向いていないことがわかりました。
なんとか操作できるようにはなりましたが、次やるなら別のでやります。
古いBluetoothプロトコルを深追いしすぎました。
ESP32のArduinoでWiiリモコンとヌンチャクを使えるようになりました。
トレーニングデータの収集
Wiiリモコンでコースを走らせながら、
「M5StickCから制御データ(アクセル&ハンドルなど)を取ってきて、M5StickVで撮影した画像をSDカードに保存」
これをずっと繰り返すだけ、かんたん。と思っていたけど、なんやかんや試行錯誤があってずいぶんアレなコードになりました。
数百枚数千枚の画像を制御データと関連付けてなるべく高頻度に記録したいので、
-
- 画像をRamdiskにいったん書き出す
-
- SDカード上の記録ファイルに
- 2-1. 制御データ追記
- 2-2. 画像データ追記
としています。4-5fpsで記録できています。
コース
- 最初は道幅5cmぐらいの細いコースでした。
- 細い道を走ってもらってもつまらないことに気がついたので、道幅を15cmぐらいにしました。
- A3のコピー用紙にホワイトボードマーカーで描いています。
- なかなか学習がうまくいかないのでコースの線が見えやすいように太く(2cmぐらいヌリヌリ)しました。
- それでもなかなかうまくいかないので赤いセンターラインを追加しました。
ハードウエア改善
タミヤのボールキャスター
https://twitter.com/urekat/status/1172562954975240192 小回りしようとすると後輪が引っかかって回らないので後輪を諦めました。すごく操作しやすくなりました! pic.twitter.com/GYUJIaAD4V
— 佐々木竹充/SASAKI TAKERU (@urekat) September 13, 2019
ダイソーのスマホ用広角レンズ
https://twitter.com/urekat/status/1188010204597587968 M5StickVのカメラは視野が狭すぎだったのですが、これをつけるといいかんじになりました。#m5stickv #m5stickc #beetlec とダイソー広角レンズとタミヤのボールキャスターで地面だけちゃんとみてなさい pic.twitter.com/Q3J94sdMB2
— 佐々木竹充/SASAKI TAKERU (@urekat) October 26, 2019
角度調整スペーサー(発泡スチロール)
もっと地面をしっかり見てもらうために三角に切った発泡スチロールをM5StickCの下にいれてレンズを下に向けています。
学習する
ベースにしたのはこれ。
https://twitter.com/kotobuki/status/1160353423293706240gheesung版を発展させ、自分で用意したデータセットに対応できるようにしつつGrad-CAMによる可視化を追加した #M5StickV 用のサンプルです。説明の不備や実装の間違いなどいろいろあると思います。コメント、リプライなどご都合のよい方法でお知らせいただけると助かります。https://t.co/A5H9bX7eLH
— Shigeru Kobayashi (@kotobuki) August 11, 2019
ハンドルの切り具合ごとに画像を9個のカテゴリにわけて学習させました。
1枚の画像から、右に行くのか左に行くのかハンドルの切り具合を判断させます。
これもいろいろ試行錯誤があってアレなコードになっています。
- 左右反転
- データ水増し
- 分類 or 回帰
- ハイパーパラメータ
- DonkeyCar
- ハンドルとアクセルを同時に出力
いろいろやってみました。
ひどい過学習ですが、
右は右、左は左と判断できてるので、いいか。
↑ハンドルの値を直接回帰のモデルで学習した結果。これも右は右、左は左。
「画像」を入力すると「ハンドルの切り具合」が出力させるモデルが完成しました。
kmodelまわりの苦労
M5StickVでの学習〜推論のやりかた情報が少なくて苦労しました。
- ncc(kerasで学習後のtffile->kmodel変換ツール)の謎エラー
- nccのバージョン問題
https://t.co/25aSaTInI8#M5StickV のkmodel関連コードって古い?
— 佐々木竹充/SASAKI TAKERU (@urekat) October 25, 2019
最新のnncaseのバグfixや機能追加を利用できないんでは?
(途中で諦めたのでなんか勘違いしてるかもしれません)
- M5StickVでkmodel読み込み時のエラー表示がおかしい
https://t.co/d8NAHvZNtK おかしくないですか? #m5stickv
— 佐々木竹充/SASAKI TAKERU (@urekat) October 18, 2019
使っている人が少ないのでトラブったときにググってもヒットせず、元のソースコードやデータシートまで調べてなんとかするってことがよくあります(Vに限らずCも)。
自動運転!!
M5StickVの中のAIが「カメラ画像」から「左右」を判断します。
アクセルを固定の値にして、判断した「左右」をM5StickCに送り、BeetleCを制御するようにしました。
『
自動運転モードにしてコースに置いてみると、、
!!!!
ちょっと左右にフラフラしてるけど、直線コースにそって走ってます!!黒い線に跳ね返されてかくかくしてるのか?
はじめてのカーブ、、も、ぐいっとちゃんと曲がって、かくかくしてるけど!右カーブ、左カーブ、ちゃんとコースをまわっています!!
運がいいと、直線コースをまっすぐ走れることもあるみたいです。かくかくしないでカーブするときもあります。
逆周りも、できてるー!が、あ、コースを外れてしまった、が、反対側のコースから入って周回再開!!
なんか、いきものっぽくてかわいい。なんだこれ、虫か?!
』
それでは、とてもかわいいM5自動運転カーを動画でどうぞ↓↓↓
...
...
という予定でしたが、撮影する直前に片側のモーター(のギア?)が壊れてしまったようです。
あまりにかわいく走りまわるのでぐるぐる無理をさせすぎてしまいました。
タイヤがまわりはしているのですが、音がシャリシャリ鳴っていてトルクが弱いです。ギアが割れてる?
もうまともに走れないので残念ですが動画はありません。。。
見たい人がたくさんいるならBeetleCを追加で買って撮影してもいいけど、、、次はもうすこし良いクルマでやりたいです。
という感じで、M5自動運転カー、無事に完成ということで。お疲れさまでしたー。