INHOUDSOPGAWE:

Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak: 13 stappe (met foto's)
Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak: 13 stappe (met foto's)

Video: Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak: 13 stappe (met foto's)

Video: Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak: 13 stappe (met foto's)
Video: DUAL DESIGNS WITH HENNA , SUCH A BEAUTIFUL GESTURE 2024, Julie
Anonim
Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak
Gebaar Hawk: Handgebaar -beheerde robot met behulp van beeldverwerkingsgebaseerde koppelvlak

Gesture Hawk is in TechEvince 4.0 vertoon as 'n eenvoudige beeldverwerkingsgebaseerde mens-masjien-koppelvlak. Die nut daarvan lê daarin dat geen ekstra sensors of drabare toestelle behalwe 'n handskoen nodig is om die robotmotor te bestuur wat volgens 'n differensiële dryfbeginsel werk nie. In hierdie instruksies neem ons u deur die werkbeginsel agter objekopsporing en gebaaropsporing wat in die stelsel gebruik word. Die bronkode van hierdie projek kan van Github afgelaai word via die skakel:

Stap 1: VEREISTE DINGE:

DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
DINGE VEREIS
  1. L298N motorbestuurder
  2. DC Motors
  3. Onderstel van 'n robotmotor
  4. Arduino Uno
  5. LiPo batterye
  6. Arduino USB -kabel (lank)
  7. OpenCV -biblioteek met Python

Stap 2: WERKBEGINSEL:

WERKBEGINSEL
WERKBEGINSEL

Gesture Hawk is 'n driefase -verwerkingstelsel, soos u kan sien in die diagram hierbo.

Stap 3: INVOER VANG EN VERWERKING:

INVOERVANGSTEL EN VERWERKING
INVOERVANGSTEL EN VERWERKING

Invoeropname kan verstaan word in die breër kategorieë wat in die diagram hierbo gegee word.

Om die handvorm uit die omgewing te onttrek, moet ons maskering of filter van 'n bepaalde kleur (in hierdie geval - violetblou) gebruik. Om dit te kan doen, moet u die prent omskakel van BGR na HSV -formaat, wat met die volgende kodefragment gebruik kan word.

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

Die volgende stap is om die gewenste reeks HSV -parameters te vind om die hand uit te haal met masker of filter. Hiervoor is die beste manier om spoorstawe te gebruik om 'n geskikte reeks te vind. Hier is die skermkiekie van 'n snitbalk wat vir hierdie projek gebruik is.

Stap 4:

Beeld
Beeld

Stap 5:

Hier is 'n kodefragment hieronder om so 'n spoorbalk vir maskerkonstruksie te maak:

voer cv2 in

invoer numpy as npdef niks (x): slaag cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, niks) cv2.createTrackbar ('l_S ',' beeld ', 50, 255, niks) cv2.createTrackbar (' l_V ',' beeld ', 50, 255, niks) cv2.createTrackbar (' h_H ',' image ', 130, 255, niks) cv2. createTrackbar ('h_S', 'image', 255, 255, niks) cv2.createTrackbar ('h_V', 'image', 255, 255, niks) terwyl (1): _, frame = img.read ()

hsv = cv2.cvtColor (raam, 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') lower_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 (raam, raam, masker = masker) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF as k == 27: breek cv2.destroyAllWindows ()

Stap 6: VERWERKINGSGEDEELTE:

VERWERKINGSGEDEELTE
VERWERKINGSGEDEELTE

Ons het die geometriese vorm van 'n hand, dit is nou tyd om dit te gebruik en te gebruik om die handgebaar uit te vind.

Konvekse romp:

Deur middel van 'n konvekse romp probeer ons om 'n geskatte veelhoek te pas via uiterste punte in die vorm. Die prentjie aan die linkerkant toon die benaderde veelhoek wat aan die vorm toegeken is met die konvekse punte wat met rooi gemerk is.

Konvekse punte is die punte in die vorm wat die verste van die kant van hierdie benaderde veelhoek is. Maar die probleem met die konvekse romp is dat ons tydens die berekening 'n verskeidenheid van al die konvekse punte sal kry, maar wat ons nodig het, is die blou puntige konvekse punt. Ons sal u vertel waarom dit nodig is.

Om hierdie konvekse punt te vind, moet ons die loodregte afstandformule toepas om die afstand van die konvekse punt met die naaste sy te bepaal. Ons het opgemerk dat die blou punt die maksimum afstand van die kant het, en dus kry ons hierdie punt.

Stap 7:

Beeld
Beeld

Stap 8:

Beeld
Beeld

Vervolgens moet ons die helling van die lyn vind wat die punt van die duim (of die uiterste punt) by hierdie konvekse punt met horisontaal verbind.

Stap 9:

Beeld
Beeld

In bogenoemde geval moet die hoek α tussen 0 en 90 grade wees as die gebaar links draai. Dit is bruin (α) moet positief wees.

Stap 10:

Beeld
Beeld

In die geval hierbo, moet die hoek α tussen 180 en 90 grade wees as die gebaar vir regs draai. Dit is bruin (α) moet negatief wees.

As Tan α dus positief is, draai dan links. As Tan α negatief is, draai dan regs. Dit is tyd om te sien hoe u die belangrikste stopopdrag kan opspoor.

Hier word 'n gespesifiseerde verhouding (gevind deur tref en toets) ondersoek en in maksimum gevalle bly hierdie verhouding van afstande in hierdie spesifieke reeks.

Stap 11:

Beeld
Beeld

Uiteindelik word die bewegingsgebaar vooruit geanaliseer deur die funksie MatchShape () in OpenCV. Hierdie funksie vergelyk die vorm van twee tellers, in hierdie geval, tussen die oefenvoorbeeld op die punt in die foto hierbo met die kontoer in die linkerkant van die prent hierbo. Dit gee 'n waarde wat wissel van 0 tot 2 of 3, volgens die variasie in die vorm van twee kontoere. Vir dieselfde kontoer gee dit 0 terug.

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

Hier is cn1 en cnt2 die twee kontoere wat vergelyk moet word.

Stap 12: BEWEGINGSBEHEER:

BEWEGINGSBEHEER
BEWEGINGSBEHEER

PySerial:

Ons het die PySerial -biblioteek van python gebruik om die verwerkte data om te skakel in seriële data wat via Arduino USB -kabel aan Arduino Uno gekommunikeer word. Sodra 'n bepaalde gebaar deur opencv bespeur is, het ons 'n tydelike veranderlike geskep met die naam 'x', 'n unieke waarde daaraan toegeken en dit omgeskakel na seriële invoer met behulp van die volgende opdragreël:-

voer reeks in #om Pyserial -biblioteek in te voer

serial. Serial ('', baudrate = '9600', timeout = '0') # opstel van seriële uitvoer.. PORT NAAM is die naam van die poort waardeur data -oordrag sal plaasvind.

serial.write (b'x ') # x is die alfabet wat na die poort gestuur word … b is om hierdie string om te skakel na grepe.

Arduino verwerking:

Nou word arduino so gekodeer dat elke verskillende reeks x lineêr gekarteer word tot sekere aksie wat verantwoordelik is vir 'n gladde beweging van die robot (sê die opsporing van die linker gebaar sal die motors regs laat draai om links te draai). Ons kan die beweging van elke wiel translasioneel sowel as rotasioneel beheer deur die kode behoorlik te verander.

L298N Motorbestuurder:-

Motorbestuurder word gebruik as die bemiddelaar tussen motor en kragbron, aangesien motors nie direk van krag kan wees as gevolg van lae spanning nie. Die Li-Po-battery is gekoppel aan die 12V-ingangsklem en ons koppel die 5V-aansluiting van die arduino aan die 5V-ingangskanaal van die motorbestuurder, wat uiteindelik die grond van Li-Po sowel as die arduino in 'n gemeenskaplike grondaansluiting van die motorbestuurder verbind.

Nou is die terminale van die motors verbind met die gegewe voetstukke. Uiteindelik verbind ons die ingangsklemme vir die motor met die PWM -uitgangsokke van Arduino, sodat ons die rotasie- en vertalingsaspekte van beweging akkuraat kan besluit.

Aanbeveel: