プログラミング・OpenCv&MediaPipeを使いドローン(Tello)を自由に操縦してみた!
まずは、 ☆ 1.10本の指の曲げ伸ばしを認識させる。 ☆ 2.手の左右を認識させる ☆ 3.10本の指の種類を認識させる という手順で進めていきます。
☆1. 10本の指の曲げ伸ばしを認識させる。
両手の10本の指を使い10種類のパターンを作ろうと思います。
まず始めに、指を立てるかどうかを認識させる必要があります。
指を立てたら”1”、折りたたんだら”0”をコンピュターに判断させます。これは前回の指認識の応用で各指のLandmark・idの先端が2つ下の関節のidにたいして座標位置が高いか低いかで判断させます。親指に関しては、短いので1つ下の関節idとの比較にしています。
親指:lmList[tipIds[0]][1] < lmList[tipIds[0] – 1][1]
その他の指:lmList[tipIds[id]][2] < lmList[tipIds[id] – 2][2]
動画にあるように、全ての指を閉じた状態は、[0,0,0,0,0,0,0,0,0,0]
10個の”0”のデーターがそろいます。
例えば、左の親指を立てた場合は、一番左の”0”が”1”になります。
各指の先端id tipIds = [4, 8, 12, 16, 20] をキーにしてそれぞれ右手の場合、左手の場合と認識させていきます。
if len(lmList) != 0:
fingers =[]
if handLabel == “Right” and lmList[tipIds[0]][1] < lmList[tipIds[0] – 1][1]: #現物は左手 画像は反転しています。
fingers.append(1)
else:
fingers.append(0)
for id in range(1, 5):
if handLabel == “Right” and lmList[tipIds[id]][2] < lmList[tipIds[id] – 2][2]:
fingers.append(1)
☆2. 手の左右を認識させる
ここでは、右手と左手の認識を解説します。
Mediapipeで実装されているmulti_handednessを使って左手、右手を判断させていきます。
handLabel = results.multi_handedness[handIndex].classification[0].label
hand_landmarks = []
print(handLabel)すると”Right” “Left”と表示されるのがわかります。
次にドローン(Tello)への主なコマンドを10種類ほどあげて、指の10本をそれぞれ認識させます。ここが一番苦労したところです。右手、左手の指を立たせて10パターン作りました。
基本は左手の1本のみが立った場合の例で言うと、
if totalFingers == 1 and handLabel == “Left”:
とすべての10本数の曲げ伸ばしパターンを書きました。しかし、このまま曲げ伸ばしの本数でコマンドを実装もできるかもしれませんが、ちょっと1~5本と動作が大げさなので種類別の1本の曲げ伸ばしでコマンドを実装できないか考えました。以下がその動画です。
☆3. 10本の指の種類を認識させる
動画の最終的なコマンド表示のcodeは次の通りです。
#小指 no.5の認識
if handLabel == “Left” and lmList[20][2] < lmList[18][2]:
#画面上のテキストの表示( cv2.putTextを使います。)
cv2.putText(resize_frame, f’Left’, org=(50, 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1.5, color=(255, 0, 0), thickness=3, lineType=cv2.LINE_4)
cv2.putText(resize_frame, f’Right: pinky finger’, (70, 60), cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.7, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_4)
# ドローンへのコマンド実装
sock.sendto(b’left 30′, tello_address)
print(‘Left’)
次は各指の種類を認識させる方法です。これは前回のフィンガーサインで詳細をご覧ください。
親指の場合: 左手の親指が立てば という条件で以下の通りです。
handLabel == “Left” and lmList[tipIds[0]][1] > lmList[tipIds[0] – 1][1] and totalFingers == 0: #親指 no.1
人差し指の場合:左手の人差し指が立てば という条件で以下の通りです。
handLabel == “Left” and lmList[8][2] < lmList[6][2] and totalFingers == 2: #人差し指 no.2
それぞれ lmList の ID ナンバーで関節の番号を入力しています。
苦労した点は 指の認識が優れていて 手握りしめても こぶしの座標位置の上下で 指が立っている認識してしまう点です。
克服するのに totalFingerを使い 一本のみ立っている場合を条件を追加し うまくいきました。
ただし こぶしを握っていても 親指は関節が短いので 立っていると認識してしまう点が 親指の場合:totalFingers == 0
その他の指の場合:totalFingers == 2 として条件を指定しています。これはprint(totalFinger)で確認しながら条件を決定しました。
マッキーの趣味のドローン YouTube channel
-
自由研究に!「ドローンをつくろう!学ぼう!」by 神戸ロボットクラブ
ドローンを組み立てながら飛ぶ仕組みを学ぼう!! 開催者:NPO法人神戸ロボットクラブ 👉 ご…
-
保護中: LiteBee Wing/ SKY / Tello でドローンプログラミングを教えます。プログラミングしたい人集まれ(^^♪
この投稿はパスワードで保護されているため抜粋文はありません。
-
ロボットアームのジェスチャーコントロールへの挑戦 からだアクション操作*目指せ老後の食事介助アーム*
ロボットアームをジェスチャーコントロールできたらいいのになぁ!アニメのように体のアクションでロボットコントロー…
月 | 火 | 水 | 木 | 金 | 土 | 日 |
---|---|---|---|---|---|---|
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 |