Innehållsförteckning:

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

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

Video: Gesture Hawk: Hand Gesture Controlled Robot Using Image Processing Based Interface: 13 Steg (med bilder)
Video: Gesture Hawk - Hand Gesture Controlled Bot, Robotics Club, IIT Guwahati 2024, Juli
Anonim
Gesture Hawk: Hand Gesture Controlled Robot med hjälp av bildbehandlingsbaserat gränssnitt
Gesture Hawk: Hand Gesture Controlled Robot med hjälp av bildbehandlingsbaserat gränssnitt

Gesture Hawk presenterades i TechEvince 4.0 som ett enkelt bildbehandlingsbaserat gränssnitt mellan människa och maskin. Dess användbarhet ligger i det faktum att inga ytterligare sensorer eller bärbara förutom en handske krävs för att styra robotbilen som körs på differentialdrivningsprincip. I denna instruktör tar vi dig igenom arbetsprincipen bakom objektspårning och gestdetektering som används i systemet. Källkoden för detta projekt kan laddas ner från Github via länk:

Steg 1: KRAV:

Saker som krävs
Saker som krävs
Saker som krävs
Saker som krävs
Saker som krävs
Saker som krävs
Saker som krävs
Saker som krävs
  1. L298N motorförare
  2. DC -motorer
  3. Robots bilchassi
  4. Arduino Uno
  5. LiPo -batterier
  6. Arduino USB -kabel (lång)
  7. OpenCV -bibliotek med Python

Steg 2: ARBETSPRINCIP:

ARBETSPRINCIP
ARBETSPRINCIP

Gesture Hawk är ett trefasbearbetningssystem som du kan se i diagrammet ovan.

Steg 3: INSPELNINGSFANGST OCH BEHANDLING:

INSPELNINGSFANGST OCH BEHANDLING
INSPELNINGSFANGST OCH BEHANDLING

Inmatningsfångst kan förstås i de större kategorierna som ges i diagrammet ovan.

För att extrahera handformen från miljön måste vi använda maskering eller filtrering av en bestämd färg (i detta fall - violettblått). För att göra det måste du konvertera bilden från BGR till HSV -format som kan göras med följande kodavsnitt.

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

Nu är nästa steg att hitta det önskade intervallet av HSV -parametrar för att extrahera handen via mask eller filter. För detta är det bästa sättet att använda spårstänger för att hitta ett lämpligt område. Här är skärmdumpen av en spårfält som används för detta projekt.

Steg 4:

Bild
Bild

Steg 5:

Här finns ett kodavsnitt nedan för att göra ett sådant spår för maskkonstruktion:

importera cv2

importera numpy som npdef ingenting (x): skicka cv2.namedWindow ('bild') 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) medan (1): _, frame = img.read ()

hsv = cv2.cvtColor (ram, 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') lägre_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 (frame, frame, mask = mask) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Steg 6: BEHANDLINGSDEL:

BEHANDLINGSDEL
BEHANDLINGSDEL

Tja, vi har den geometriska formen på en hand, nu är det dags att utnyttja den och använda den för att räkna ut handgesten.

Konvex skrov:

Genom konvext skrov försöker vi passa en ungefärlig polygon via extrema punkter som finns i formen. Bilden till vänster visar den ungefärliga polygonen som hade tilldelats formen med de konvexa punkterna markerade med rött.

Konvexa punkter är de punkter i formen som är längst bort från en sida av denna approximerade polygon. Men problemet med konvex skrov är att vi under beräkningen kommer att få en rad med alla konvexa punkter men det vi behöver är den blåspetsiga konvexa punkten. Vi kommer att berätta varför det krävs.

För att hitta denna konvexa punkt måste vi tillämpa den vinkelräta avståndsformeln för att hitta avståndet för den konvexa punkten med närmaste sida. Vi observerade att den blåspetsiga punkten har maximalt avstånd från sidan och så får vi denna punkt.

Steg 7:

Bild
Bild

Steg 8:

Bild
Bild

Därefter måste vi hitta lutningen för linjen som förenar tummen (eller extrempunkten) med denna konvexa punkt med horisontell.

Steg 9:

Bild
Bild

I ovanstående fall bör vinkeln α vara mellan 0 till 90 grader om gesten är för vänster sväng. Det är tan (α) bör vara positivt.

Steg 10:

Bild
Bild

I ovanstående fall bör vinkeln α vara mellan 180 och 90 grader om gesten är för höger sväng. Det är tan (α) bör vara negativ.

Om Tan α är positiv, vänster sväng. Om Tan α är negativ, höger sväng. Nu är det dags att se hur man upptäcker det viktigaste stoppkommandot.

Här undersöks ett specificerat förhållande (hittat genom träff och prövning) och i maximala fall kvarstår detta förhållande av avstånd inom detta specifika område.

Steg 11:

Bild
Bild

Äntligen analyseras förflyttningsrörelsen med matchShape () -funktionen i OpenCV. Denna funktion jämför formen på två räknare, i det här fallet, mellan träningsexempel på tright i bilden ovan med konturen på vänster sida av bilden ovan. Det returnerar ett värde som sträcker sig från 0 till 2 eller 3, beroende på variationen som finns i form av två konturer. För samma kontur returnerar den 0.

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

Här är cn1 och cnt2 de två konturerna som ska jämföras.

Steg 12: RÖRELSESKONTROLL:

RÖRELSEKONTROLL
RÖRELSEKONTROLL

PySerial:

Vi använde PySerial -biblioteket för python för att konvertera den bearbetade data till seriell data för att kommuniceras till Arduino Uno via Arduino USB -kabel. När en viss gest detekterades av opencv skapade vi en tillfällig variabel som säger 'x' och tilldelade den ett unikt värde och konverterade det till seriell ingång med följande kommandorad:-

importera serie #för att importera Pyserial -bibliotek

serial. Serial ('', baudrate = '9600', timeout = '0') # inställning av serieutmatning.. PORTNAMN är namnet på porten med vilken dataöverföring kommer att ske.

serial.write (b'x ') # x är alfabetet som skickas till porten … b är att konvertera denna sträng till byte.

Arduino -bearbetning:

Nu är arduino kodat på ett sådant sätt att varje olika seriell x linjärt mappas till viss handling som är ansvarig för en smidig rörelse av roboten (säg att detektering av vänster gest kommer att utlösa motorerna på höger för att svänga vänster). Vi kan styra varje hjuls rörelse såväl translationellt som roterande genom att ändra koden korrekt.

L298N Motorförare:-

Motordrivrutin används som medlare mellan motor och strömkälla eftersom motorer inte kan drivas direkt på grund av låga spänningsbetyg. Li-Po-batteriet är anslutet till dess 12V-ingång och vi ansluter arduinos 5V-uttag till motorförarens 5V-ingångsuttag som slutligen ansluter marken för Li-Po samt arduino i ett gemensamt jorduttag för motorföraren.

Nu är motorernas terminaler anslutna till de angivna uttagen. Slutligen ansluter vi ingångsterminaler för motor till PWM -uttag på arduino så att vi kan bestämma rörelsens rotations- och översättningsaspekter exakt.

Rekommenderad: