Mündəricat:

Jest Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jestinə Nəzarət Edilən Robot: 13 Addım (Şəkillərlə birlikdə)
Jest Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jestinə Nəzarət Edilən Robot: 13 Addım (Şəkillərlə birlikdə)

Video: Jest Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jestinə Nəzarət Edilən Robot: 13 Addım (Şəkillərlə birlikdə)

Video: Jest Hawk: Şəkil İşləmə Əsaslı İnterfeysdən istifadə edərək Əl Jestinə Nəzarət Edilən Robot: 13 Addım (Şəkillərlə birlikdə)
Video: Enerji monitorinqi ilə Zigbee DIN rels relesi. Baxış və sınaq - Tuya Smart, Ev köməkçisi 2024, Iyul
Anonim
Jest Hawk: Əl İşarəti İdarə Edilən Robot Şəkil İşləmə Əsaslı İnterfeysdən istifadə edir
Jest Hawk: Əl İşarəti İdarə Edilən Robot Şəkil İşləmə Əsaslı İnterfeysdən istifadə edir

Gesture Hawk, TechEvince 4.0-də sadə bir görüntü emalına əsaslanan insan-maşın interfeysi kimi nümayiş etdirildi. Faydası, diferensial idarəetmə prinsipi ilə işləyən robot maşını idarə etmək üçün əlcəkdən başqa heç bir əlavə sensora və ya geyilə bilməməsinə əsaslanır. Bu təlimatda sizi sistemdə istifadə olunan obyekt izləmə və jest aşkarlamanın iş prinsipi ilə tanış edəcəyik. Bu layihənin mənbə kodu Github-dan link vasitəsilə yüklənə bilər:

Addım 1: Tələb olunan şeylər:

Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
Tələb olunan şeylər
  1. L298N motor sürücü
  2. DC mühərrikləri
  3. Robot avtomobil şassisi
  4. Arduino Uno
  5. LiPo batareyaları
  6. Arduino USB Kabeli (uzun)
  7. Python ilə OpenCV Kitabxanası

Addım 2: ÇALIŞMA PRİNSİBİ:

İş prinsipi
İş prinsipi

Gesture Hawk, yuxarıdakı diaqramda gördüyünüz kimi üç fazalı bir işləmə sistemidir.

Addım 3: GİRİŞ ÇƏKMƏ VƏ İŞLƏMƏ:

GİRİŞ ÇƏKİLMƏSİ VƏ İŞLƏNMƏSİ
GİRİŞ ÇƏKİLMƏSİ VƏ İŞLƏNMƏSİ

Giriş ələ keçirilməsi yuxarıdakı diaqramda verilən daha geniş kateqoriyalarda başa düşülə bilər.

Əl şəklini ətrafdan çıxarmaq üçün müəyyən bir rəngin maskalanmasından və ya süzülməsindən istifadə etməliyik (bu halda - bənövşəyi mavi '). Bunu etmək üçün görüntüyü aşağıdakı kod parçasından istifadə edərək edilə bilən BGR -dən HSV formatına çevirməlisiniz.

hsv = cv2.cvtColor (çərçivə, cv2. COLOR_BGR2HSV)

İndi, növbəti addım, maskanı və ya filtri əlini çıxarmaq üçün istədiyiniz HSV parametr aralığını tapmaqdır. Bunun üçün ən yaxşı yol uyğun bir aralıq tapmaq üçün yol çubuqlarından istifadə etməkdir. Bu layihə üçün istifadə olunan bir iz çubuğunun ekran görüntüsü.

Addım 4:

Şəkil
Şəkil

Addım 5:

Burada, maska istehsalı üçün belə bir iz çubuğu etmək üçün aşağıda verilmiş bir kod parçası var:

idxal cv2

npdef heç bir şey (x) olaraq numpy idxal edin: cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, heç bir şey) cv2.createTrackbar ('l_S ',' image ', 50, 255, heç bir şey) cv2.createTrackbar (' l_V ',' image ', 50, 255, heç bir şey) cv2.createTrackbar (' h_H ',' image ', 130, 255, heç bir şey) cv2. createTrackbar ('h_S', 'image', 255, 255, heç bir şey) cv2.createTrackbar ('h_V', 'image', 255, 255, heç bir şey) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (çərçivə, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'görüntü') lS = cv2.getTrackbarPos ('l_S', 'görüntü') lV = cv2.getTrackVPos, ' 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') low_R = np. array ([lH, lS, lV]) ali_R = np.array ([hH, hS, hV]) maska = cv2.inRange (hsv, alt_R, daha yüksək_R) res = cv2.bitwise_and (çərçivə, çərçivə, maska = maska) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Addım 6: BÖLMƏNİN İŞLƏNMƏSİ:

ƏMƏL EDİLMƏSİ BÖLMƏSİ
ƏMƏL EDİLMƏSİ BÖLMƏSİ

Əlin həndəsi formasına sahibik, indi onu istifadə etməyin və əl jestini anlamaq üçün istifadə etməyin vaxtı gəldi.

Konveks gövdə:

Konveks gövdə vasitəsilə, formada mövcud olan həddindən artıq nöqtələr vasitəsilə təxminən bir çoxbucaqlı yerləşdirməyə çalışırıq. Solda olan şəkil, qırmızı ilə işarələnmiş qabarıq nöqtələri olan forma verilən təxmini çoxbucağı göstərir.

Konveks nöqtələr, bu yaxınlaşdırılmış çoxbucağın bir tərəfindən ən uzaq olan formalı nöqtələrdir. Ancaq konveks gövdəsindəki problem, hesablama zamanı bütün qabarıq nöqtələrdən ibarət bir sıra əldə etməyimizdir, ancaq ehtiyacımız olan mavi uclu qabarıq nöqtədir. Niyə lazım olduğunu sizə xəbər verəcəyik.

Bu qabarıq nöqtəni tapmaq üçün ən yaxın tərəfi olan qabarıq nöqtənin məsafəsini tapmaq üçün dik məsafə düsturunu tətbiq etməliyik. Mavi sivri nöqtənin yan tərəfdən maksimum məsafəyə malik olduğunu müşahidə etdik və bu nöqtəni əldə edirik.

Addım 7:

Şəkil
Şəkil

Addım 8:

Şəkil
Şəkil

Sonra baş barmağının ucunu (və ya həddindən artıq nöqtəni) üfüqi olan bu qabarıq nöqtəyə birləşdirən xəttin meylini tapmalıyıq.

Addım 9:

Şəkil
Şəkil

Yuxarıda göstərilən vəziyyətdə, jest sola dönmə üçündürsə α bucağı 0 ilə 90 dərəcə arasında olmalıdır. Yəni tan (α) müsbət olmalıdır.

Addım 10:

Şəkil
Şəkil

Yuxarıda göstərilən halda, jest sağa dönmək üçündürsə α bucağı 180 ilə 90 dərəcə arasında olmalıdır. Yəni tan (α) mənfi olmalıdır.

Buna görə, Tan α müsbətdirsə, sola dönün. Tan α mənfi olarsa, sağa dönün. İndi ən vacib dayandırma əmrini necə aşkar edəcəyinizi görmək vaxtıdır.

Burada, müəyyən bir nisbət (vurma və sınaq yolu ilə tapılır) araşdırılır və maksimum hallarda bu məsafə nisbəti bu xüsusi aralığında qalır.

Addım 11:

Şəkil
Şəkil

Nəhayət, ön hərəkət jesti OpenCV -də matchShape () funksiyası ilə təhlil edilir. Bu funksiya, bu vəziyyətdə yuxarıdakı şəkildəki üçbucaqlı təlim nümunəsi ilə yuxarıdakı görüntünün sol tərəfindəki kontur arasındakı iki sayacın şəklini müqayisə edir. İki kontur şəklində mövcud olan dəyişikliyə görə 0 ilə 2 və ya 3 arasında dəyişən bir dəyər qaytarır. Eyni kontur üçün 0 qaytarır.

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

Burada cn1 və cnt2 müqayisə edilməli olan iki konturdur.

Addım 12: HƏRƏKƏT NƏZARƏTİ:

HƏRƏKƏT NƏZARƏTİ
HƏRƏKƏT NƏZARƏTİ

PySerial:

İşlənmiş məlumatları Arduino USB Kabel vasitəsilə Arduino Uno ilə əlaqə qurmaq üçün ardıcıl məlumatlara çevirmək üçün python PySerial kitabxanasından istifadə etdik. Opencv tərəfindən müəyyən bir jest aşkar edildikdən sonra 'x' deyən müvəqqəti bir dəyişən yaratdıq və ona unikal bir dəyər təyin etdik və aşağıdakı əmr satırından istifadə edərək serial girişinə çevirdik:-

Pyserial kitabxanasını idxal etmək üçün serial #-i idxal edin

serial. Serial ('', baudrate = '9600', timeout = '0') # serial çıxışı qurmaq.. PORT NAME, məlumat ötürülməsinin baş verəcəyi limanın adıdır.

serial.write (b'x ') # x limana göndərilən əlifba… b bu sətri bayta çevirməkdir.

Arduino İşləmə:

İndi arduino, hər bir fərqli seriya x -in robotun hamar bir hərəkətindən məsul olan müəyyən bir hərəkətlə xətti olaraq müqayisə edildiyi şəkildə kodlaşdırılmışdır (deyək ki, sol hərəkətin aşkarlanması sağdakı mühərrikləri sola çevirəcək). Kodu düzgün dəyişdirərək hər bir təkərin hərəkətini həm translational olaraq, həm də fırlanma ilə idarə edə bilərik.

L298N Motor sürücüsü:-

Motor Sürücü, aşağı gərginlik dərəcələri səbəbindən mühərriklərə birbaşa enerji verilə bilmədiyi üçün mühərriklə enerji mənbəyi arasında vasitəçi olaraq istifadə olunur. Li-Po Batareyası 12V giriş terminalına bağlıdır və biz arduino-nun 5V soketini motor sürücüsünün 5V giriş yuvasına, nəhayət Li-Po-nun və arduino-nun ümumi sürücülük yuvasına qoşuruq.

İndi mühərriklərin terminalları verilən rozetkalara bağlanır. Nəhayət, motorun giriş terminallarını arduinonun PWM çıxış yuvalarına bağlayırıq ki, hərəkətin fırlanma və tərcümə aspektlərini dəqiq bir şəkildə qərar verək.

Tövsiyə: