Sadržaj:

Jastreb gesta: Robot kontroliran pokretima rukom koji koristi sučelje za obradu slike: 13 koraka (sa slikama)
Jastreb gesta: Robot kontroliran pokretima rukom koji koristi sučelje za obradu slike: 13 koraka (sa slikama)

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

Video: Jastreb gesta: Robot kontroliran pokretima rukom koji koristi sučelje za obradu slike: 13 koraka (sa slikama)
Video: Часть 2 — Аудиокнига Джеймса Фенимора Купера «Последний из могикан» (гл. 06–10) 2024, Studeni
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 predstavljen je u TechEvince 4.0 kao jednostavno sučelje čovjek-stroj 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 nosive rukavice osim rukavice. U ovom uputstvu provest ćemo vas kroz princip rada koji prati praćenje objekata i detekciju gesta koji se koriste u sustavu. Izvorni kod ovog projekta može se preuzeti s Githuba putem veze:

Korak 1: POTREBNE STVARI:

POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
  1. Vozač motora L298N
  2. Motori istosmjerne struje
  3. Šasija robotskog automobila
  4. Arduino Uno
  5. LiPo baterije
  6. Arduino USB kabel (dugačak)
  7. Knjižnica OpenCV s Pythonom

Korak 2: NAČELO RADA:

PRINCIP RADA
PRINCIP RADA

Gesture Hawk je trofazni sustav obrade kao što možete vidjeti na gornjem dijagramu.

Korak 3: ULAZITE HVATANJE I OBRADU:

ULAZNO ULAGANJE I OBRADA
ULAZNO ULAGANJE I OBRADA

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

Da bismo iz ruke izvukli oblik ruke, moramo koristiti maskiranje ili filtriranje određene boje (u ovom slučaju - ljubičasto plave boje). 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)

Sljedeći korak je pronaći željeni raspon parametara HSV -a za izvlačenje ruke kroz masku ili filter. U tu svrhu najbolji je način da upotrijebite gusjenice za pronalaženje odgovarajućeg raspona. Evo snimke zaslona trake za praćenje korištene za ovaj projekt.

Korak 4:

Slika
Slika

5. korak:

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

uvoz cv2

uvoz numpy kao npdef nothing (x): pass 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]) viš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 za utvrđivanje geste 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 s ispupčenim toč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 taj što ćemo tijekom njegova izračuna dobiti niz svih konveksnih točaka, ali ono što nam je potrebno je plava šiljasta konveksna točka. 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 točka ima maksimalnu udaljenost od strane i tako smo dobili ovu točku.

Korak 7:

Slika
Slika

Korak 8:

Slika
Slika

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

Korak 9:

Slika
Slika

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

10. korak:

Slika
Slika

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

Stoga, ako je Tan α pozitivan, tada skrenite ulijevo. Ako je Tan α negativan, tada skrenite udesno. 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 taj omjer udaljenosti ostaje u ovom određenom rasponu.

11. korak:

Slika
Slika

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 usporediti.

Korak 12: KONTROLA POKRETA:

KONTROLA POKRETA
KONTROLA POKRETA

PySerial:

Koristili smo PySerial knjižnicu 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đenu gestu, 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 treba pretvoriti ovaj niz 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 koristi se kao posrednik između motora i izvora napajanja jer se motori ne mogu izravno 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 dane utičnice. Na kraju povezujemo ulazne stezaljke za motor s PWM izlaznim utičnicama arduina, dopuštajući nam da slobodno odlučujemo o rotacijskim i translacijskim aspektima kretanja.

Preporučeni: