オブジェクトを追跡させる方法ArduinoIDEM5StickCM5stickVMaixPyUnitVIntroduction※M5Stackから教えていただいたコードは、どうもM5StickVをベースにしていたようです。その前提をもとにコードを見直し、記事を修正しました。2019近頃、新製品ラッシュの止まらないM5Stickシリーズですが、このTweetのメカナムホイール付きのRoverCとK210搭載のUnitVの組み合わせに興味が湧いて初めて購入してみました。機械学習や深層学習もやってみたいと思っていたので、ハード製作の手間を省いてソフトの学習を進めるにも楽しそうなキットです。2019即座にアップしてくれるという神対応。2019途中、ちょっと失礼なことも言っちゃってますが、感謝の念に堪えません。電子工作初心者の非力な身ではありますが、M5Stick公式の心意気に応えるためにも、このガジェットをTwitterの動画の様に動かすまでのセットアップについてまとめておきます。今回のガジェットはタイトルの通りM5StickCとRoverCとUnitVと言う機器で構成されています。M5StickCは、UnitVから届いたオブジェクト検出データをもとに動作判断を行い、RoverCを制御します。RoverCはM5StickCからの制御指令に従い動作するだけなので、特別なセットアップは必要ありません。UnitVはカメラによる撮影とOpenMVのオブジェクト検出機能を用いてオブジェクトの検出データをM5StickCに送信します。今回の記事では、M5Stackより公開されたM5StackCのArduinoIDE用スケッチとUnitVのMaixPy用ソースコードについてポイントを解説します。記事のベースになるソースコードはこちらにあります。https://github.com/icyqwq/RoverC_TrackBallM5StickCのセットアップM5StickCの使い方についてはたくさんの記事が有りますので要点の説明のみです。ソースはArudinoIDE用のスケッチです。以下の点に注意してスケッチをM5StickCに書きこんで下さい。**M5StickC側のコードはそのまま書き込んでも問題なく動作します。スピード調整やオブジェクト探索のための行動パターンなどはそれが楽しみでもありますので皆さん工夫してみてください(^^)/動作方向判定の符号反転この部分の符号が逆になっていますので修正して書きこみましょう。loop()関数内、106行目と110行目です。以下の動作方向の違いは、M5sticKVとUnitVのカメラ取付向きの違いに起因するものです。UnitV側のコードで修正した方がスマートですので以下の修正は不要です。※ただし、UnitVの取付け方向にも依存するかと思います。公式Tweet動画の通りの取付け方向だとこれで正常に動きます。UnitVの端子が上側、ロゴが天地逆の向きです。オブジェクト検出位置のキャリブレーションUnitVからはオブジェクトのセンター位置が、カメラ視野のセンター位置から左右どちらへどれだけずれているかと言う情報が送られてきます。この位置情報のゼロ点とRoverCの進行方向センターがずれています。カメラの取付け角度のズレの為だと思いますが、カメラ視野が比較的狭いためオブジェクトをロストする原因になります。位置情報はV_data.dxという変数に格納されているため、キャリブレーション値を入れて補正しましょう。私の場合は+50でセンターに合いました。このセンター位置のずれは、M5StickVとUnitVのカメラ取付向きの違いによるものです。この修正も、UnitV側のコードで修正した方がスマートですので、次のコード修正は不要です。//ここにキャリブレーション値を入れましょう。buffer[4];・・・略v_data.dxの値はSerial.Printされています。StickC、RoverC、UnitVを正しく取り付けたうえでRoverCの電源を切りStickCとPCを接続し、ArduinoIDEのシリアルモニタでdx値をモニタリングしましょう。オブジェクトをRoverCの正面に置いた時にv_data.dxがゼロになる様に補正値を定めます。私の場合は+50くらいでセンタリングできました。!!!UnitVのソースにバグがあり、初期のままだとdx(横方向の変位)データにdy(縦方向の変位)データが送られています。お好みのチューニングで良いかと思います。loop()内の後半にSetspeed()関数で設定しています。デフォルトで20となっている引数を調整しましょう。IDEがあると便利です。0.2.3以前のバージョンではUnitVを正しく認識しないため、v0.2.4が必要です。v0.2.4はこちら。http://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.4早速セットアップに進みたいところですが、ソースに間違いが有りますので37行目のtarget[6]をtarget[5]に変更してからセットアップに進みましょう。※追記1:この間違いもM5StickVとUnitVのカメラ取付向きの違いによるものです。これにより、カメラ画像が左右反転していますので、次の一文を追記しましょうsensor.set_hmirror(0)※追記2:このコードではターゲットオブジェクトの色を検出します。カメラのゲインとホワイトバランスが自動で変化するとオブジェクトの色の見え方が変わってしまうためロストの原因となります。次の2行を加えて自動調整機能をオフにした方がよさそうです。以上の修正を加味したUnitV用コードは以下の通りです。passUnitVの取り扱いはM5StickCに準じます。詳細は他サイトに譲りますが、ソースの修正が出来たら次の手順でセットアップします。1ファームウェアをUnitVに書きこむファームウェアはこちら。https://docs.m5stack.com/#/en/quick_start/unitv/unitv_quick_start?id=download書きこみツールはこちら。https://github.com/sipeed/kflash_gui/releases/tag/v1.5.32MicroSDカードにソースを書きこむソースはこちらhttps://github.com/icyqwq/RoverC_TrackBallファイル名をboot.pyに変更してからmicroSDに書きこみ、UnitVに挿入します。microSDカードには相性問題があります。公式発表による使えるmicroSDカードはこちらです。https://docs.m5stack.com/#/en/unit/unitv?id=sd-card-test以上の手順でUnitVのセットアップは終了です。デフォルト設定での動作ができる様になりました。UnitVのモニタリングと閾値変更セットアップが出来たのでRoverCを動かしてみたいところですが、おそらくこのままではオブジェクトを認識する事が出来ません。これは、初期設定でさだめられた色(緑色)にしか反応出来ないためです。緑にもいろいろあるので、閾値にマッチするオブジェクトを用意するのは困難です。UnitVをモニタリングしながら動かし、追いかけさせたいオブジェクトに合わせた閾値設定を行いましょう。UnitVのモニタリング方法UnitVにはディスプレイがついていないため、オブジェクトの検出状況が良くわかりません。設定がうまく出来るまでは、UnitV単体をPCと接続し、MaixPy上で動作確認をするとはかどります。ボードの種類はM5StickVを選択すれば正常に接続できます。MaixPyIDE上では、このようにカメラ画像をモニタリングできます。IDEで走らせてみました。内容は理解できてないけど、緑のボールを認識してて、シリアル通信でその面積を送ってるっぽいです。40)で指定した閾値内の色を検出しています。ターゲットとする対象に合わせて閾値を変更しましょう。6つの数字はRGB(565)のLABカラースペースです。IDEの[ツール]→[マシンビジョン]→[しきい値エディタ]を使うと、簡単に閾値を見つけられます。RoverCの注意点RoverCについては特にする事はありませんが、2点ほど注意点が有ります。1充電はM5StickC経由で行うRoverCには充電用端子が有りません。RoverCにM5StickCを差してM5StickCを充電するとRoverCも同時に充電されます。2メカナムホイールと車体が干渉して止まるメカナムホイールはDカットされた軸にささっているだけですが、奥までさすとホイールとシャシーが干渉します。ホイールが止まったり動きが遅い場合は少し抜きましょう。まとめ以上の手順でRoverCが次の動画の通りオブジェクトを追いかけ始めてくれます。動作確認出来た!!!チューニングの余地はまだまだあるのでしばらく楽しめそう。2019ソースを読み込んで知ったのですが、このオブジェクト検出は次の一行のコマンドで実行されています。20)find_blobs()の参考資料https://maixpy.sipeed.com/en/libs/machine_vision/image.html#imagefindblobsthresholds-invertfalse-roi-xstride2-ystride1-areathreshold10-pixelsthreshold10-mergefalse-margin0-thresholdcb-none-mergecbnoneこれはOpenMVのライブラリにある画像内の色を検出するコマンドの様です。画像のドットの色が閾値無いであるか否かを判定しているだけでいわゆる”AI”によるオブジェクト検出ではありませんでした。残念ではありますが、ベースとなる車両が手に入っているので”頭脳”を入れ替えてやればイメージしているAIカーに近いものが出来るはずです。K210のパワーでどの程度の認識ができるかはわかりませんが、次は機械学習画像認識によるオブジェクト追跡にトライしたいと思います。おまけ動作確認の動画では、ターゲットとなるオブジェクトとしてLEDライトに色紙を貼り付けたものを使用しました。色によるオブジェクト認識を行う現行システムでは、外乱光によってカメラに映るオブジェクトの色が大きく変化しロストや誤検知が多くなります。夜間の屋内は照明の照度が低くバラツキも大きいため、自発光するオブジェクトの方が認識しやすくなります。プレイステーションムーブのコントローラーがこんな形していた理由が良くわかりますね。最近は現場仕事が減ってきてものづくり成分が不足中です。upLoginユーザーは見つかりませんでした。