Kazalo:

Gesture Hawk: Robot z ročno krmiljeno roko z uporabo vmesnika za obdelavo slik: 13 korakov (s slikami)
Gesture Hawk: Robot z ročno krmiljeno roko z uporabo vmesnika za obdelavo slik: 13 korakov (s slikami)

Video: Gesture Hawk: Robot z ročno krmiljeno roko z uporabo vmesnika za obdelavo slik: 13 korakov (s slikami)

Video: Gesture Hawk: Robot z ročno krmiljeno roko z uporabo vmesnika za obdelavo slik: 13 korakov (s slikami)
Video: Part 3 - Lord Jim Audiobook by Joseph Conrad (Chs 13-19) 2024, November
Anonim
Gesture Hawk: Robot z ročno krmiljeno roko, ki uporablja vmesnik za obdelavo slik
Gesture Hawk: Robot z ročno krmiljeno roko, ki uporablja vmesnik za obdelavo slik

Gesture Hawk je bil predstavljen v TechEvince 4.0 kot preprost vmesnik človek-stroj, ki temelji na obdelavi slik. Njegova uporabnost je v tem, da za nadzor robotskega avtomobila, ki deluje na principu diferencialnega pogona, niso potrebni dodatni senzorji ali nošljivi rokavi, razen rokavic. V tem navodilu vas bomo popeljali skozi načelo delovanja za sledenje objektom in zaznavanje kretenj, ki se uporablja v sistemu. Izvorno kodo tega projekta lahko prenesete iz Github-a na povezavi:

1. korak: POTREBNE STVARI:

POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
POTREBNE STVARI
  1. L298N Gonilnik motorja
  2. DC motorji
  3. Podvozje robotskega avtomobila
  4. Arduino Uno
  5. LiPo baterije
  6. Arduino USB kabel (dolg)
  7. Knjižnica OpenCV s programom Python

2. korak: DELOVNO NAČELO:

DELOVNO NAČELO
DELOVNO NAČELO

Gesture Hawk je trifazni sistem za obdelavo, kot lahko vidite na zgornjem diagramu.

3. korak: VSTOPANJE IN OBDELAVA:

VHODNI ZAJEM IN OBDELAVA
VHODNI ZAJEM IN OBDELAVA

Zajem vhoda je mogoče razumeti v širših kategorijah, navedenih v zgornjem diagramu.

Če želimo izvleči obliko roke iz okolja, moramo uporabiti prikrivanje ali filtriranje določene barve (v tem primeru - vijolično modro). Če želite to narediti, morate sliko pretvoriti iz zapisa BGR v format HSV, kar lahko storite z uporabo naslednjega odrezka kode.

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

Naslednji korak je najti želeno območje parametrov HSV, da izvlečete roko prek maske ali filtra. Za to je najboljši način, da uporabite palice za iskanje primernega dosega. Tukaj je posnetek zaslona sledilne vrstice, uporabljene za ta projekt.

4. korak:

Slika
Slika

5. korak:

Spodaj je naveden delček kode za izdelavo takšne sledi za izdelavo maske:

uvoz cv2

uvoz numpy kot npdef nič (x): pass cv2. namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nothing) cv2.createTrackbar ('l_S ',' image ', 50, 255, nothing) cv2.createTrackbar (' l_V ',' image ', 50, 255, nothing) cv2.createTrackbar (' h_H ',' image ', 130, 255, nič) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing) 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. matrika ([lH, lS, lV]) višja_R = np. matrika ([hH, hS, hV]) maska = cv2.inRange (hsv, spodnji_R, višji_R) res = cv2. bitni_in (okvir, okvir, maska = maska) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

6. korak: DELOVNA OBDELAVA:

OBDELAVNI DEL
OBDELAVNI DEL

No, imamo geometrijsko obliko roke, zdaj je čas, da jo izkoristimo in uporabimo, da ugotovimo potezo roke.

Konveksni trup:

Skozi konveksni trup poskušamo približati približni poligon preko skrajnih točk v obliki. Slika na levi prikazuje približni poligon, ki je bil dodeljen obliki z izbočenimi točkami, označenimi z rdečo.

Konveksne točke so tiste točke v obliki, ki so najbolj oddaljene od strani tega približnega poligona. Toda problem konveksnega trupa je v tem, da bomo med njegovim izračunom dobili niz vseh konveksnih točk, kar pa potrebujemo, je modro koničasto konveksno točko. Povedali vam bomo, zakaj je to potrebno.

Za iskanje te konveksne točke moramo uporabiti formulo pravokotne razdalje za iskanje razdalje konveksne točke z najbližjo stranjo. Opazili smo, da ima modra koničasta točka največjo razdaljo od strani in tako dobimo to točko.

7. korak:

Slika
Slika

8. korak:

Slika
Slika

Nato moramo najti naklon črte, ki združuje konico palca (ali skrajno točko) s to izbočeno točko z vodoravno.

9. korak:

Slika
Slika

V zgornjem primeru mora biti kot α med 0 in 90 stopinj, če je poteza za ovinek v levo. To pomeni, da mora biti tan (α) pozitiven.

10. korak:

Slika
Slika

V zgornjem primeru mora biti kot α med 180 in 90 stopinjami, če je poteza za desni zavoj. To pomeni, da mora biti tan (α) negativen.

Če je torej Tan α pozitiven, zavijte levo. Če je Tan α negativen, zavijte desno. Zdaj je čas, da vidimo, kako odkriti najpomembnejši ukaz stop.

Tu se preveri določeno razmerje (ugotovljeno z zadetkom in poskusom), v največjih primerih pa to razmerje razdalj ostane v tem območju.

11. korak:

Slika
Slika

Nazadnje potezo gibanja naprej analizira funkcija matchShape () v OpenCV. Ta funkcija v tem primeru primerja obliko dveh števcev med primerom vadbe na trici na zgornji sliki s konturo na levi strani zgornje slike. Vrne vrednost v razponu od 0 do 2 ali 3 glede na variacijo v obliki dveh kontur. Za enako konturo vrne 0.

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

Tu sta cn1 in cnt2 dve konturi, ki ju je treba primerjati.

12. korak: NADZOR GIBANJA:

NADZOR GIBANJA
NADZOR GIBANJA

PySerial:

Uporabili smo knjižnico PySerial za pretvorbo obdelanih podatkov v serijske podatke, ki so bili posredovani Arduino Uno prek kabla USB Arduino. Ko je opencv odkril določeno gesto, smo ustvarili začasno spremenljivko, recimo "x", ji dodelili neko edinstveno vrednost in jo pretvorili v serijski vnos z naslednjo ukazno vrstico:-

import serial #to import Pyserial library

serial. Serial ('', baudrate = '9600', timeout = '0') # nastavitev serijskega izhoda.. PORT NAME je ime vrat, prek katerih bo prišlo do prenosa podatkov.

serial.write (b'x ') # x je abeceda, poslana na vrata … b je pretvorba tega niza v bajte.

Arduino obdelava:

Zdaj je arduino kodiran tako, da je vsak drugačen serijski x linearno preslikan na določeno dejanje, ki je odgovorno za nemoteno gibanje robota (recimo, da bo zaznavanje leve geste sprožilo motorje na desni, da zavijejo levo). Gibanje vsakega kolesa lahko nadziramo translacijsko in rotacijsko, tako da ustrezno spremenimo kodo.

L298N Gonilnik motorja:-

Motor Driver se uporablja kot posrednik med motorjem in virom energije, saj motorjev zaradi nizkih napetosti ni mogoče neposredno napajati. Li-Po baterija je priključena na njegov 12V vhodni priključek in arduinovo 5V vtičnico priključimo na 5V vhodno vtičnico gonilnika motorja, ki končno poveže ozemljitev Li-Po in arduino v skupni ozemljitveni vtičnici gonilnika motorja.

Sedaj so priključki motorjev priključeni v danih vtičnicah. Nazadnje priključimo vhodne sponke za motor na izhodne vtičnice PWM arduina, s čimer se lahko svobodno odločimo o rotacijskih in prevodnih vidikih gibanja.

Priporočena: