作品タイトル:GR-LYCHEEで物体追跡(色検出)ロボ
表示名:Yuuichi Akagawa
コンセプト・作品説明 |
---|
GR-LYCHEEプロデューサミーティング(ルネサスナイト11)用に製作した色検出による物体追跡ロボです。赤色の物体を追跡して走行しつつ、カメラ画像をWiFi経由でスマホやタブレットで見ることができます。 GR-LYCHEEは標準でカメラを備え、OpenCVによる画像処理が可能です。更にESP32を搭載しているのでWiFi/Bluetoothによる無線通信ができます。 ※この作例は試作版のRev.2を使用しています。製品版では修正が必要となる可能性があります。 |
しくみ
1) 画像処理
今回の作例では機械学習は使わず、ラベリング処理を利用して物体認識を行います。ラベリング処理の入力画像は2値化画像(白黒)なのですが、この2値化画像を生成する際に特定の色を抽出します。今回は赤色を処理対象としていますが、GR-LYCHEEではカメラからの取り込み画像がYUV422形式なのでそのまま色域選択処理を行ってみます。
YUV色空間は映像信号で良く使われるもので、Y:輝度,U:青色差,V:赤色差を表します。U,Vを平面にプロットすると下図のような配置になります。
Y=0 | Y=64 | Y=128 | Y=255 |
---|---|---|---|
左上の領域が赤なのでこの範囲を赤色として処理すれば良いのですが、輝度(Y)が高いとオレンジ~黄色になるのでYについてもある程度の範囲に制限する必要があります。
色の判定ができたら対象の領域を白、対象外の領域を黒とした2値化画像を作成します。この2値化画像を入力としてラベリング処理を行います。
OpenCV3ではcv::connectedComponentsWithStats()でラベリング処理を行うことができますが、指定サイズ以下を無視する機能や領域の大きい順にソートする機能がなく、メモリ不足となる懸念もあることから、井村研究室のラベリングクラスLabering.hを利用させていただきました。
追跡プログラムは、複数の検出結果に対して一番面積の大きい領域に向かう仕様とします。また、画像内に赤い領域が無ければ停止させます。
コミュニケーション系ロボットであれば、検出対象物を探す動作を行うことも考えられますが、机上での開発では落下や暴走の危険性から今回は実装しませんでした。
追跡停止の判断については、今回の作例では距離センサーを備えないため、赤い領域が一定以上の大きさの場合は十分接近したと判断する方式とします。
2) 検出結果サンプル
元画像 | Y | U | V | 2値化画像 | 検出結果(赤枠) |
---|---|---|---|---|---|
2番目がオレンジを誤検出しているケース。照明が白色でも飛び気味だとオレンジに近い色になるので、あまりオレンジを避けすぎると赤い物体であっても検出できなくなります。ほどほどにしておいた方が良いと思います。
3) 方向制御について
方向制御は単純に検出枠の左右の余白幅を比較し、左側の方が広ければ左のモーターを回し、右側の方が広ければ右のモータを回す制御を行っています。左右の余白がほぼ等しいときだけ両側を回転させますが、それ以外は片側しか回転させず速度制御も行っていないので、よちよち歩きのような動きになります。
左側の余白の方が大きいので左のモータを回す(右に曲がる) | 右側の余白の方が大きいので右のモータを回す(左に曲がる) |
構成
1) 構成図
WiFIやHTTPの処理は全てESP32で行っています。
それ以外の
- カメラからの画像取り込み
- 画像処理
- モーター制御
をGR-LYCHEEのマイコン(RZ/A1LU)で処理しています。
※RZ/A1LUとESP32間はUARTで通信しています
2) ソフトウェア処理補足
ESP32へのUART送信処理やモータードライバーへのI2Cコマンド送信を非同期とするため、それぞれ別タスクとして起動してQueueにてメッセージ送信する方式にしています。メインタスクでは主に画像処理を行っています。
また、ESP32のWiFi処理がストールした場合、UARTで送信したデータが処理されない状況が発生するため、ESP32側とGR-LYCHEE側双方にダブルバッファを用意し、未処理バッファがある場合は書き込まない制御を行っています。結果、コマ落ちが発生してしまいますが、走行制御を優先としています。
GR-LYCHEEではOpenCVのcore機能を利用することができます。検出結果画像に表示している赤い枠もOpenCVで描画しています。GR-LYCHEEのカメラキャプチャやJPEG変換機能はYUV422形式であるため、OpenCVの機能を利用するためには色空間変換必要です(BGR888など)。しかしながら、OpenCVにはBGR888からYUV422に変換する機能が無いため、この部分は自前で実装する必要がありました。
詳細についてはソースコードを参照ください。
3) 電源について
7.4VのLi-Poバッテリーをモータードライバーに接続し、モータードライバー基板上の5Vレギュレータ出力をGR-LYCHEEのArduino 5V端子から供給します。USB端子に電源を接続する必要はありません。
部品リスト・必要な工具
部品リスト
※2017.7.1現在の情報です。購入できないものがあるかもしれません。更新情報はこちらを参照ください。
品名 | 数量 | 購入情報(参考) |
GR-LYCHEE with カメラモジュール | 1 | |
Actobitty 2wheel Robot kit | 1 | 秋月電子通商K-08456 |
Grove I2Cモータードライバモジュール | 1 | 秋月電子通商M-09278 |
I2Cバス用双方向電圧レベル変換モジュール(FXMA2102) | 1 | 秋月電子通商M-05825 |
ピンヘッダ 1x40 | 1 | 秋月電子通商C-00167 |
カーボン抵抗4.7kΩ(1/6W) | 2 | 秋月電子通商R-16472 ※2本しか使わないのバラで買える人は適当に。 |
Arduino用バニラシールド基板ver.2 | 1 | スイッチサイエンスSSCI-PCB-NVLBK |
FFCケーブル(0.5/24P)150mm | 1 | 千石電商5BWT-PPHD |
JST-EH ハウジング4P | 1 | 千石電商EEHD-4KBL |
JST-EH 基板用ポスト 4P ストレート | 1 | 千石電商EEHD-4KBR |
JST-EH コンタクト5個1組 | 1 | 千石電商EEHD-4P7K |
EA1850 7.4V 40C+α Li-Po (リポ) バトルバック Mini-Sタイプ | 1 | イーグル模型5513 |
EPエアーコネクター・18Gワイヤー(90mm)付 Aオス | 1 | イーグル模型3460-18AWG |
トップレーシング 2Pコネクター(オス1pcs.メス1pcs) | 1 | イーグル模型2709LP-BK バッテリー標準と交換する場合 |
耐熱電子ワイヤー | 少々 | AWG28くらいのもの |
ハンダ | 少々 | |
M3x6ネジ | 1 | |
M2x10ネジ | 4 | |
M2ナット | 4 | |
耐震マット 4×4cm | 1 | 100円ショップ等で買えるはず |
マジックバンド10mm幅 | 少々 | リンクマンBTYPE1.5Mなど |
以下の部品は3Dプリンタで出力
品名 | 数量 | STL |
カメラマウント | 1 | Download |
モータードライバ用スペーサー(内径2mm x 5mm) | 4 | Downlaod |
仕様する工具
- はんだごて
- プラスドライバ
- マイナスドライバ
- ラジオペンチ
- ニッパー
- ワイヤーストリッパ
- ピンバイス
- 2mmドリル
- 2.5mmドリル
- タップハンドル
- M3タップ
- 圧着ペンチ
- 3Dプリンタ
車体の工作
1) 車体の組み立て
車体はActobitty 2wheel Robot kitを使用。標準状態でArduino UNOが載せられるようになっていて便利です。
90rpmのギヤードモーターが使われていて、非常にゆっくり走ります。電源は6~12V対応です。※今回は7.4VのLi-Poバッテリーを使用しました。
特に改造する部分は無いので、Assembly Guideに従って組み立てます。モーターのコネクタは不要なので切断して被覆を剥がしておきましょう。
2) カメラマウントの製作
こちらのSTLをダウンロードし、3Dプリンタで出力します(積層ピッチは0.2mm以下)。
出力後、底面にある穴をネジ穴加工します。2.5mmのドリルで下穴を開け、M3タップでネジを切ります。
最初にカメラモジュールからレンズを外し、ケーブルを接続します。ケーブルはGR-LYCHEE付属のものではなく、別途購入した150mmのものを使用します。
ケーブルをカメラマウント下部から出してからカメラモジュールを押し込みます。
再度、レンズを取り付けて完成。
3x6mmネジでカメラマウントを車体に固定します。
3) モータードライバー
Arduino用のモーターシールドでは使用可能なPWMのピン位置が合わないため、I2C接続のものを選択しました。
DRV8830では2つ必要&電源周りに不安があるので、今回はL298の載ったGrove I2Cモータードライバモジュールを採用。このボードは5V動作のため、I2C電圧レベル変換ICを介して接続する必要があります。
モータードライバー取り付け用の穴を開けます。2mmのドリルで、以下の位置のスルーホール部分を広げます(4ヶ所)。
ピンヘッダは穴開け後に、はんだづけする方が作業しやすいと思います。
シールドにモータードライバー基板を取り付けます。2x10mmのネジをシールド裏面から差し込み、スペーサーを挟んでモータードライバー基板を載せ2mmナットで固定します。
※スペーサーは3Dプリンタで出力しておきます(4個必要)。
Groveケーブルが長いので、短く切ってJST PHコネクタを取り付けます。圧着ペンチが手元に無く、加工が困難な場合はケーブルを直接はんだづけでも構いません。
ケーブルを接続して完成。
4) 車体への搭載
GR-LYCHEEを取り付け、カメラケーブルを接続します。
続いて、GR-LYCHEEにモータードライバーシールドを載せます。
モーターを接続します。ターミナルブロックのネジを締めて固定。
バッテリーのコネクタを接続し、ターミナルブロックのネジを締めて固定
※この作例ではコネクタをラジコン用のモノに変更しています。標準のコネクタのままでも問題ありません。
5) バッテリーの搭載
40x40mmの耐震マットを半分に切って、バッテリーに貼り付けます。
耐震マットの粘着力を利用してバッテリーを車体に貼り付ける。
最後に、マジックバンドで軽く固定。
プログラムの書き込み
1) 事前準備
モータードライバーを以下の様に設定します。
ディップスイッチ | 4つ全てONに設定(工場出荷時状態) |
J4ジャンパー | 書き込み時は外しておく |
2) ESP32のプログラム書き込み
esp32-DisplayApp-WebServerからダウンロードし、README.mdを参考に書き込みを行ってください。
3) GR-LYCHEEのプログラム書き込み
このファイルをダウンロードし、GR-LYCHEEに書き込みしてください。
4)走行準備
プログラムの書き込みが終了したらGR-LYCHEEからUSBケーブルを外し、J4ジャンパーを接続します。
使用方法
誤動作防止のため、起動直後はモーター制御と画像送信処理は停止しています。
LEDとスイッチの役割は以下の通りです。
LED/SW | 内容 |
US0 | モーター制御On/Off |
US1 | 画像送信On/Off |
LED1(緑) | 初期化完了。動作中。 |
LED2(黄) | モータ制御状態 |
LED3(橙) | 画像送信状態 |
LED4(赤) | 物体検出 |
1) 電源投入手順
1-1) バッテリーを接続
1-2) モータードライバーのリセット(J4ジャンパが接続されていることも確認)
1-3) GR-LYCHEEのリセット → しばらくするとLED1(緑)が点灯します。
1-4) 赤色の物体をカメラ前にかざし、LED4(赤)が点灯することを確認。
1-5) US0を押すとモーター制御が有効となり、LED2(黄)が点灯します。赤色の物体を追跡するようになります。
2) WiFi接続手順
ESP32がWiFiアクセスポイントとして動作しているため、スマホやタブレットから接続します。
※SSIDは GR-LYCHEE-(MACアドレスの下6桁)
US1を押すと画像送信が有効となり、LED3(橙)が点灯します。ブラウザから192.168.4.1にアクセスするとカメラ画像が表示されます。
3) その他
電源スイッチがついていないので、使わない時はバッテリーを外してください。Li-Poの最低電圧を下回ると危険です。
デモ動画
趣味として、電子工作やプログラミングを楽しんでいます。
万人に受けるネタよりも、少々マニアックなものが多いかもしれません。