Cuprins:

Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor: 13 pași (cu imagini)
Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor: 13 pași (cu imagini)

Video: Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor: 13 pași (cu imagini)

Video: Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor: 13 pași (cu imagini)
Video: Часть 1. Аудиокнига Герберта Уэллса «Машина времени» (гл. 01–06) 2024, Noiembrie
Anonim
Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor
Gesture Hawk: Robot controlat prin gesturi manuale folosind interfața bazată pe procesarea imaginilor

Gesture Hawk a fost prezentat în TechEvince 4.0 ca o interfață simplă bazată pe procesarea imaginilor om-mașină. Utilitatea sa constă în faptul că nu sunt necesari senzori suplimentari sau portabili, cu excepția unei mănuși, pentru a controla mașina robotică care funcționează pe principiul acționării diferențiale. În acest instructable, vă vom conduce prin principiul de lucru din spatele urmăririi obiectelor și a detectării gesturilor utilizate în sistem. Codul sursă al acestui proiect poate fi descărcat de pe Github prin link:

Pasul 1: LUCRURI NECESARE:

LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
LUCRURI NECESARE
  1. Driver motor L298N
  2. DC Motors
  3. Șasiu auto robot
  4. Arduino Uno
  5. Baterii LiPo
  6. Cablu USB Arduino (lung)
  7. Biblioteca OpenCV cu Python

Pasul 2: PRINCIPIUL DE LUCRU:

PRINCIPIUL DE FUNCȚIONARE
PRINCIPIUL DE FUNCȚIONARE

Gesture Hawk este un sistem de procesare în trei faze, după cum puteți vedea în diagrama de mai sus.

Pasul 3: CAPTURĂ DE INTRARE ȘI PROCESARE:

CAPTURĂ DE INTRARE ȘI PROCESARE
CAPTURĂ DE INTRARE ȘI PROCESARE

Captura de intrare poate fi înțeleasă în categoriile mai largi date în diagrama de mai sus.

Pentru a extrage forma mâinii din mediu, trebuie să folosim mascarea sau filtrarea unei culori definite (în acest caz - albastru violet’). Pentru a face acest lucru, trebuie să convertiți imaginea din format BGR în format HSV, care se poate face folosind următorul fragment de cod.

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

Acum, următorul pas este să găsiți gama dorită de parametri HSV pentru a extrage mâna prin mască sau filtru. Pentru aceasta, cel mai bun mod este de a utiliza bare de cale pentru a găsi o gamă adecvată. Iată captura de ecran a unei bare de urmărire folosită pentru acest proiect.

Pasul 4:

Imagine
Imagine

Pasul 5:

Aici, există un fragment de cod dat mai jos pentru a crea o astfel de bară de urmărire pentru construirea măștii:

import cv2

import numpy ca npdef nimic (x): trece cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nimic) cv2.createTrackbar ('l_S ',' imagine ', 50, 255, nimic) cv2.createTrackbar (' l_V ',' imagine ', 50, 255, nimic) cv2.createTrackbar (' h_H ',' imagine ', 130, 255, nimic) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (cadru, 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. matrice ([lH, lS, lV]) higher_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Pasul 6: PARTEA DE PRELUCRARE:

PARTEA DE PRELUCRARE
PARTEA DE PRELUCRARE

Ei bine, avem forma geometrică a unei mâini, acum este timpul să o exploatăm și să o folosim pentru a ne da seama de gestul mâinii.

Carena convexă:

Prin carena convexă, încercăm să potrivim un poligon aproximativ prin punctele extreme prezente în formă. Imaginea prezentă în stânga arată poligonul aproximativ care a fost atribuit formei cu punctele convexe marcate cu roșu.

Punctele convexe sunt acele puncte în formă care sunt cele mai îndepărtate de o parte a acestui poligon aproximativ. Dar, problema cu carena convexă este că, în timpul calculării sale, vom obține o serie de puncte convexe, dar ceea ce avem nevoie este punctul convex albastru. Vă vom spune de ce este necesar.

Pentru a găsi acest punct convex, trebuie să aplicăm formula distanței perpendiculare pentru a găsi distanța punctului convex cu cea mai apropiată latură. Am observat că punctul albastru ascuțit posedă distanța maximă față de lateral și astfel obținem acest punct.

Pasul 7:

Imagine
Imagine

Pasul 8:

Imagine
Imagine

În continuare trebuie să găsim înclinația liniei care unește vârful degetului mare (sau punctul extrem) la acest punct convex cu orizontală.

Pasul 9:

Imagine
Imagine

În cazul de mai sus, unghiul α ar trebui să fie între 0 și 90 de grade dacă gestul este pentru viraj la stânga. Adică tan (α) ar trebui să fie pozitiv.

Pasul 10:

Imagine
Imagine

În cazul de mai sus, unghiul α ar trebui să fie cuprins între 180 și 90 de grade dacă gestul este pentru virare la dreapta. Adică tan (α) ar trebui să fie negativ.

Prin urmare, dacă Tan α este pozitiv, atunci virează la stânga. Dacă Tan α este negativ, atunci rotiți la dreapta. Acum, este timpul să vedeți cum să detectați cea mai importantă comandă de oprire.

Aici, se analizează un raport specificat (găsit prin lovire și încercare) și, în cazuri maxime, acest raport de distanțe rămâne în acest interval special.

Pasul 11:

Imagine
Imagine

În sfârșit, gestul de mișcare înainte este analizat prin funcția matchShape () în OpenCV. Această funcție compară forma a două contoare, în acest caz, între exemplul de antrenament pe thright în imaginea de mai sus și conturul din partea stângă a imaginii de mai sus. Returnează o valoare cuprinsă între 0 și 2 sau 3, în funcție de variația prezentă sub forma a două contururi. Pentru același contur identic, returnează 0.

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

Aici, cn1 și cnt2 sunt cele două contururi care trebuie comparate.

Pasul 12: CONTROLUL MUȘCĂRII:

CONTROLUL MISCARII
CONTROLUL MISCARII

PySerial:

Am folosit biblioteca PySerial de python pentru a converti datele procesate în date seriale comunicate către Arduino Uno prin cablul USB Arduino. Odată ce un anumit gest a fost detectat de opencv, am creat o variabilă temporară care spune „x” și i-am atribuit o valoare unică și am convertit-o în intrare serială folosind următoarea linie de comandă: -

import serial #pentru a importa biblioteca Pyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # setarea ieșirii seriale.. DENUMIREPORT este numele portului prin care va avea loc transmisia de date.

serial.write (b'x ') # x este alfabetul trimis la port … b este de a converti acest șir în octeți.

Prelucrare Arduino:

Acum, arduino este codat în așa fel încât fiecare serial x diferit este mapat liniar la o anumită acțiune responsabilă pentru o mișcare lină a robotului (să spunem că detectarea gestului din stânga va declanșa motoarele din dreapta pentru a vira la stânga). Putem controla mișcarea fiecărei roți, atât translațional cât și rotațional, schimbând corect codul.

L298N Șofer motor: -

Motor Driver este folosit ca mediator între motor și sursa de alimentare, deoarece motoarele nu pot fi alimentate direct din cauza tensiunilor reduse. Bateria Li-Po este conectată la terminalul său de intrare de 12V și conectăm mufa 5V arduino la mufa de intrare 5V a driverului motorului, conectând în cele din urmă solul Li-Po, precum și arduino într-o priză de masă comună a driverului motorului.

Acum bornele motoarelor sunt conectate la prizele date. În cele din urmă, conectăm terminale de intrare pentru motor la mufele de ieșire PWM de arduino, permițându-ne să decidem cu exactitate aspectele de rotație și de translație ale mișcării.

Recomandat: