71
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

M5StackAdvent Calendar 2019

Day 21

せまいおうちでもできるお気軽AIカー

Last updated at Posted at 2019-12-20

はじめに

たぶんTwitterで見たんだと思いますが、今年の夏頃にM5StickC/Vというものを知りました。

  • プログラミング可能
  • ネットにつながる
  • 画面がついてる
  • 電池内蔵
  • 安い
  • RISC-V
  • AI?!

「3000円のこれでKerasで学習したモデルを実行できるらしい」
「カメラが付いてるから画像認識系いろいろできるはず」
「マイクが付いてるからアレクサみたいなのもできるよね?」

面白そうなので「到着するまでに何を作るか考えよう」ってことにしてAliExpressで注文しました。

...

で、いろいろ考えた結果、

「BeetleCってのもあるし、AIといえばとりあえず自動運転だよな」ということで、
M5だらけのちっちゃい自動運転、はじまりーはじまりー。

https://twitter.com/urekat/status/1162870557513142273

ハードウエア

まずはこの3つを接続しました。

  • M5StickC
  • M5StickV
  • BeetleC

BeetleCにCを刺し、GroveケーブルでCとVを接続します。
CとVはシリアル通信でアレコレやり取りします。

ラジコン化

とりあえず、まずはラジコン化します。

BlynkというiPhoneのアプリでBLE接続してラジコン

https://twitter.com/urekat/status/1169465715318915073

微妙なモーター制御に向いてなかったBeetleC

https://twitter.com/shikarunochi/status/1169256028317159425

WiiリモコンとESP32がつながった

https://twitter.com/urekat/status/1172336625629548545

BeetleCは細かいゆっくりとした制御に向いていないことがわかりました。
なんとか操作できるようにはなりましたが、次やるなら別のでやります。

古いBluetoothプロトコルを深追いしすぎました。

ESP32のArduinoでWiiリモコンとヌンチャクを使えるようになりました。

トレーニングデータの収集

Wiiリモコンでコースを走らせながら、
「M5StickCから制御データ(アクセル&ハンドルなど)を取ってきて、M5StickVで撮影した画像をSDカードに保存」
これをずっと繰り返すだけ、かんたん。と思っていたけど、なんやかんや試行錯誤があってずいぶんアレなコードになりました。

数百枚数千枚の画像を制御データと関連付けてなるべく高頻度に記録したいので、

    1. 画像をRamdiskにいったん書き出す
    1. SDカード上の記録ファイルに
  • 2-1. 制御データ追記
  • 2-2. 画像データ追記

としています。4-5fpsで記録できています。

コース

IMG_5481.JPG

  • 最初は道幅5cmぐらいの細いコースでした。
  • 細い道を走ってもらってもつまらないことに気がついたので、道幅を15cmぐらいにしました。
  • A3のコピー用紙にホワイトボードマーカーで描いています。
  • なかなか学習がうまくいかないのでコースの線が見えやすいように太く(2cmぐらいヌリヌリ)しました。
  • それでもなかなかうまくいかないので赤いセンターラインを追加しました。

ハードウエア改善

タミヤのボールキャスター

https://twitter.com/urekat/status/1172562954975240192 小回りしようとすると後輪が引っかかって回らないので後輪を諦めました。

ダイソーのスマホ用広角レンズ

https://twitter.com/urekat/status/1188010204597587968 M5StickVのカメラは視野が狭すぎだったのですが、これをつけるといいかんじになりました。

角度調整スペーサー(発泡スチロール)

もっと地面をしっかり見てもらうために三角に切った発泡スチロールをM5StickCの下にいれてレンズを下に向けています。

学習する

ベースにしたのはこれ。

https://twitter.com/kotobuki/status/1160353423293706240

ハンドルの切り具合ごとに画像を9個のカテゴリにわけて学習させました。
1枚の画像から、右に行くのか左に行くのかハンドルの切り具合を判断させます。

これもいろいろ試行錯誤があってアレなコードになっています。

  • 左右反転
  • データ水増し
  • 分類 or 回帰
  • ハイパーパラメータ
  • DonkeyCar
  • ハンドルとアクセルを同時に出力
    いろいろやってみました。

train.png

ひどい過学習ですが、

result.png
categ.png

右は右、左は左と判断できてるので、いいか。

kaiki.png

↑ハンドルの値を直接回帰のモデルで学習した結果。これも右は右、左は左。

「画像」を入力すると「ハンドルの切り具合」が出力させるモデルが完成しました。

kmodelまわりの苦労

M5StickVでの学習〜推論のやりかた情報が少なくて苦労しました。

  • ncc(kerasで学習後のtffile->kmodel変換ツール)の謎エラー
  • nccのバージョン問題
  • M5StickVでkmodel読み込み時のエラー表示がおかしい

使っている人が少ないのでトラブったときにググってもヒットせず、元のソースコードやデータシートまで調べてなんとかするってことがよくあります(Vに限らずCも)。

自動運転!!

M5StickVの中のAIが「カメラ画像」から「左右」を判断します。
アクセルを固定の値にして、判断した「左右」をM5StickCに送り、BeetleCを制御するようにしました。


自動運転モードにしてコースに置いてみると、、

!!!!

ちょっと左右にフラフラしてるけど、直線コースにそって走ってます!!黒い線に跳ね返されてかくかくしてるのか?
はじめてのカーブ、、も、ぐいっとちゃんと曲がって、かくかくしてるけど!右カーブ、左カーブ、ちゃんとコースをまわっています!!
運がいいと、直線コースをまっすぐ走れることもあるみたいです。かくかくしないでカーブするときもあります。
逆周りも、できてるー!が、あ、コースを外れてしまった、が、反対側のコースから入って周回再開!!
なんか、いきものっぽくてかわいい。なんだこれ、虫か?!

それでは、とてもかわいいM5自動運転カーを動画でどうぞ↓↓↓

...
...

という予定でしたが、撮影する直前に片側のモーター(のギア?)が壊れてしまったようです。
あまりにかわいく走りまわるのでぐるぐる無理をさせすぎてしまいました。

タイヤがまわりはしているのですが、音がシャリシャリ鳴っていてトルクが弱いです。ギアが割れてる?
もうまともに走れないので残念ですが動画はありません。。。
見たい人がたくさんいるならBeetleCを追加で買って撮影してもいいけど、、、次はもうすこし良いクルマでやりたいです。

という感じで、M5自動運転カー、無事に完成ということで。お疲れさまでしたー。

71
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?