Table des matières:

Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)
Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)

Vidéo: Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)

Vidéo: Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)
Vidéo: Generation Nord One-Shot 2024, Novembre
Anonim
Gesture Hawk: Robot à commande gestuelle utilisant une interface basée sur le traitement d'images
Gesture Hawk: Robot à commande gestuelle utilisant une interface basée sur le traitement d'images

Gesture Hawk a été présenté dans TechEvince 4.0 comme une simple interface homme-machine basée sur le traitement d'images. Son utilité réside dans le fait qu'aucun capteur ou appareil portable supplémentaire, à l'exception d'un gant, n'est requis pour contrôler la voiture robotique qui fonctionne selon le principe d'entraînement différentiel. Dans ce instructable, nous vous expliquerons le principe de fonctionnement du suivi des objets et de la détection des gestes utilisés dans le système. Le code source de ce projet peut être téléchargé depuis Github via le lien:

Étape 1: CHOSES REQUISES:

CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
CHOSES REQUISES
  1. Pilote de moteur L298N
  2. Moteurs à courant continu
  3. Châssis de voiture robot
  4. Arduino Uno
  5. Batteries LiPo
  6. Câble USB Arduino (long)
  7. Bibliothèque OpenCV avec Python

Étape 2: PRINCIPE DE FONCTIONNEMENT:

PRINCIPE DE FONCTIONNEMENT
PRINCIPE DE FONCTIONNEMENT

Gesture Hawk est un système de traitement en trois phases comme vous pouvez le voir dans le schéma ci-dessus.

Étape 3: SAISIE ET TRAITEMENT DES ENTRÉES:

SAISIE ET TRAITEMENT DES ENTRÉES
SAISIE ET TRAITEMENT DES ENTRÉES

La capture d'entrée peut être comprise dans les catégories plus larges indiquées dans le diagramme ci-dessus.

Pour extraire la forme de la main de l'environnement, nous devons utiliser un masquage ou un filtrage d'une couleur définie (dans ce cas, le bleu violet). Pour ce faire, vous devez convertir l'image du format BGR au format HSV, ce qui peut être fait en utilisant l'extrait de code suivant.

hsv = cv2.cvtColor(cadre, cv2. COLOR_BGR2HSV)

Maintenant, l'étape suivante consiste à trouver la plage souhaitée de paramètres HSV pour extraire la main via un masque ou un filtre. Pour cela, le meilleur moyen est d'utiliser des barres de suivi pour trouver une plage appropriée. Voici la capture d'écran d'une barre de piste utilisée pour ce projet.

Étape 4:

Image
Image

Étape 5:

Ici, il y a un extrait de code donné ci-dessous pour créer une telle barre de suivi pour la construction de masques:

importer cv2

importer numpy en tant que npdef rien(x): passer cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, rien) cv2.createTrackbar('l_S ', 'image', 50, 255, rien) cv2.createTrackbar('l_V', 'image', 50, 255, rien) cv2.createTrackbar('h_H', 'image', 130, 255, rien) cv2. createTrackbar('h_S', 'image', 255, 255, rien) cv2.createTrackbar('h_V', 'image', 255, 255, rien) while(1): _, frame = img.read()

hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbarPos('l_V', 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') lower_R = np. array([lH, lS, lV]) upper_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, upper_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF si k == 27: casser cv2.destroyAllWindows()

Étape 6: PARTIE DE TRAITEMENT:

PARTIE DE TRAITEMENT
PARTIE DE TRAITEMENT

Eh bien, nous avons la forme géométrique d'une main, il est maintenant temps de l'exploiter et de l'utiliser pour comprendre le geste de la main.

Enveloppe convexe:

Grâce à l'enveloppe convexe, nous essayons d'ajuster un polygone approximatif via des points extrêmes présents dans la forme. L'image présente à gauche montre le polygone approximatif qui avait été attribué à la forme avec les points convexes marqués en rouge.

Les points convexes sont les points de la forme qui sont les plus éloignés d'un côté de ce polygone approximé. Mais, le problème avec l'enveloppe convexe est que lors de son calcul, nous obtiendrons un tableau de tous les points convexes mais ce dont nous avons besoin est le point convexe pointu bleu. Nous vous dirons pourquoi c'est nécessaire.

Pour trouver ce point convexe, nous devons appliquer la formule de distance perpendiculaire pour trouver la distance du point convexe avec le côté le plus proche. Nous avons observé que le point pointu bleu possède une distance maximale du côté et nous obtenons donc ce point.

Étape 7:

Image
Image

Étape 8:

Image
Image

Ensuite il faut trouver l'inclinaison de la ligne joignant le bout du pouce (ou le point extrême) à ce point convexe à l'horizontale.

Étape 9:

Image
Image

Dans le cas ci-dessus, l'angle α doit être compris entre 0 et 90 degrés si le geste est pour un virage à gauche. C'est-à-dire que tan (α) devrait être positif.

Étape 10:

Image
Image

Dans le cas ci-dessus, l'angle α doit être compris entre 180 et 90 degrés si le geste est pour un virage à droite. C'est-à-dire que tan(α) devrait être négatif.

Par conséquent, si Tan est positif, alors tournez à gauche. Si Tan α est négatif, alors tournez à droite. Maintenant, il est temps de voir comment détecter la commande d'arrêt la plus importante.

Ici, un rapport spécifié (trouvé par coup et essai) est examiné et dans le maximum de cas, ce rapport de distances reste dans cette plage particulière.

Étape 11:

Image
Image

Enfin, le geste de mouvement vers l'avant est analysé par la fonction matchShape() dans OpenCV. Cette fonction compare la forme de deux compteurs, dans ce cas, entre l'exemple d'entraînement sur la droite de l'image ci-dessus et le contour sur le côté gauche de l'image ci-dessus. Il renvoie une valeur allant de 0 à 2 ou 3, selon la variation présente dans la forme de deux contours. Pour un contour identique, il renvoie 0.

ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)

Ici, cn1 et cnt2 sont les deux contours à comparer.

Étape 12: CONTRLE DE MOUVEMENT:

CONTRÔLE DE MOUVEMENT
CONTRÔLE DE MOUVEMENT

PySérie:

Nous avons utilisé la bibliothèque PySerial de python pour convertir les données traitées en données série à communiquer à Arduino Uno via un câble USB Arduino. Une fois qu'un geste particulier a été détecté par opencv, nous avons créé une variable temporaire, disons « x » et lui avons attribué une valeur unique et l'avons convertie en entrée série à l'aide de la ligne de commande suivante:

importer le numéro de série pour importer la bibliothèque Pyserial

serial. Serial('', baudrate = '9600', timeout = '0') # configuration de la sortie série.. PORT NAME est le nom du port par lequel la transmission de données se produira.

serial.write(b'x') # x est l'alphabet envoyé au port …b est de convertir cette chaîne en octets.

Traitement Arduino:

Maintenant, arduino est codé de manière à ce que chaque série x différente soit linéairement mappée à une certaine action responsable d'un mouvement fluide du robot (disons que la détection du geste gauche déclenchera les moteurs à droite pour tourner à gauche). Nous pouvons contrôler le mouvement de chaque roue en translation ainsi qu'en rotation en changeant le code correctement.

Pilote de moteur L298N:-

Motor Driver est utilisé comme médiateur entre le moteur et la source d'alimentation, car les moteurs ne peuvent pas être directement alimentés en raison des faibles tensions nominales. La batterie Li-Po est connectée à sa borne d'entrée 12V et nous connectons la prise 5V d'arduino à la prise d'entrée 5V du pilote de moteur, connectant enfin la terre de Li-Po ainsi que l'arduino dans une prise de terre commune du pilote de moteur.

Maintenant, les bornes des moteurs sont connectées aux prises indiquées. Enfin, nous connectons les bornes d'entrée du moteur aux prises de sortie PWM de l'arduino, ce qui nous permet de décider avec précision les aspects de rotation et de translation du mouvement.

Conseillé: