Table des matières:
- Étape 1: CHOSES REQUISES:
- Étape 2: PRINCIPE DE FONCTIONNEMENT:
- Étape 3: SAISIE ET TRAITEMENT DES ENTRÉES:
- Étape 4:
- Étape 5:
- Étape 6: PARTIE DE TRAITEMENT:
- Étape 7:
- Étape 8:
- Étape 9:
- Étape 10:
- Étape 11:
- Étape 12: CONTRLE DE MOUVEMENT:
- Étape 13:
Vidéo: Gesture Hawk : Robot contrôlé par gestes manuels utilisant une interface basée sur le traitement d'images : 13 étapes (avec images)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:08
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:
- Pilote de moteur L298N
- Moteurs à courant continu
- Châssis de voiture robot
- Arduino Uno
- Batteries LiPo
- Câble USB Arduino (long)
- Bibliothèque OpenCV avec Python
Étape 2: 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:
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:
É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:
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:
Étape 8:
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:
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:
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:
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:
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é:
Comment créer une domotique basée sur l'IoT avec le relais de contrôle des capteurs NodeMCU : 14 étapes (avec photos)
Comment faire de la domotique basée sur l'IoT avec le relais de contrôle des capteurs NodeMCU : Dans ce projet basé sur l'IoT, j'ai réalisé la domotique avec le module de relais de contrôle Blynk et NodeMCU avec retour en temps réel. En mode manuel, ce module de relais peut être contrôlé à partir d'un mobile ou d'un smartphone et, commutateur manuel. En mode automatique, cette smar
Robot SCARA : apprentissage de la cinématique directe et inverse !!! (Plot Twist Apprenez à créer une interface en temps réel dans ARDUINO en utilisant PROCESSING !!!!): 5 étapes (avec images)
Robot SCARA : apprentissage de la cinématique directe et inverse !!! (Plot Twist Apprenez à créer une interface en temps réel dans ARDUINO en utilisant PROCESSING !!!!): Un robot SCARA est une machine très populaire dans le monde de l'industrie. Le nom signifie à la fois le bras de robot d'assemblage conforme sélectif ou le bras de robot articulé conforme à la sélection. Il s'agit essentiellement d'un robot à trois degrés de liberté, étant les deux premiers displ
RC Rover contrôlé par des gestes, des mouvements et une manette : 8 étapes
RC Rover Controlled by Gestures Motions & Joyestick : RC Rover est un projet de robotique qui vise à améliorer le contrôle du rover grâce à l'utilisation de la radiofréquence et l'interaction du mouvement du rover avec le mouvement de la main à l'aide de la centrale inertielle (MPU6050), mais aussi le contrôle de ce Rover avec un Joyestik. Tous
Installation de Windows sur un lecteur externe avec une partition Mac sur Mac : 5 étapes (avec images)
Installation de Windows sur un lecteur externe avec une partition Mac sur Mac : si vous avez acheté quelque chose comme un MacBook pro de base et économisé un peu d'argent, mais que vous rencontrez rapidement un problème de stockage lorsque vous essayez d'installer Windows à l'aide de Bootcamp, nous savons tous que 128 Go ne suffisent pas. ceux-ci afin que nous ayons peut-être acheté quelque chose de li
Réalité virtuelle mobile utilisant le traitement pour Android (TfCD) : 7 étapes (avec images)
Réalité virtuelle mobile utilisant le traitement pour Android (TfCD) : La réalité virtuelle (VR) est l'une des nouvelles technologies qui pourraient être intéressantes pour les futurs produits. Il a beaucoup d'opportunités et vous n'avez même pas besoin de lunettes VR chères (Oculus Rift). Cela peut sembler très difficile à faire soi-même, mais les bases sont