Sadržaj:

Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike: 13 koraka (sa slikama)
Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike: 13 koraka (sa slikama)

Video: Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike: 13 koraka (sa slikama)

Video: Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike: 13 koraka (sa slikama)
Video: REVAN - THE COMPLETE STORY 2024, Novembar
Anonim
Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike
Jastreb gesta: Robot kontroliran pokretima rukom koristeći sučelje za obradu slike

Gesture Hawk je predstavljen u TechEvince 4.0 kao jednostavno sučelje čovjek-mašina zasnovano na obradi slike. Njegova korisnost leži u činjenici da za upravljanje robotskim automobilom koji radi na principu diferencijalnog pogona nisu potrebni nikakvi dodatni senzori ili nošenje osim rukavice. U ovom uputstvu ćemo vas provesti kroz princip rada iza praćenja objekata i detekcije pokreta koji se koriste u sistemu. Izvorni kod ovog projekta može se preuzeti sa Github-a putem veze:

Korak 1: POTREBNE STVARI:

POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
  1. L298N Vozač motora
  2. DC motori
  3. Šasija robotskog automobila
  4. Arduino Uno
  5. LiPo baterije
  6. Arduino USB kabel (dugačak)
  7. OpenCV biblioteka sa Pythonom

Korak 2: PRINCIP RADA:

NAČELO RADA
NAČELO RADA

Gesture Hawk je trofazni sistem za obradu kao što možete vidjeti na gornjem dijagramu.

Korak 3: ULAZITE HVATANJE I OBRADU:

ULAZENJE I OBRADA ULAZA
ULAZENJE I OBRADA ULAZA

Hvatanje ulaza može se shvatiti u širim kategorijama datim u gornjem dijagramu.

Da bismo izvukli oblik ruke iz okoline, moramo koristiti maskiranje ili filtriranje određene boje (u ovom slučaju - ljubičasto plave’). Da biste to učinili, morate pretvoriti sliku iz BGR u HSV format što se može učiniti pomoću sljedećeg isječka koda.

hsv = cv2.cvtBoja (okvir, cv2. COLOR_BGR2HSV)

Sada je sljedeći korak pronaći željeni raspon parametara HSV -a kako biste izvukli ruku preko maske ili filtera. Za to je najbolji način da upotrijebite gusjenice za pronalaženje odgovarajućeg dometa. Evo snimke ekrana trake za praćenje korištene za ovaj projekt.

Korak 4:

Image
Image

Korak 5:

Evo dolje navedenog isječka koda za izradu takve trake za izradu maski:

import cv2

uvesti numpy kao npdef ništa (x): proći cv2. namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nothing) cv2.createTrackbar ('l_S ',' image ', 50, 255, nothing) cv2.createTrackbar (' l_V ',' image ', 50, 255, nothing) cv2.createTrackbar (' h_H ',' image ', 130, 255, nothing) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (okvir, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'slika') lS = cv2.getTrackbarPos ('l_S', 'slika') 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. niz ([lH, lS, lV]) veći_R = np. niz ([hH, hS, hV]) maska = cv2.inRange (hsv, niži_R, viši_R) res = cv2.bitni_i (okvir, okvir, maska = maska) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Korak 6: DIO OBRADE:

DIO OBRADE
DIO OBRADE

Pa, dobili smo geometrijski oblik ruke, sada je vrijeme da je iskoristimo i iskoristimo da shvatimo pokret ruke.

Konveksni trup:

Kroz konveksni trup pokušavamo uklopiti približni poligon preko ekstremnih točaka prisutnih u obliku. Slika prisutna s lijeve strane prikazuje približni poligon koji je dodijeljen obliku sa ispupčenim tačkama označenim crvenom bojom.

Konveksne točke su one točke u obliku koje su najudaljenije od stranice ovog približnog poligona. No, problem s konveksnim trupom je u tome što ćemo tijekom njegovog izračunavanja dobiti niz svih konveksnih točaka, ali ono što nam je potrebno je konveksna točka plave šiljate. Reći ćemo vam zašto je to potrebno.

Da bismo pronašli ovu konveksnu točku, moramo primijeniti formulu okomite udaljenosti za pronalaženje udaljenosti konveksne točke s najbližom stranom. Uočili smo da plava šiljasta tačka posjeduje maksimalnu udaljenost od strane i tako smo dobili ovu tačku.

Korak 7:

Image
Image

Korak 8:

Image
Image

Zatim moramo pronaći nagib linije koja spaja vrh palca (ili krajnju točku) s ovom ispupčenom točkom s vodoravno.

Korak 9:

Image
Image

U gornjem slučaju, kut α trebao bi biti između 0 do 90 stupnjeva ako je pokret za skretanje ulijevo. To jest, tan (α) bi trebao biti pozitivan.

Korak 10:

Image
Image

U gornjem slučaju, kut α trebao bi biti između 180 do 90 stupnjeva ako je pokret za desno skretanje. To jest, tan (α) bi trebao biti negativan.

Stoga, ako je Tan α pozitivan, onda skrenite ulijevo. Ako je Tan α negativan, tada skrenite desno. Sada je vrijeme da vidimo kako otkriti najvažniju naredbu stop.

Ovdje se ispituje određeni omjer (utvrđen pogotkom i pokušajem), au najvećim slučajevima ovaj omjer udaljenosti ostaje u ovom određenom rasponu.

Korak 11:

Image
Image

Konačno, pokret prema naprijed analizira funkcija matchShape () u OpenCV -u. Ova funkcija uspoređuje oblik dva brojača, u ovom slučaju, između primjera vježbanja na desnoj strani na gornjoj slici s konturom na lijevoj strani gornje slike. Vraća vrijednost u rasponu od 0 do 2 ili 3, ovisno o varijaciji u obliku dvije konture. Za identično istu konturu vraća 0.

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

Ovdje su cn1 i cnt2 dvije konture koje treba uporediti.

Korak 12: KONTROLA POKRETA:

KONTROLA POKRETA
KONTROLA POKRETA

PySerial:

Koristili smo PySerial biblioteku pythona za pretvaranje obrađenih podataka u serijske podatke koji se komuniciraju s Arduino Uno putem Arduino USB kabela. Nakon što je opencv otkrio određeni gest, stvorili smo privremenu varijablu recimo "x" i dodijelili joj jedinstvenu vrijednost i pretvorili je u serijski unos pomoću sljedeće naredbene linije:-

import serial #to import Pyserial library

serial. Serial ('', baudrate = '9600', timeout = '0') # postavljanje serijskog izlaza.. PORT NAME je naziv porta preko kojeg će se odvijati prijenos podataka.

serial.write (b'x ') # x je abeceda poslana na port … b je za pretvaranje ovog niza u bajtove.

Arduino obrada:

Sada je arduino kodiran na takav način da se svaki drugačiji serijski x linearno preslikava na određenu radnju odgovornu za glatko kretanje robota (recimo otkrivanje geste lijevo će pokrenuti motore s desne strane da skrenu ulijevo). Kretanje svakog kotača možemo kontrolirati translacijski, kao i rotacijski pravilnom promjenom koda.

L298N Vozač motora:-

Motor Driver se koristi kao posrednik između motora i izvora napajanja jer se motori ne mogu direktno napajati zbog niskog napona. Li-Po baterija spojena je na svoj 12V ulazni priključak i povezujemo arduinovu 5V utičnicu s 5V ulaznom utičnicom vozača motora konačno povezujući uzemljenje Li-Po-a, kao i arduino u zajedničku uzemljenu utičnicu upravljačkog programa motora.

Sada su terminali motora spojeni na date utičnice. Konačno, priključujemo ulazne terminale za motor na PWM izlazne utičnice arduina, dopuštajući nam da slobodno odlučujemo o rotacijskim i translacijskim aspektima kretanja.

Preporučuje se: