HuskyLens で ロボットアーム制御
前回は HuskyLens の物体追従機能を用いてお絵描きを楽しみました。
今回は長らくの夢であった”画像認識でロボットアームを制御”を試してみました。
目次
顔認識
HuskyLens の Face Recognition (顔認識)は複数個の顔を学習し識別することが可能です。
顔の複数認識のやり方は公式ドキュメントの通りです。
デフォルトでは顔認識機能で特定の顔の学習・識別は1つしかできません。
Functionボタンを長押しで、Learn Multipleを選択しONしてセーブします。
コレで複数の顔を学習し識別することが可能となります。
学習はカメラを向けて顔が認識された際にLearningボタンを押すとIDがふられ学習されます。
再びLearningボタンを押すと次の顔の認識モードになり、同様に別の顔を認識させてLearningボタンを押しIDをふります。
認識動作
3つの顔を学習し認識できるようにしました。
HuskyLens
顔認識 複数学習 pic.twitter.com/FYtowKGNMJ— HomeMadeGarbage (@H0meMadeGarbage) May 27, 2020
TakamizawaをID1
KonosukeをID2
SakuraiをID3
としました。
この顔認識の中心座標3点から角度を導出して、ロボットアームを動かしてみました。
未来でしょ?
構成
HuskyLens で認識した3つの顔の中心座標をArduinoにシリアル伝送します。
Arduinoで3点から算出した角度でサーボを動かします。
ソフトウェアシリアルとサーボ制御が共存できなかったので
ハードウェアシリアル(D0, D1)を使用しています。
部品
- HuskyLens
- Arduino UNO
- サーボモータDS3115
ロボットアーム
以前作ったロボットアームの1軸を使用します。
角度算出
HuskyLens で認識した3つの顔の中心座標から角度$θ$を算出します。
3点からなる三角形の各辺は
$$a = \sqrt{(x_1 – x_3)^2 +(y_1 – y_3)^2 }$$
$$b = \sqrt{(x_1 – x_2)^2 +(y_1 – y_2)^2 }$$
$$c = \sqrt{(x_2 – x_3)^2 +(y_2 – y_3)^2 }$$
余弦定理より角度$θ$は以下で算出されます。
$$θ = \cos^{-1} \left(\frac{b^2 + c^2 – a^2}{2 b c} \right) $$
HuskyLensで撮影するための顔画像移動治具も作成いたしました。
Arduinoコード
公式のHuskyLens Arduinoチュートリアルを参考にプログラミングしました。
チュートリアル:Arduino Tutorial
Arduinoライブラリ:https://github.com/HuskyLens/HUSKYLENSArduino
参考サンプルコード:HUSKYLENS_GET_STARED.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include "HUSKYLENS.h" #include "SoftwareSerial.h" #include <Servo.h> Servo myservo; HUSKYLENS huskylens; int x1, y1, x2, y2, x3, y3; float a, b, c, th; void setup() { Serial.begin(9600); myservo.attach(6, 820, 2140); //DS3115 while (!huskylens.begin(Serial)){ Serial.println(F("Begin failed!")); Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>Serial 9600)")); Serial.println(F("2.Please recheck the connection.")); delay(100); } } void loop() { if (!huskylens.request()) {} else if(!huskylens.isLearned()) {} else if(!huskylens.available()) {} else{ while (huskylens.available()){ HUSKYLENSResult result = huskylens.read(); if (result.command == COMMAND_RETURN_BLOCK){ if(result.ID == 1){ x1 = result.xCenter; y1 = result.yCenter; } else if(result.ID == 2){ x2 = result.xCenter; y2 = result.yCenter; }else if(result.ID == 3){ x3 = result.xCenter; y3 = result.yCenter; } } a = sqrt(float((x1 -x3)*(x1 -x3)) + float((y1 -y3)*(y1 -y3))); b = sqrt(float((x1 -x2)*(x1 -x2)) + float((y1 -y2)*(y1 -y2))); c = sqrt(float((x2 -x3)*(x2 -x3)) + float((y2 -y3)*(y2 -y3))); th=acos((b*b + c*c - a*a)/(2*b*c)) * 180.0/M_PI ; myservo.write(int(th)); delay(100); } } } |
動作
3つの顔を認識して角度を算出してロボットアームのサーボモータを動かしています。
ちょっと遅延ありますができました!
AIカメラHuskyLens によって実にインタラクティブな仕組みが簡単に実現できました。
HuskyLensは高機能なセンサとも言えますし、空間を超えたインターフェイスとも言えそうです。
これはいろんな応用ができて、むしろ出来過ぎて発散しそうです!