Innholdsfortegnelse:

Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 trinn (med bilder)
Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 trinn (med bilder)

Video: Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 trinn (med bilder)

Video: Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 trinn (med bilder)
Video: 125 Innovative Electric Vehicles and Personal Transports 2024, November
Anonim
Gesture Hawk: Håndbevegelseskontrollert robot ved hjelp av bildebehandlingsbasert grensesnitt
Gesture Hawk: Håndbevegelseskontrollert robot ved hjelp av bildebehandlingsbasert grensesnitt

Gesture Hawk ble vist frem i TechEvince 4.0 som et enkelt bildebehandlingsbasert grensesnitt mellom mennesker og maskiner. Dens nytte ligger i det faktum at det ikke er nødvendig med flere sensorer eller bærbare unntatt en hanske for å kontrollere robotbilen som kjører på differensialdriftsprinsipp. I denne instruksen tar vi deg gjennom arbeidsprinsippet bak objektsporing og gestdeteksjon som brukes i systemet. Kildekoden til dette prosjektet kan lastes ned fra Github via lenke:

Trinn 1: KRAV:

TING KREVER
TING KREVER
TING KREVER
TING KREVER
TING KREVER
TING KREVER
TING KREVER
TING KREVER
  1. L298N motor driver
  2. DC Motors
  3. Robotbilchassis
  4. Arduino Uno
  5. LiPo batterier
  6. Arduino USB -kabel (lang)
  7. OpenCV -bibliotek med Python

Trinn 2: ARBEIDSPRINSIPP:

ARBEIDSPRINSIPP
ARBEIDSPRINSIPP

Gesture Hawk er et trefaset behandlingssystem som du kan se i diagrammet ovenfor.

Trinn 3: INPUT FANGST OG BEHANDLING:

INNLEDNING FANGST OG BEHANDLING
INNLEDNING FANGST OG BEHANDLING

Inndatafangst kan forstås i de større kategoriene gitt i diagrammet ovenfor.

For å trekke ut håndformen fra miljøet, må vi bruke maskering eller filtrering av en bestemt farge (i dette tilfellet - fiolettblått). For å gjøre det må du konvertere bildet fra BGR til HSV -format som kan gjøres ved å bruke følgende kodebit.

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

Nå er neste trinn å finne ønsket utvalg av HSV -parametere for å trekke ut hånden via maske eller filter. For dette er den beste måten å bruke sporstenger for å finne et passende område. Her er skjermbildet av en sporbar som ble brukt til dette prosjektet.

Trinn 4:

Bilde
Bilde

Trinn 5:

Her er det en kodebit nedenfor for å lage en slik sporbar for maskekonstruksjon:

importer cv2

importer numpy som npdef ingenting (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, ingenting) cv2.createTrackbar ('l_S ',' image ', 50, 255, ingenting) cv2.createTrackbar (' l_V ',' image ', 50, 255, ingenting) cv2.createTrackbar (' h_H ',' image ', 130, 255, ingenting) cv2. createTrackbar ('h_S', 'image', 255, 255, ingenting) cv2.createTrackbar ('h_V', 'image', 255, 255, ingenting) mens (1): _, frame = img.read ()

hsv = cv2.cvtColor (ramme, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_ 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') lavere_R = np. array ([lH, lS, lV]) higher_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (ramme, ramme, maske = maske) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Trinn 6: BEHANDLINGSDEL:

BEHANDLINGSDEL
BEHANDLINGSDEL

Vel, vi har den geometriske formen på en hånd, nå er det på tide å utnytte den og bruke den til å finne ut håndbevegelsen.

Konveks skrog:

Gjennom konveks skrog prøver vi å passe en omtrentlig polygon via ekstreme punkter i formen. Bildet til venstre viser den omtrentlige polygonen som hadde blitt tildelt formen med de konvekse punktene merket med rødt.

Konvekse punkter er de punktene i formen som er lengst fra en side av denne tilnærmede polygonen. Men problemet med konveks skrog er at vi under beregningen vil få en rekke med alle de konvekse punktene, men det vi trenger er det blåspisse konvekse punktet. Vi vil fortelle deg hvorfor det er nødvendig.

For å finne dette konvekse punktet, må vi bruke formelen for vinkelrett avstand for å finne avstanden til det konvekse punktet med nærmeste side. Vi observerte at det blå spisse punktet har maksimal avstand fra siden, og så får vi dette punktet.

Trinn 7:

Bilde
Bilde

Trinn 8:

Bilde
Bilde

Deretter må vi finne skråningen av linjen som forbinder tuppen av tommelen (eller ekstrempunktet) til dette konvekse punktet med horisontal.

Trinn 9:

Bilde
Bilde

I tilfellet ovenfor bør vinkelen α være mellom 0 og 90 grader hvis bevegelsen er for venstresving. Det er tan (α) skal være positivt.

Trinn 10:

Bilde
Bilde

I tilfellet ovenfor skal vinkelen α være mellom 180 og 90 grader hvis bevegelsen er for høyresving. Det er tan (α) bør være negativ.

Derfor, hvis Tan α er positiv, så venstresving. Hvis Tan α er negativ, så høyresving. Nå er det på tide å se hvordan du oppdager den viktigste stoppkommandoen.

Her blir et spesifisert forhold (funnet ved treff og forsøk) undersøkt, og i maksimale tilfeller forblir dette avstandsforholdet i dette bestemte området.

Trinn 11:

Bilde
Bilde

Til slutt blir bevegelsesbevegelsen forover analysert av matchShape () -funksjonen i OpenCV. Denne funksjonen sammenligner formen på to tellere, i dette tilfellet, mellom treningseksempel på vekt i bildet ovenfor med konturen i venstre side av bildet ovenfor. Den returnerer en verdi fra 0 til 2 eller 3, i henhold til variasjonen som er tilstede i form av to konturer. For identisk samme kontur returnerer den 0.

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

Her er cn1 og cnt2 de to konturene som skal sammenlignes.

Trinn 12: BEVEGELSESKONTROLL:

BEVEGELSESKONTROLL
BEVEGELSESKONTROLL

PySerial:

Vi brukte PySerial -biblioteket til python for å konvertere de behandlede dataene til serielle data som ble kommunisert til Arduino Uno via Arduino USB -kabel. Når en bestemt gest ble oppdaget av opencv, opprettet vi en midlertidig variabel som sa 'x' og tildelte den en unik verdi og konverterte den til serieinngang ved å bruke følgende kommandolinje:-

importer serie #for å importere Pyserial -bibliotek

serial. Serial ('', baudrate = '9600', timeout = '0') # konfigurering av serieutgang.. PORTNAVN er navnet på porten som dataoverføring vil skje med.

serial.write (b'x ') # x er alfabetet som sendes til porten … b er å konvertere denne strengen til byte.

Arduino behandling:

Nå er arduino kodet på en slik måte at hver forskjellige seriell x blir lineært kartlagt til en viss handling som er ansvarlig for en jevn bevegelse av roboten (si at deteksjon av venstre gest vil utløse motorene til høyre for å svinge til venstre). Vi kan kontrollere bevegelsen til hvert hjul både translasjonelt og rotasjonsmessig ved å endre koden skikkelig.

L298N Motordriver:-

Motordriver brukes som formidler mellom motor og strømkilde siden motorer ikke kan drives direkte på grunn av lav spenning. Li-Po-batteri er koblet til sin 12V-inngangsterminal, og vi kobler arduinos 5V-kontakt til motordriverens 5V-inngangskontakt som til slutt kobler bakken til Li-Po, så vel som arduino i en felles bakke for motordriveren.

Nå er terminalene til motorene koblet til de angitte kontaktene. Til slutt kobler vi inngangsterminaler for motor til PWM -utganger på arduino, slik at vi kan bestemme rotasjons- og oversettelsesaspektene ved bevegelse nøyaktig.

Anbefalt: