Indholdsfortegnelse:

Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade: 13 trin (med billeder)
Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade: 13 trin (med billeder)

Video: Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade: 13 trin (med billeder)

Video: Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade: 13 trin (med billeder)
Video: Gesture Hawk - Hand Gesture Controlled Bot, Robotics Club, IIT Guwahati 2024, Juli
Anonim
Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade
Gesture Hawk: Håndbevægelseskontrolleret robot ved hjælp af billedbehandlingsbaseret grænseflade

Gesture Hawk blev fremvist i TechEvince 4.0 som en simpel billedbehandlingsbaseret grænseflade mellem mennesker og maskiner. Dens anvendelighed ligger i, at der ikke kræves yderligere sensorer eller bærbare undtagen en handske for at styre den robotbil, der kører på differentialdrevsprincip. I denne instruks vil vi tage dig igennem arbejdsprincippet bag objektsporing og gestusdetektering, der bruges i systemet. Kildekoden til dette projekt kan downloades fra Github via link:

Trin 1: NØDVENDIGE TING:

DET KRÆVES
DET KRÆVES
DET KRÆVES
DET KRÆVES
DET KRÆVES
DET KRÆVES
DET KRÆVES
DET KRÆVES
  1. L298N motor driver
  2. DC motorer
  3. Robot chassis
  4. Arduino Uno
  5. LiPo batterier
  6. Arduino USB -kabel (langt)
  7. OpenCV -bibliotek med Python

Trin 2: ARBEJDSPRINCIPP:

ARBEJDSPRINCIPP
ARBEJDSPRINCIPP

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

Trin 3: INPUT FANGST OG BEHANDLING:

INPUT FANGST OG BEHANDLING
INPUT FANGST OG BEHANDLING

Inputfangst kan forstås i de bredere kategorier, der er angivet i diagrammet ovenfor.

For at udtrække håndformen fra miljøet skal vi bruge maskering eller filtrering af en bestemt farve (i dette tilfælde - violet blå’). For at gøre det skal du konvertere billedet fra BGR til HSV -format, der kan gøres ved hjælp af følgende kodestykke.

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

Nu er næste trin at finde det ønskede område af HSV -parametre til at udtrække hånden via maske eller filter. Til dette er den bedste måde at bruge sporstænger til at finde et passende område. Her er skærmbilledet af en sporlinje, der blev brugt til dette projekt.

Trin 4:

Billede
Billede

Trin 5:

Her er der et kodestykke angivet nedenfor for at lave sådan en trackbar til maskekonstruktion:

import cv2

import numpy som npdef ingenting (x): pass cv2.namedWindow ('billede') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, ingenting) cv2.createTrackbar ('l_S ',' billede ', 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 (frame, 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]) højere_R = np.array ([hH, hS, hV]) maske = cv2.inRange (hsv, lavere_R, højere_R) res = cv2.bitwise_and (ramme, ramme, maske = maske) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF hvis k == 27: break cv2.destroyAllWindows ()

Trin 6: BEHANDLINGSDEL:

BEHANDLINGSDEL
BEHANDLINGSDEL

Nå, vi har den geometriske form af en hånd, nu er det tid til at udnytte den og bruge den til at finde ud af håndbevægelsen.

Konveks skrog:

Gennem konveks skrog forsøger vi at passe en omtrentlig polygon via ekstreme punkter til stede i formen. Billedet til venstre viser den omtrentlige polygon, der var blevet tildelt formen med de konvekse punkter markeret med rødt.

Konvekse punkter er de punkter i formen, der er længst fra en side af denne tilnærmede polygon. Men problemet med konveks skrog er, at vi under beregningen får en række af alle de konvekse punkter, men det vi har brug for er det blå spidse konvekse punkt. Vi fortæller dig, hvorfor det er påkrævet.

For at finde dette konvekse punkt skal vi anvende den vinkelrette afstandsformel til at finde afstanden af det konvekse punkt med nærmeste side. Vi observerede, at det blå spidse punkt besidder maksimal afstand fra siden, og så får vi dette punkt.

Trin 7:

Billede
Billede

Trin 8:

Billede
Billede

Dernæst skal vi finde hældningen af linjen, der forbinder tommelfingerspidsen (eller det ekstreme punkt) til dette konvekse punkt med vandret.

Trin 9:

Billede
Billede

I ovenstående tilfælde skal vinklen α være mellem 0 til 90 grader, hvis gestus er til venstresving. Det er tan (α) skal være positivt.

Trin 10:

Billede
Billede

I ovenstående tilfælde skal vinklen α være mellem 180 og 90 grader, hvis gestus er til højresving. Det er tan (α) skal være negativt.

Derfor, hvis Tan α er positiv, derefter venstresving. Hvis Tan α er negativ, så højresving. Nu er det tid til at se, hvordan du finder den vigtigste stopkommando.

Her undersøges et specificeret forhold (fundet ved hit and trial), og i maksimale tilfælde forbliver dette forhold mellem afstande i dette særlige område.

Trin 11:

Billede
Billede

Til sidst analyseres bevægelse i forvejen ved hjælp af matchShape () -funktionen i OpenCV. Denne funktion sammenligner formen af to tællere, i dette tilfælde mellem træningseksempel på vægt i ovenstående billede med konturen i venstre side af ovenstående billede. Den returnerer en værdi, der spænder fra 0 til 2 eller 3, afhængigt af variationen i form af to konturer. For identisk samme kontur returnerer den 0.

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

Her er cn1 og cnt2 de to konturer, der skal sammenlignes.

Trin 12: MOTION CONTROL:

BEVÆGELSESKONTROL
BEVÆGELSESKONTROL

PySerial:

Vi brugte PySerial -biblioteket i python til at konvertere de behandlede data til serielle data, der skulle kommunikeres til Arduino Uno via Arduino USB -kabel. Når en bestemt gest blev opdaget af opencv, oprettede vi en midlertidig variabel, der siger 'x', og tildelte den en unik værdi og konverterede den til seriel input ved hjælp af følgende kommandolinje:-

importer serie #til at importere Pyserial bibliotek

serial. Serial ('', baudrate = '9600', timeout = '0') # opsætning af seriel output.. PORT NAME er navnet på den port, hvormed dataoverførsel vil finde sted.

serial.write (b'x ') # x er alfabetet sendt til porten … b er at konvertere denne streng til bytes.

Arduino behandling:

Nu er arduino kodet på en sådan måde, at hver anden seriel x er lineært kortlagt til en bestemt handling, der er ansvarlig for en jævn bevægelse af robotten (sig påvisning af venstre gestus vil udløse motorerne til højre for at dreje til venstre). Vi kan kontrollere hvert hjuls bevægelse både translationelt og rotationsmæssigt ved at ændre koden korrekt.

L298N Motor driver:-

Motordriver bruges som mægler mellem motor og strømkilde, da motorer ikke kan drives direkte på grund af lave spændinger. Li-Po-batteri er tilsluttet sin 12V-indgangsterminal, og vi tilslutter arduinos 5V-stik til motordriverens 5V-indgangsstik, der endelig forbinder jord af Li-Po samt arduino i en fælles jordstik til motordriveren.

Nu er motorernes terminaler forbundet med de angivne stik. Endelig forbinder vi indgangsterminaler til motor til PWM -udgangsstik på arduino, så vi kan bestemme rotations- og oversættelsesaspekterne af bevægelse nøjagtigt.

Anbefalede: