Obsah:

Gesture Hawk: Robot ovládaný gestami pomocou rozhrania založeného na spracovaní obrazu: 13 krokov (s obrázkami)
Gesture Hawk: Robot ovládaný gestami pomocou rozhrania založeného na spracovaní obrazu: 13 krokov (s obrázkami)

Video: Gesture Hawk: Robot ovládaný gestami pomocou rozhrania založeného na spracovaní obrazu: 13 krokov (s obrázkami)

Video: Gesture Hawk: Robot ovládaný gestami pomocou rozhrania založeného na spracovaní obrazu: 13 krokov (s obrázkami)
Video: Part 3 - Lord Jim Audiobook by Joseph Conrad (Chs 13-19) 2024, Júl
Anonim
Gesture Hawk: Ručne ovládaný robot gestami pomocou rozhrania založeného na spracovaní obrazu
Gesture Hawk: Ručne ovládaný robot gestami pomocou rozhrania založeného na spracovaní obrazu

Gesture Hawk bol predstavený v TechEvince 4.0 ako jednoduché rozhranie medzi človekom a strojom na spracovanie obrazu. Jeho užitočnosť spočíva v tom, že na ovládanie robotického auta, ktoré funguje na princípe diferenciálneho pohonu, nie sú potrebné žiadne ďalšie senzory ani nositeľné rukavice. V tomto návode vás prevedieme pracovným princípom sledovania objektov a detekcie gest, ktoré sa v systéme používajú. Zdrojový kód tohto projektu je možné stiahnuť z Githubu prostredníctvom odkazu:

Krok 1: POŽADOVANÉ VECI:

POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
POŽADOVANÉ VECI
  1. Ovládač motora L298N
  2. DC motory
  3. Podvozok robota
  4. Arduino Uno
  5. LiPo batérie
  6. Kábel USB Arduino (dlhý)
  7. Knižnica OpenCV s Pythonom

Krok 2: PRINCÍP PRÁCE:

PRACOVNÝ PRINCÍP
PRACOVNÝ PRINCÍP

Gesture Hawk je trojfázový systém spracovania, ako vidíte na obrázku vyššie.

Krok 3: VLOŽTE ZACHYTENIE A SPRACOVANIE:

VSTUP A ZPRACOVANIE
VSTUP A ZPRACOVANIE

Vstupné zachytenie je možné chápať v širších kategóriách uvedených vo vyššie uvedenom diagrame.

Na extrakciu tvaru ruky z prostredia musíme použiť maskovanie alebo filtrovanie určitej farby (v tomto prípade fialovej modrej ‘). Na to musíte previesť obrázok z formátu BGR do formátu HSV, ktorý je možné vykonať pomocou nasledujúceho útržku kódu.

hsv = cv2.cvtColor (rám, cv2. COLOR_BGR2HSV)

Teraz je ďalším krokom nájsť požadovaný rozsah parametrov HSV na extrakciu ruky pomocou masky alebo filtra. Na to je najlepším spôsobom použiť lišty na nájdenie vhodného dosahu. Tu je snímka obrazovky s lištou použitou v tomto projekte.

Krok 4:

Obrázok
Obrázok

Krok 5:

Tu je útržok kódu uvedený nižšie na vytvorenie takého lišty pre stavbu masky:

import cv2

import numpy as 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) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (rám, 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') nižší_R = np. pole ([lH, lS, lV]) higher_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Krok 6: ČASŤ SPRACOVANIA:

SPRACOVACIA ČASŤ
SPRACOVACIA ČASŤ

Získali sme geometrický tvar ruky, teraz je načase ju využiť a použiť na určenie gesta ruky.

Konvexný trup:

Prostredníctvom konvexného trupu sa pokúšame vložiť približný mnohouholník prostredníctvom extrémnych bodov prítomných v tvare. Obrázok vľavo zobrazuje približný mnohouholník, ktorý bol priradený tvaru s konvexnými bodmi označenými červenou farbou.

Konvexné body sú body v tvare, ktoré sú najvzdialenejšie od strany tohto aproximovaného mnohouholníka. Problém s konvexným trupom je však v tom, že počas jeho výpočtu dostaneme pole všetkých konvexných bodov, ale to, čo potrebujeme, je modro špicatý konvexný bod. Povieme vám, prečo je to potrebné.

Aby sme našli tento konvexný bod, musíme použiť vzorec kolmej vzdialenosti na nájdenie vzdialenosti konvexného bodu s najbližšou stranou. Zistili sme, že modrý bod má maximálnu vzdialenosť od boku, a tak sme získali tento bod.

Krok 7:

Obrázok
Obrázok

Krok 8:

Obrázok
Obrázok

Ďalej musíme nájsť sklon čiary spájajúcej špičku palca (alebo extrémny bod) s týmto konvexným bodom s horizontálou.

Krok 9:

Obrázok
Obrázok

Vo vyššie uvedenom prípade by mal byť uhol α v rozsahu 0 až 90 stupňov, ak je gestom otáčanie doľava. To znamená, že tan (α) by mal byť pozitívny.

Krok 10:

Obrázok
Obrázok

Vo vyššie uvedenom prípade by mal byť uhol α medzi 180 až 90 stupňami, ak ide o gesto doprava. To je tan (α) by malo byť negatívne.

Preto, ak je Tan α kladný, potom odbočte doľava. Ak je Tan α záporný, potom odbočte doprava. Teraz je načase zistiť, ako zistiť najdôležitejší príkaz na zastavenie.

Tu sa skúma špecifikovaný pomer (zistený zásahom a pokusom) a v maximálnych prípadoch tento pomer vzdialeností zostáva v tomto konkrétnom rozsahu.

Krok 11:

Obrázok
Obrázok

Gesto pohybu dopredu je nakoniec analyzované funkciou matchShape () v OpenCV. Táto funkcia porovnáva tvar dvoch počítadiel, v tomto prípade medzi príkladom tréningu na thright na vyššie uvedenom obrázku s kontúrou na ľavej strane vyššie uvedeného obrázku. Vráti hodnotu v rozsahu od 0 do 2 alebo 3 podľa variácií prítomných v tvare dvoch obrysov. Pre identicky rovnaký obrys vráti 0.

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

Tu sú cn1 a cnt2 dva obrysy, ktoré sa majú porovnať.

Krok 12: Riadenie pohybu:

Riadenie pohybu
Riadenie pohybu

PySerial:

Na konverziu spracovaných údajov na sériové údaje, ktoré boli oznámené Arduino Uno pomocou kábla USB Arduino, sme použili knižnicu pySerial Python. Akonáhle opencv detegovalo konkrétne gesto, vytvorili sme dočasnú premennú povedzme „x“a priradili sme jej jedinečnú hodnotu a previedli sme ju na sériový vstup pomocou nasledujúceho príkazového riadka:-

importovať sériové číslo #importovať knižnicuyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # nastavenie sériového výstupu.. PORT NAME je názov portu, na ktorom bude prebiehať prenos dát.

serial.write (b'x ') # x je abeceda odoslaná na port … b je na prevod tohto reťazca na bajty.

Spracovanie Arduino:

Teraz je arduino kódované tak, že každý iný sériový x je lineárne priradený k určitej činnosti zodpovednej za plynulý pohyb robota (povedzme, že detekcia ľavého gesta spustí motory vpravo, aby odbočili doľava). Pohyb každého kolesa môžeme ovládať translačne aj rotačne správnou zmenou kódu.

L298N Ovládač motora:-

Motor Driver sa používa ako sprostredkovateľ medzi motorom a zdrojom energie, pretože motory nemožno napájať priamo z dôvodu nízkeho napätia. Batéria Li-Po je zapojená do vstupného terminálu 12V a 5V zásuvku arduino zapojíme do vstupnej zásuvky 5V ovládača motora, pričom nakoniec spojíme uzemnenie Li-Po a arduino do spoločnej uzemňovacej zásuvky vodiča motora.

Teraz sú svorky motorov pripojené k uvedeným zásuvkám. Nakoniec pripojíme vstupné terminály pre motor k výstupným zásuvkám PWM arduina, aby sme sa mohli slobodne rozhodnúť pre rotačné a translačné aspekty pohybu.

Odporúča: