Sommario:

Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini: 13 passaggi (con immagini)
Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini: 13 passaggi (con immagini)

Video: Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini: 13 passaggi (con immagini)

Video: Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini: 13 passaggi (con immagini)
Video: Generation Nord One-Shot 2024, Luglio
Anonim
Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini
Gesture Hawk: Robot controllato con gesti della mano che utilizza un'interfaccia basata sull'elaborazione delle immagini

Gesture Hawk è stato presentato in TechEvince 4.0 come una semplice interfaccia uomo-macchina basata sull'elaborazione delle immagini. La sua utilità risiede nel fatto che non sono necessari sensori aggiuntivi o dispositivi indossabili tranne un guanto per controllare l'auto robotica che funziona con il principio di azionamento differenziale. In questo tutorial, ti guideremo attraverso il principio di funzionamento alla base del rilevamento degli oggetti e del rilevamento dei gesti utilizzati nel sistema. Il codice sorgente di questo progetto può essere scaricato da Github tramite link:

Passaggio 1: COSE RICHIESTE:

COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
COSE RICHIESTE
  1. Driver del motore L298N
  2. Motori CC
  3. Telaio per auto robot
  4. Arduino Uno
  5. Batterie LiPo
  6. Cavo USB Arduino (lungo)
  7. Libreria OpenCV con Python

Fase 2: PRINCIPIO DI FUNZIONAMENTO:

PRINCIPIO DI FUNZIONAMENTO
PRINCIPIO DI FUNZIONAMENTO

Gesture Hawk è un sistema di elaborazione trifase come puoi vedere nel diagramma sopra.

Passaggio 3: CATTURA ED ELABORAZIONE INPUT:

CATTURA INGRESSO ED ELABORAZIONE
CATTURA INGRESSO ED ELABORAZIONE

La cattura dell'input può essere compresa nelle categorie più ampie fornite nel diagramma sopra.

Per estrarre la forma della mano dall'ambiente, dobbiamo usare mascherature o filtri di un colore definito (in questo caso - viola blu'). Per fare ciò è necessario convertire l'immagine dal formato BGR al formato HSV che può essere eseguito utilizzando il seguente frammento di codice.

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

Ora, il prossimo passo è trovare l'intervallo desiderato di parametri HSV per estrarre la mano tramite maschera o filtro. Per questo, il modo migliore è utilizzare le barre di traccia per trovare un intervallo adatto. Ecco lo screenshot di una barra di traccia utilizzata per questo progetto.

Passaggio 4:

Immagine
Immagine

Passaggio 5:

Qui, c'è uno snippet di codice riportato di seguito per creare una trackbar di questo tipo per la costruzione della maschera:

importa cv2

import numpy as npdef niente(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, niente) cv2.createTrackbar('l_S ', 'image', 50, 255, niente) cv2.createTrackbar('l_V', 'image', 50, 255, niente) cv2.createTrackbar('h_H', 'image', 130, 255, niente) cv2. createTrackbar('h_S', 'image', 255, 255, niente) cv2.createTrackbar('h_V', 'image', 255, 255, niente) 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 se k == 27: break cv2.destroyAllWindows()

Fase 6: PARTE ELABORAZIONE:

PARTE LAVORANTE
PARTE LAVORANTE

Bene, abbiamo la forma geometrica di una mano, ora è il momento di sfruttarla e utilizzarla per capire il gesto della mano.

Scafo convesso:

Attraverso lo scafo convesso, cerchiamo di adattare un poligono approssimativo tramite i punti estremi presenti nella forma. L'immagine presente a sinistra mostra il poligono approssimativo che era stato assegnato alla forma con i punti convessi contrassegnati in rosso.

I punti convessi sono quei punti nella forma che sono più lontani da un lato di questo poligono approssimato. Ma il problema con l'inviluppo convesso è che durante il suo calcolo, otterremo un array di tutti i punti convessi, ma ciò di cui abbiamo bisogno è il punto convesso a punta blu. Ti diremo perché è richiesto.

Per trovare questo punto convesso, dobbiamo applicare la formula della distanza perpendicolare per trovare la distanza del punto convesso con il lato più vicino. Abbiamo osservato che il punto appuntito blu possiede la massima distanza dal lato e quindi otteniamo questo punto.

Passaggio 7:

Immagine
Immagine

Passaggio 8:

Immagine
Immagine

Quindi dobbiamo trovare l'inclinazione della linea che unisce la punta del pollice (o il punto estremo) a questo punto convesso con l'orizzontale.

Passaggio 9:

Immagine
Immagine

Nel caso sopra, l'angolo α dovrebbe essere compreso tra 0 e 90 gradi se il gesto è per la svolta a sinistra. Questo è tan(α) dovrebbe essere positivo.

Passaggio 10:

Immagine
Immagine

Nel caso sopra, l'angolo α dovrebbe essere compreso tra 180 e 90 gradi se il gesto è per la svolta a destra. Cioè tan(α) dovrebbe essere negativo.

Pertanto, se Tan α è positivo, allora svolta a sinistra. Se Tan α è negativo, allora svolta a destra. Ora è il momento di vedere come rilevare il comando di arresto più importante.

Qui viene esaminato un rapporto specificato (trovato per hit e trial) e nei casi massimi questo rapporto di distanze rimane in questo particolare intervallo.

Passaggio 11:

Immagine
Immagine

Alla fine, il gesto di movimento in avanti viene analizzato dalla funzione matchShape() in OpenCV. Questa funzione confronta la forma di due contatori, in questo caso, tra l'esempio di allenamento a destra nell'immagine sopra al contorno nella parte sinistra dell'immagine sopra. Restituisce un valore compreso tra 0 e 2 o 3, a seconda della variazione presente nella forma dei due contorni. Per lo stesso contorno identico, restituisce 0.

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

Qui, cn1 e cnt2 sono i due contorni che devono essere confrontati.

Passaggio 12: CONTROLLO DEL MOVIMENTO:

CONTROLLO DEL MOVIMENTO
CONTROLLO DEL MOVIMENTO

PySerial:

Abbiamo utilizzato la libreria PySerial di Python per convertire i dati elaborati in dati seriali da comunicare ad Arduino Uno tramite il cavo USB Arduino. Una volta che un particolare gesto è stato rilevato da opencv, abbiamo creato una variabile temporanea dire "x" e gli abbiamo assegnato un valore univoco e l'abbiamo convertita in input seriale utilizzando la seguente riga di comando: -

import serial #per importare la libreria Pyserial

serial. Serial('', baudrate = '9600', timeout = '0') # impostazione dell'output seriale.. PORT NAME è il nome della porta tramite la quale avverrà la trasmissione dei dati.

serial.write(b'x') # x è l'alfabeto inviato alla porta …b è per convertire questa stringa in byte.

Elaborazione Arduino:

Ora arduino è codificato in modo tale che ogni diverso seriale x sia mappato linearmente a determinate azioni responsabili di un movimento fluido del robot (diciamo che il rilevamento del gesto sinistro attiverà i motori a destra per girare a sinistra). Possiamo controllare il movimento di ciascuna ruota in senso traslazionale e rotatorio modificando il codice in modo appropriato.

L298N Driver del motore:-

Il driver del motore viene utilizzato come mediatore tra il motore e la fonte di alimentazione poiché i motori non possono essere alimentati direttamente a causa dei valori nominali di bassa tensione. La batteria Li-Po è collegata al suo terminale di ingresso da 12 V e colleghiamo la presa da 5 V di arduino alla presa di ingresso da 5 V del driver del motore, infine collegando la terra di Li-Po e arduino in una presa di terra comune del driver del motore.

Ora i terminali dei motori sono collegati alle prese date. Infine colleghiamo i terminali di ingresso per il motore alle prese di uscita PWM di arduino lasciandoci liberi di decidere con precisione gli aspetti di rotazione e traslazione del movimento.

Consigliato: