Sisukord:

Liigutuskull: käsitsi liigutatav robot pilditöötluspõhise liidese abil: 13 sammu (piltidega)
Liigutuskull: käsitsi liigutatav robot pilditöötluspõhise liidese abil: 13 sammu (piltidega)

Video: Liigutuskull: käsitsi liigutatav robot pilditöötluspõhise liidese abil: 13 sammu (piltidega)

Video: Liigutuskull: käsitsi liigutatav robot pilditöötluspõhise liidese abil: 13 sammu (piltidega)
Video: Виртуальный ввод в эксплуатацию с помощью веб-семинара KUKA Sim от KUKA Nordic 2024, November
Anonim
Liigutuskull: käega liigutatav robot pilditöötluspõhise liidese abil
Liigutuskull: käega liigutatav robot pilditöötluspõhise liidese abil

Gesture Hawki tutvustati TechEvince 4.0-s lihtsa pilditöötluspõhise inimese ja masina liidesena. Selle kasulikkus seisneb selles, et diferentsiaalkäigupõhimõttel töötava robotauto juhtimiseks ei ole vaja täiendavaid andureid ega kanda, välja arvatud kinnas. Selles juhendis tutvustame teid süsteemis kasutatavate objektide jälgimise ja liigutuste tuvastamise tööpõhimõtte kaudu. Selle projekti lähtekoodi saab alla laadida Githubist lingi kaudu:

1. samm: VAJALIKUD ASJAD:

VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
VAJALIKUD ASJAD
  1. L298N mootorijuht
  2. DC mootorid
  3. Robot auto šassii
  4. Arduino Uno
  5. LiPo akud
  6. Arduino USB -kaabel (pikk)
  7. OpenCV raamatukogu Pythoniga

2. toiming: tööpõhimõte:

TÖÖPÕHIMÕTE
TÖÖPÕHIMÕTE

Gesture Hawk on kolmefaasiline töötlussüsteem, nagu näete ülaltoodud diagrammil.

3. etapp: sisendi kogumine ja töötlemine:

SISENDI SIDAMINE JA TÖÖTLEMINE
SISENDI SIDAMINE JA TÖÖTLEMINE

Sisendi püüdmist saab mõista ülaltoodud diagrammil esitatud laiemates kategooriates.

Käe kuju keskkonnast eraldamiseks peame kasutama kindlat värvi (antud juhul violetsinist) maskeerimist või filtreerimist. Selleks peate pildi teisendama BGR -st HSV -vormingusse, mida saab teha järgmise koodilõigu abil.

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

Järgmine samm on leida soovitud HSV parameetrite vahemik, et maski või filtri abil käsi välja tõmmata. Selleks on parim viis sobiva vahemiku leidmiseks kasutada ribasid. Siin on ekraanipilt selle projekti jaoks kasutatavast ribaribast.

4. samm:

Pilt
Pilt

5. samm:

Siin on allpool toodud koodilõik, mis võimaldab maski ehitamiseks sellise riba teha:

import cv2

import numpy kui npdef nothing (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, nothing) cv2. createTrackbar ('h_S', 'image', 255, 255, nothing) cv2.createTrackbar ('h_V', 'image', 255, 255, nothing) samas (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_V', 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') madalam_R = np. massiiv ([lH, lS, lV]) kõrgem_R = np.massiiv ([hH, hS, hV]) mask = cv2.inRange (hsv, madalam_R, kõrgem_R) res = cv2.bitwise_and (raam, raam, mask = mask) cv2.imshow ('pilt', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

6. samm: TÖÖTLEMISOSA:

TÖÖTLEMISOSA
TÖÖTLEMISOSA

Noh, meil on käe geomeetriline kuju, nüüd on aeg seda ära kasutada ja kasutada seda käeliigutuse leidmiseks.

Kumer korpus:

Kumera kere kaudu proovime kuju äärmiste punktide kaudu sobitada ligikaudse hulknurga. Vasakul olev pilt näitab ligikaudset hulknurka, mis oli kujule määratud punastega tähistatud kumerate punktidega.

Kumerad punktid on need kuju punktid, mis on selle ligikaudse hulknurga küljest kõige kaugemal. Kuid kumera kere probleem on see, et selle arvutamise käigus saame massiivi kõigist kumeratest punktidest, kuid vajame sinist teravat kumerpunkti. Me ütleme teile, miks seda nõutakse.

Selle kumera punkti leidmiseks peame rakendama risti asetseva kauguse valemit kumera punkti kauguse leidmiseks lähima küljega. Vaatasime, et sinine terav punkt on küljest maksimaalse kaugusega ja nii saame selle punkti.

7. samm:

Pilt
Pilt

8. samm:

Pilt
Pilt

Järgmisena peame leidma pöia otsa (või äärmise punkti) ühendava joone kalde selle kumera horisontaalse punktiga.

9. samm:

Pilt
Pilt

Ülaltoodud juhul peaks nurk α olema 0 kuni 90 kraadi, kui žest on vasakpöörde jaoks. See on tan (α) peaks olema positiivne.

10. samm:

Pilt
Pilt

Ülaltoodud juhul peaks nurk α jääma 180 kuni 90 kraadi vahele, kui žest on suunatud paremale pööramisele. See on tan (α) peaks olema negatiivne.

Seega, kui Tan α on positiivne, siis vasakpööre. Kui Tan α on negatiivne, pöörake paremale. Nüüd on aeg näha, kuidas tuvastada kõige olulisem peatamiskäsk.

Siin uuritakse kindlaksmääratud suhet (leitud tabamuse ja katse põhjal) ning maksimaalsetel juhtudel jääb see vahemaade suhe sellesse vahemikku.

11. samm:

Pilt
Pilt

Lõpuks analüüsib liigutamise liigutust OpenCV funktsioon matchShape (). See funktsioon võrdleb kahe loenduri kuju, sel juhul ülaltoodud pildil oleva pingutusharjutuse näite ja ülaltoodud pildi vasakus servas oleva kontuuri vahel. See tagastab väärtuse vahemikus 0 kuni 2 või 3 vastavalt kahe kontuuri kujule. Sama kontuuri korral tagastab see 0.

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

Siin on cn1 ja cnt2 kaks kontuuri, mida tuleb võrrelda.

12. samm: LIIKUMISTE KONTROLL:

LIIKUMISE KONTROLL
LIIKUMISE KONTROLL

PySerial:

Kasutasime PySeriali pythoni raamatukogu, et teisendada töödeldud andmed seeriaandmeteks, et edastada need Arduino Unole Arduino USB -kaabli kaudu. Kui opencv tuvastas konkreetse žesti, lõime ajutise muutuja, näiteks „x”, ja määrasime sellele mõne unikaalse väärtuse ning teisendasime selle jadasisendiks järgmise käsurea abil:-

impordi seeria #importida Pyserial raamatukogu

serial. Serial ('', baudrate = '9600', timeout = '0') # seeriaväljundi seadistamine.. PORT NAME on selle pordi nimi, mille kaudu andmeedastus toimub.

serial.write (b'x ') # x on porti saadetud tähestik … b on selle stringi teisendamine baitideks.

Arduino töötlemine:

Nüüd on arduino kodeeritud selliselt, et iga erinev seeria x on lineaarselt kaardistatud teatud toimingute eest, mis vastutavad roboti sujuva liikumise eest (ütleme, et vasaku liigutuse tuvastamine käivitab parempoolsed mootorid vasakule pööramiseks). Koodi nõuetekohase muutmisega saame kontrollida iga ratta liikumist nii translatiivselt kui ka pöörlevalt.

L298N Mootori juht:-

Mootori juhti kasutatakse vahendajana mootori ja toiteallika vahel, kuna mootoreid ei saa madala pinge tõttu otseselt toita. Li-Po aku on ühendatud selle 12 V sisendklemmiga ja me ühendame arduino 5 V pistikupesa mootori juhi 5 V sisendpesaga, mis lõpuks ühendab nii Li-Po maanduse kui ka arduino mootorijuhi ühises maanduspessa.

Nüüd on mootorite klemmid ühendatud pistikupesadega. Lõpuks ühendame mootori sisendklemmid arduino PWM väljundpesadega, võimaldades meil vabalt otsustada liikumise pöörlemis- ja teisendusaspektide üle.

Soovitan: