Inhoudsopgave:

Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface - Ajarnpa
Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface - Ajarnpa

Video: Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface - Ajarnpa

Video: Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface - Ajarnpa
Video: Part 3 - Lord Jim Audiobook by Joseph Conrad (Chs 13-19) 2024, November
Anonim
Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface
Gesture Hawk: Handgebaargestuurde robot met behulp van op beeldverwerking gebaseerde interface

Gesture Hawk werd in TechEvince 4.0 gepresenteerd als een eenvoudige mens-machine-interface op basis van beeldverwerking. Het nut ervan ligt in het feit dat er geen extra sensoren of wearables nodig zijn, behalve een handschoen, om de robotauto te besturen die op het principe van differentiële aandrijving rijdt. In deze instructable nemen we u mee door het werkingsprincipe achter het volgen van objecten en gebarendetectie die in het systeem worden gebruikt. De broncode van dit project kan worden gedownload van Github via een link:

Stap 1: VEREISTE DINGEN:

VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
VEREISTE DINGEN
  1. L298N-motorstuurprogramma
  2. DC-motoren
  3. Robot auto chassis
  4. Arduino Uno
  5. LiPo-batterijen
  6. Arduino USB-kabel (lang)
  7. OpenCV-bibliotheek met Python

Stap 2: WERKINGSPRINCIPE:

WERKEND PRINCIPE
WERKEND PRINCIPE

Gesture Hawk is een driefasenverwerkingssysteem zoals u kunt zien in het bovenstaande diagram.

Stap 3: INPUT OPNAME EN VERWERKING:

INPUT OPNAME EN VERWERKING
INPUT OPNAME EN VERWERKING

Het vastleggen van invoer kan worden begrepen in de bredere categorieën die in het bovenstaande diagram worden gegeven.

Om de handvorm uit de omgeving te halen, moeten we maskering of filtering van een bepaalde kleur gebruiken (in dit geval - violetblauw'). Om dat te doen, moet u de afbeelding converteren van BGR naar HSV-indeling, wat kan worden gedaan met behulp van het volgende codefragment.

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

De volgende stap is nu om het gewenste bereik van HSV-parameters te vinden om de hand via masker of filter te verwijderen. Hiervoor kun je het beste trackbars gebruiken om een geschikte actieradius te vinden. Hier is de schermafbeelding van een trackbalk die voor dit project wordt gebruikt.

Stap 4:

Afbeelding
Afbeelding

Stap 5:

Hier is er een codefragment dat hieronder wordt gegeven om zo'n trackbar voor maskerconstructie te maken:

import cv2

importeer numpy als npdef niets(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, niets) cv2.createTrackbar('l_S ', 'afbeelding', 50, 255, niets) cv2.createTrackbar('l_V', 'afbeelding', 50, 255, niets) cv2.createTrackbar('h_H', 'afbeelding', 130, 255, niets) cv2. createTrackbar('h_S', 'afbeelding', 255, 255, niets) cv2.createTrackbar('h_V', 'afbeelding', 255, 255, niets) while(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_V', 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') lower_R = np. array([lH, lS, lV]) hogere_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, hogere_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF als k == 27: breek cv2.destroyAllWindows()

Stap 6: VERWERKINGSONDERDEEL:

VERWERKENDE DEEL
VERWERKENDE DEEL

Welnu, we hebben de geometrische vorm van een hand, nu is het tijd om deze te exploiteren en te gebruiken om het handgebaar te achterhalen.

Convexe romp:

Door een bolle romp proberen we een benaderde veelhoek te passen via extreme punten die in de vorm aanwezig zijn. Afbeelding aan de linkerkant toont bij benadering de veelhoek die was toegewezen aan de vorm met de convexe punten gemarkeerd met rood.

Convexe punten zijn die punten in de vorm die het verst verwijderd zijn van een zijde van deze benaderde veelhoek. Maar het probleem met een convexe romp is dat we tijdens de berekening een array van alle convexe punten krijgen, maar wat we nodig hebben is het convexe punt met blauwe punt. Wij zullen u vertellen waarom dit nodig is.

Om dit convexe punt te vinden, moeten we de formule voor de loodrechte afstand toepassen om de afstand van het convexe punt met de dichtstbijzijnde zijde te vinden. We hebben vastgesteld dat het blauwe puntige punt de maximale afstand vanaf de zijkant heeft en dus krijgen we dit punt.

Stap 7:

Afbeelding
Afbeelding

Stap 8:

Afbeelding
Afbeelding

Vervolgens moeten we de helling vinden van de lijn die de top van de duim (of het uiterste punt) verbindt met dit convexe punt met horizontaal.

Stap 9:

Afbeelding
Afbeelding

In het bovenstaande geval moet de hoek α tussen 0 en 90 graden zijn als het gebaar is om naar links te draaien. Dat is tan(α) moet positief zijn.

Stap 10:

Afbeelding
Afbeelding

In het bovenstaande geval moet de hoek α tussen 180 en 90 graden zijn als het gebaar is om naar rechts te draaien. Dat is tan(α) moet negatief zijn.

Daarom, als Tan α positief is, draai dan naar links. Als Tan α negatief is, draai dan naar rechts. Nu is het tijd om te zien hoe u de belangrijkste stopopdracht kunt detecteren.

Hier wordt een gespecificeerde verhouding (gevonden door hit and trial) onderzocht en in maximale gevallen blijft deze verhouding van afstanden in dit specifieke bereik.

Stap 11:

Afbeelding
Afbeelding

Eindelijk wordt het voorwaartse bewegingsgebaar geanalyseerd door de matchShape()-functie in OpenCV. Deze functie vergelijkt de vorm van twee tellers, in dit geval tussen het trainingsvoorbeeld in de bovenstaande afbeelding en de contour aan de linkerkant van de bovenstaande afbeelding. Het retourneert een waarde variërend van 0 tot 2 of 3, afhankelijk van de variatie die aanwezig is in de vorm van twee contouren. Voor identiek dezelfde contour retourneert het 0.

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

Hier zijn cn1 en cnt2 de twee contouren die moeten worden vergeleken.

Stap 12: BEWEGINGSCONTROLE:

BEWEGING CONTROLE
BEWEGING CONTROLE

PySerial:

We gebruikten PySerial-bibliotheek van python om de verwerkte gegevens om te zetten in seriële gegevens om via Arduino USB-kabel naar Arduino Uno te communiceren. Nadat een bepaald gebaar door opencv was gedetecteerd, hebben we een tijdelijke variabele gemaakt, zeg 'x' en er een unieke waarde aan toegewezen en deze geconverteerd naar seriële invoer met behulp van de volgende opdrachtregel: -

importeer seriële #om Pyserial-bibliotheek te importeren

serial. Serial('', baudrate = '9600', timeout = '0') # seriële uitvoer instellen.. POORTNAAM is de naam van de poort via welke gegevensoverdracht zal plaatsvinden.

serial.write(b'x') # x is het alfabet dat naar de poort wordt gestuurd …b is om deze string om te zetten in bytes.

Arduino-verwerking:

Nu is arduino zo gecodeerd dat elke verschillende seriële x lineair wordt toegewezen aan een bepaalde actie die verantwoordelijk is voor een soepele beweging van de robot (zeg dat detectie van een linkergebaar de motoren aan de rechterkant zal activeren om naar links te draaien). We kunnen de beweging van elk wiel zowel translationeel als roterend regelen door de code op de juiste manier te veranderen.

L298N Motorstuurprogramma: -

Motor Driver wordt gebruikt als bemiddelaar tussen motor en stroombron, omdat motoren niet rechtstreeks kunnen worden gevoed vanwege lage spanningswaarden. Li-Po-batterij is verbonden met de 12V-ingangsaansluiting en we verbinden de 5V-aansluiting van arduino met de 5V-ingang van de motorbestuurder die uiteindelijk de aarde van Li-Po en arduino verbindt in een gemeenschappelijke aardingsaansluiting van de motorstuurprogramma.

Nu zijn de klemmen van de motoren aangesloten op de gegeven stopcontacten. Ten slotte verbinden we ingangsterminals voor motor met PWM-uitgangen van Arduino, zodat we vrij zijn om de rotatie- en translatieaspecten van beweging nauwkeurig te bepalen.

Aanbevolen: