Съдържание:

Gesture Hawk: Робот с ръчен контрол с жестове, използващ интерфейс за обработка на изображения: 13 стъпки (със снимки)
Gesture Hawk: Робот с ръчен контрол с жестове, използващ интерфейс за обработка на изображения: 13 стъпки (със снимки)

Видео: Gesture Hawk: Робот с ръчен контрол с жестове, използващ интерфейс за обработка на изображения: 13 стъпки (със снимки)

Видео: Gesture Hawk: Робот с ръчен контрол с жестове, използващ интерфейс за обработка на изображения: 13 стъпки (със снимки)
Видео: ACE The Autonomous City Explorer Project 2024, Ноември
Anonim
Gesture Hawk: Робот с ръчен жест, управляван с помощта на интерфейс за обработка на изображения
Gesture Hawk: Робот с ръчен жест, управляван с помощта на интерфейс за обработка на изображения

Gesture Hawk беше представен в TechEvince 4.0 като прост интерфейс човек-машина, базиран на обработка на изображения. Полезността му се състои във факта, че не са необходими допълнителни сензори или носене, освен ръкавица за управление на роботизираната кола, която работи на принципа на диференциално задвижване. В тази инструкция ще ви преведем през принципа на работа зад проследяването на обекти и откриването на жестове, използвани в системата. Изходният код на този проект може да бъде изтеглен от Github чрез връзка:

Стъпка 1: ИЗИСКВАНИ НЕЩА:

ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
ИЗИСКВАНИ НЕЩА
  1. L298N шофьор на мотор
  2. DC двигатели
  3. Роботно шаси на автомобил
  4. Arduino Uno
  5. LiPo батерии
  6. Arduino USB кабел (дълъг)
  7. Библиотека на OpenCV с Python

Стъпка 2: РАБОТЕН ПРИНЦИП:

РАБОТЕН ПРИНЦИП
РАБОТЕН ПРИНЦИП

Gesture Hawk е трифазна система за обработка, както можете да видите на горната диаграма.

Стъпка 3: ВЪВЕЖДАНЕ НА ЗАЛАГАНЕ И ОБРАБОТКА:

ВХОД И УПРАВЛЕНИЕ
ВХОД И УПРАВЛЕНИЕ

Захващането на входа може да се разбира в по -широките категории, дадени в горната диаграма.

За да извлечем формата на ръката от околната среда, трябва да използваме маскиране или филтриране на определен цвят (в случая - виолетово синьо’). За да направите това, трябва да конвертирате изображението от BGR във формат HSV, което може да стане с помощта на следния кодов фрагмент.

hsv = cv2.cvtColor (рамка, cv2. COLOR_BGR2HSV)

Следващата стъпка е да намерите желания диапазон от параметри на HSV, за да извадите ръката чрез маска или филтър. За това най -добрият начин е да използвате щанги за намиране на подходящ обхват. Ето екранна снимка на лента за песни, използвана за този проект.

Стъпка 4:

Образ
Образ

Стъпка 5:

Тук има кодов фрагмент, даден по -долу, за да направите такава лента за изграждане на маска:

импортиране на cv2

импортиране на numpy като npdef нищо (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 (рамка, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'изображение') lS = cv2.getTrackbarPos ('l_S', 'изображение') 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. масив ([lH, lS, lV]) по -висок_R = np.масив ([hH, hS, hV]) маска = cv2.inRange (hsv, lower_R, по -висок_R) res = cv2. bitwise_and (рамка, рамка, маска = маска) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()

Стъпка 6: ЧАСТ НА ОБРАБОТКА:

ЧАСТ НА ОБРАБОТКА
ЧАСТ НА ОБРАБОТКА

Е, имаме геометрична форма на ръка, сега е време да я използваме и да я използваме, за да разберем жеста на ръката.

Изпъкнал корпус:

Чрез изпъкнал корпус се опитваме да поставим приблизителен многоъгълник през крайни точки, присъстващи във формата. Наличното изображение вляво показва приблизителния полигон, който е бил присвоен на формата с изпъкналите точки, маркирани с червено.

Изпъкналите точки са тези точки във формата, които са най -отдалечени от страна на този приближен многоъгълник. Но проблемът с изпъкналата обвивка е, че по време на нейното изчисление ще получим масив от всички изпъкнали точки, но това, от което се нуждаем, е синята заострена изпъкнала точка. Ще ви кажем защо е необходимо.

За да намерим тази изпъкнала точка, трябва да приложим формулата за перпендикулярно разстояние за намиране на разстоянието на изпъкналата точка с най -близката страна. Забелязахме, че синята заострена точка притежава максимално разстояние от страната и така получаваме тази точка.

Стъпка 7:

Образ
Образ

Стъпка 8:

Образ
Образ

След това трябва да намерим наклона на линията, свързваща върха на палеца (или крайната точка) към тази изпъкнала точка с хоризонтала.

Стъпка 9:

Образ
Образ

В горния случай ъгълът α трябва да бъде между 0 до 90 градуса, ако жестът е за завой наляво. Тоест тен (α) трябва да е положителен.

Стъпка 10:

Образ
Образ

В горния случай ъгълът α трябва да бъде между 180 до 90 градуса, ако жестът е за десен завой. Тоест тен (α) трябва да е отрицателен.

Следователно, ако Tan α е положителен, тогава завийте наляво. Ако Tan α е отрицателен, тогава завийте надясно. Сега е време да видим как да открием най -важната команда за спиране.

Тук се изследва определено съотношение (установено чрез попадение и проба) и в максимални случаи това съотношение на разстоянията остава в този конкретен диапазон.

Стъпка 11:

Образ
Образ

Най -накрая, жестът за движение напред се анализира от функцията matchShape () в OpenCV. Тази функция сравнява формата на два брояча, в този случай, между пример за тренировка на thright в горната картина с контура в лявата страна на горното изображение. Той връща стойност, варираща от 0 до 2 или 3, в зависимост от вариацията във формата на два контура. За идентично същия контур връща 0.

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

Тук cn1 и cnt2 са двата контура, които трябва да бъдат сравнени.

Стъпка 12: КОНТРОЛ НА ДВИЖЕНИЕТО:

КОНТРОЛ НА ДВИЖЕНИЯТА
КОНТРОЛ НА ДВИЖЕНИЯТА

PySerial:

Използвахме PySerial библиотека на python, за да преобразуваме обработените данни в серийни данни, за да се съобщи на Arduino Uno чрез Arduino USB кабел. След като конкретен жест беше открит от opencv, ние създадохме временна променлива, наречена „x“и му присвоихме някаква уникална стойност и я преобразувахме в сериен вход, като използваме следния команден ред:-

import serial #to import Pyserial library

serial. Serial ('', baudrate = '9600', timeout = '0') # настройка на сериен изход.. PORT NAME е името на порта, през който ще се осъществява предаването на данни.

serial.write (b'x ') # x е азбуката, изпратена до порта … b е за преобразуване на този низ в байтове.

Arduino обработка:

Сега arduino е кодиран по такъв начин, че всеки различен сериен х е линейно съпоставен с определено действие, отговорно за плавното движение на робота (да речем откриването на ляв жест ще задейства двигателите отдясно, за да завие наляво). Можем да контролираме движението на всяко колело транслационно, както и ротационно, като променим кода правилно.

L298N Драйвер на двигателя:-

Motor Driver се използва като посредник между двигателя и източника на захранване, тъй като двигателите не могат да се захранват директно поради ниско напрежение. Li-Po батерията е свързана към своя 12V входен терминал и ние свързваме 5V гнездото на arduino към 5V входа на драйвера на двигателя, като най-накрая свързваме земята на Li-Po, както и arduino в общ заземен контакт на драйвера на двигателя.

Сега клемите на двигателите са свързани към дадени гнезда. Накрая свързваме входните клеми за двигателя към PWM изходните гнезда на arduino, което ни позволява да решим точно ротационните и транслационните аспекти на движението.

Препоръчано: