Sisällysluettelo:

Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla: 13 vaihetta (kuvien kanssa)
Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla: 13 vaihetta (kuvien kanssa)

Video: Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla: 13 vaihetta (kuvien kanssa)

Video: Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla: 13 vaihetta (kuvien kanssa)
Video: NBA players have the biggest hands on the planet 😂 (via @arm1ne_7) 2024, Marraskuu
Anonim
Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla
Gesture Hawk: Käsi -eleohjattu robotti kuvankäsittelypohjaisen käyttöliittymän avulla

Gesture Hawk esiteltiin TechEvince 4.0: ssa yksinkertaisena kuvankäsittelypohjaisena ihmisen ja koneen käyttöliittymänä. Sen hyödyllisyys on se, että differentiaalikäyttöperiaatteella toimivan robottiauton ohjaamiseen ei tarvita muita antureita tai pukeutumista paitsi käsine. Tässä ohjeessa käymme läpi järjestelmässä käytetyn objektien seurannan ja eleiden havaitsemisen toimintaperiaatteen. Tämän projektin lähdekoodi voidaan ladata Githubista linkin kautta:

Vaihe 1: VAATIMUKSIA:

VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
VAATIMUKSET
  1. L298N -moottorin ohjain
  2. DC -moottorit
  3. Robottiauton runko
  4. Arduino Uno
  5. LiPo -akut
  6. Arduino USB -kaapeli (pitkä)
  7. OpenCV -kirjasto Pythonilla

Vaihe 2: TYÖPERIAATE:

TOIMINTAPERIAATE
TOIMINTAPERIAATE

Gesture Hawk on kolmivaiheinen prosessointijärjestelmä, kuten yllä olevasta kaaviosta näet.

Vaihe 3: TULON KAPPALE JA KÄSITTELY:

TULON KAPPALE JA KÄSITTELY
TULON KAPPALE JA KÄSITTELY

Syötteen sieppaus voidaan ymmärtää laajemmissa luokissa, jotka on annettu yllä olevassa kaaviossa.

Käden muodon poistamiseksi ympäristöstä meidän on käytettävä tietyn värin peittoa tai suodatusta (tässä tapauksessa violetinsininen). Tätä varten sinun on muunnettava kuva BGR: stä HSV -muotoon, joka voidaan tehdä käyttämällä seuraavaa koodinpätkää.

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

Seuraava askel on löytää haluttu HSV -parametrialue, jotta kätesi voidaan poistaa maskin tai suodattimen kautta. Tätä varten paras tapa on etsiä sopiva alue käyttämällä raidepalkkeja. Tässä on kuvakaappaus tähän projektiin käytetystä raidapalkista.

Vaihe 4:

Kuva
Kuva

Vaihe 5:

Tässä on alla oleva koodinpätkä tällaisen raidan luomiseksi maskin rakentamista varten:

tuoda cv2

tuo numpy nimellä npdef nothing (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nothing) cv2.createTrackbar ('l_S ',' kuva ', 50, 255, ei mitään) cv2.createTrackbar (' l_V ',' kuva ', 50, 255, ei mitään) cv2.createTrackbar (' h_H ',' kuva ', 130, 255, ei mitään) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing), kun (1): _, frame = img.read ()

hsv = cv2.cvtColor (kehys, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_V', 'kuva') hH = cv2.getTrackbarPos ('h_H', 'kuva') hS = cv2.getTrackbarPos ('h_S', 'kuva') hV = cv2.getTrackbarPos ('h_V', 'kuva') alempi_R = np. array ([lH, lS, lV]) suurempi_R = np.array ([hH, hS, hV]) maski = cv2.inRange (hsv, alempi_R, korkeampi_R) res = cv2.bitwise_and (kehys, kehys, maski = maski) cv2.imshow ('kuva', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Vaihe 6: KÄSITTELYOSA:

KÄSITTELYOSA
KÄSITTELYOSA

No, meillä on käden geometrinen muoto, nyt on aika hyödyntää sitä ja hyödyntää sitä käsieleen.

Kupera runko:

Kuperan rungon kautta yritämme sovittaa likimääräisen monikulmion muodon ääripisteiden kautta. Vasemmanpuoleisessa kuvassa näkyy likimääräinen monikulmio, joka oli määritetty muodolle kuperat pisteet merkitty punaisella.

Kuperat pisteet ovat muodon pisteitä, jotka ovat kauimpana tämän likimääräisen monikulmion sivusta. Kuperaan runkoon liittyvä ongelma on kuitenkin se, että sen laskennan aikana saamme taulukon kaikista kupeista pisteistä, mutta tarvitsemme sinisen kärjen kupera pisteen. Kerromme, miksi sitä tarvitaan.

Tämän kupera pisteen löytämiseksi meidän on sovellettava kohtisuoraa etäisyyskaavaa kuperan pisteen etäisyyden löytämiseksi lähimmän sivun kanssa. Havaitsimme, että sinisellä terävällä pisteellä on suurin etäisyys sivusta, joten saamme tämän pisteen.

Vaihe 7:

Kuva
Kuva

Vaihe 8:

Kuva
Kuva

Seuraavaksi meidän on löydettävä peukalon kärjen (tai ääripisteen) yhdistävän suoran kaltevuus tähän kuperaan pisteeseen, jossa on vaakasuora.

Vaihe 9:

Kuva
Kuva

Edellä mainitussa tapauksessa kulman α tulisi olla 0-90 astetta, jos ele on tarkoitettu vasemmalle kääntymiseen. Toisin sanoen rusketuksen (α) pitäisi olla positiivinen.

Vaihe 10:

Kuva
Kuva

Yllä olevassa tapauksessa kulman α tulisi olla 180-90 astetta, jos ele on suunnattu oikealle. Eli tan (α) pitäisi olla negatiivinen.

Siksi, jos Tan α on positiivinen, käänny vasemmalle. Jos Tan α on negatiivinen, käänny oikealle. Nyt on aika katsoa, kuinka tunnistaa tärkein pysäytyskomento.

Tässä tarkastellaan tiettyä suhdetta (löydetty osumalla ja kokeilulla) ja useimmissa tapauksissa tämä etäisyyksien suhde pysyy tällä alueella.

Vaihe 11:

Kuva
Kuva

Lopuksi, eteenpäin suuntautuva liike -ele analysoidaan matchChape () -funktiolla OpenCV: ssä. Tämä toiminto vertaa kahden laskurin muotoa, tässä tapauksessa yllä olevan kuvan kireyden harjoitteluesimerkin ja yllä olevan kuvan vasemman reunan muodon välillä. Se palauttaa arvon välillä 0 - 2 tai 3 kahden ääriviivan muodon mukaan. Saman muodon osalta se palauttaa arvon 0.

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

Tässä cn1 ja cnt2 ovat kaksi vertailtavaa ääriviivaa.

Vaihe 12: LIIKKEEN HALLINTA:

LIIKEOHJAUS
LIIKEOHJAUS

PySerial:

Käytimme PySerial -kirjastoa pythonissa muuntaaksemme käsitellyt tiedot sarjatiedoiksi, jotka välitettiin Arduino Unolle Arduino USB -kaapelin kautta. Kun opencv havaitsi tietyn eleen, loimme väliaikaisen muuttujan sanomalla "x" ja määritimme sille jonkin ainutlaatuisen arvon ja muutimme sen sarjatuloksi seuraavan komentorivin avulla:-

tuo sarja #tuoda Pyserial -kirjasto

serial. Serial ('', baudrate = '9600', timeout = '0') # sarjaliitännän määrittäminen.. PORTTI NIMI on portin nimi, jolla tiedonsiirto tapahtuu.

serial.write (b'x ') # x on porttiin lähetetty aakkoset … b on muuntaa tämä merkkijono tavuiksi.

Arduino -prosessointi:

Nyt arduino on koodattu siten, että jokainen eri sarja x on lineaarisesti kartoitettu tiettyyn toimintoon, joka on vastuussa robotin sujuvasta liikkeestä (esimerkiksi vasemman eleen havaitseminen laukaisee oikealla olevat moottorit kääntymään vasemmalle). Voimme hallita jokaisen pyörän liikettä käänteisesti ja pyörivästi muuttamalla koodia oikein.

L298N Moottorin ohjain:-

Moottorin ohjainta käytetään välittäjänä moottorin ja virtalähteen välillä, koska moottoreita ei voida käyttää suoraan pienjännitearvojen vuoksi. Li-Po-akku on kytketty 12 V: n tuloliitäntäänsä, ja me liitämme arduinon 5 V: n pistorasian moottorin kuljettajan 5 V: n tuloliitäntään, joka lopulta liittää Li-Po: n maadoituksen sekä arduinon moottoriajurin yhteiseen maadoituspistorasiaan.

Nyt moottorien liittimet on kytketty annettuihin pistorasioihin. Lopuksi liitämme moottorin tuloliitännät arduinon PWM -lähtöliitäntöihin, jolloin voimme vapaasti päättää liikkeen pyörimis- ja käännösnäkökohdista.

Suositeltava: