Spisu treści:

Gesture Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu: 13 kroków (ze zdjęciami)
Gesture Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu: 13 kroków (ze zdjęciami)

Wideo: Gesture Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu: 13 kroków (ze zdjęciami)

Wideo: Gesture Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu: 13 kroków (ze zdjęciami)
Wideo: World's Biggest RC Drone vs Airplane Fight #shorts #unicexperiment 2024, Lipiec
Anonim
Gest Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu
Gest Hawk: Robot sterowany gestami ręcznymi za pomocą interfejsu opartego na przetwarzaniu obrazu

Gesture Hawk został zaprezentowany w TechEvince 4.0 jako prosty interfejs człowiek-maszyna oparty na przetwarzaniu obrazu. Jego użyteczność polega na tym, że do sterowania zrobotyzowanym samochodem, który działa na zasadzie napędu różnicowego, nie są wymagane żadne dodatkowe czujniki ani urządzenia do noszenia poza rękawicą. W tej instrukcji przeprowadzimy Cię przez zasadę działania śledzenia obiektów i wykrywania gestów używanych w systemie. Kod źródłowy tego projektu można pobrać z Github poprzez link:

Krok 1: WYMAGANE RZECZY:

WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
WYMAGANE RZECZY
  1. Sterownik silnika L298N
  2. Silniki prądu stałego
  3. Podwozie samochodu robota
  4. Arduino Uno
  5. Akumulatory LiPo
  6. Kabel USB Arduino (długi)
  7. Biblioteka OpenCV z Pythonem

Krok 2: ZASADA DZIAŁANIA:

ZASADA DZIAŁANIA
ZASADA DZIAŁANIA

Gesture Hawk to trójfazowy system przetwarzania, jak widać na powyższym schemacie.

Krok 3: PRZECHWYTYWANIE I PRZETWARZANIE WEJŚCIA:

PRZECHWYTYWANIE I PRZETWARZANIE WEJŚCIA
PRZECHWYTYWANIE I PRZETWARZANIE WEJŚCIA

Przechwytywanie danych wejściowych można rozumieć w szerszych kategoriach podanych na powyższym schemacie.

Aby wydobyć kształt dłoni z otoczenia, musimy zastosować maskowanie lub filtrowanie określonego koloru (w tym przypadku – fioletowo-niebieskiego’). W tym celu należy przekonwertować obraz z formatu BGR na HSV, co można zrobić za pomocą poniższego fragmentu kodu.

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

Teraz następnym krokiem jest znalezienie pożądanego zakresu parametrów HSV, aby wyodrębnić rękę za pomocą maski lub filtra. W tym celu najlepszym sposobem jest użycie drążków do znalezienia odpowiedniego zakresu. Oto zrzut ekranu paska śledzenia używanego w tym projekcie.

Krok 4:

Obraz
Obraz

Krok 5:

Oto fragment kodu podany poniżej, aby stworzyć taki trackbar do budowy maski:

importuj cv2

importuj numpy jako npdef Nothing(x): pass cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, Nothing) cv2.createTrackbar('l_S ', 'obraz', 50, 255, nic) cv2.createTrackbar('l_V', 'obraz', 50, 255, nic) cv2.createTrackbar('h_H', 'obraz', 130, 255, nic) cv2. createTrackbar('h_S', 'image', 255, 255, nic) cv2.createTrackbar('h_V', 'image', 255, 255, nic) while(1): _, frame = img.read()

hsv = cv2.cvtColor(frame, 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') lower_R = np. array([lH, lS, lV]) wyższe_R = np.array([hH, hS, hV]) maska = cv2.inRange(hsv, niższe_R, wyższe_R) res = cv2.bitwise_and(ramka, ramka, maska= maska) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF jeśli k == 27: zerwij cv2.destroyAllWindows()

Krok 6: CZĘŚĆ PRZETWARZANIA:

CZĘŚĆ PRZETWARZANIA
CZĘŚĆ PRZETWARZANIA

Cóż, mamy już geometryczny kształt dłoni, teraz nadszedł czas, aby go wykorzystać i wykorzystać do wymyślenia gestu dłoni.

Wypukły kadłub:

Poprzez wypukły kadłub staramy się dopasować przybliżony wielokąt poprzez skrajne punkty obecne w kształcie. Obraz po lewej pokazuje przybliżony wielokąt, który został przypisany do kształtu z wypukłymi punktami zaznaczonymi na czerwono.

Punkty wypukłe to te punkty w kształcie, które znajdują się najdalej od boku tego przybliżonego wielokąta. Ale problem z wypukłą powłoką polega na tym, że podczas jej obliczania otrzymamy tablicę wszystkich punktów wypukłych, ale to, czego potrzebujemy, to niebieski punkt wypukły. Powiemy Ci, dlaczego jest to wymagane.

Aby znaleźć ten wypukły punkt, musimy zastosować wzór na odległość prostopadłą, aby znaleźć odległość punktu wypukłego o najbliższym boku. Zaobserwowaliśmy, że niebieski spiczasty punkt ma maksymalną odległość od boku i tak otrzymujemy ten punkt.

Krok 7:

Obraz
Obraz

Krok 8:

Obraz
Obraz

Następnie musimy znaleźć nachylenie linii łączącej czubek kciuka (lub punkt skrajny) z tym wypukłym punktem z poziomym.

Krok 9:

Obraz
Obraz

W powyższym przypadku kąt α powinien wynosić od 0 do 90 stopni, jeśli gest dotyczy skrętu w lewo. Oznacza to, że tan(α) powinno być dodatnie.

Krok 10:

Obraz
Obraz

W powyższym przypadku kąt α powinien wynosić od 180 do 90 stopni, jeśli gest dotyczy skrętu w prawo. Oznacza to, że tan(α) powinno być ujemne.

Dlatego jeśli Tan α jest dodatnie, to skręt w lewo. Jeśli Tan α jest ujemne, to skręt w prawo. Teraz nadszedł czas, aby zobaczyć, jak wykryć najważniejsze polecenie zatrzymania.

Tutaj sprawdzany jest określony stosunek (znaleziony przez trafienie i próbę) i w maksymalnych przypadkach ten stosunek odległości pozostaje w tym konkretnym zakresie.

Krok 11:

Obraz
Obraz

Na koniec gest ruchu do przodu jest analizowany przez funkcję matchShape() w OpenCV. Ta funkcja porównuje kształt dwóch liczników, w tym przypadku, między przykładem treningu na prawym na powyższym obrazku a konturem po lewej stronie powyższego obrazu. Zwraca wartość z zakresu od 0 do 2 lub 3, w zależności od zmiany występującej w kształcie dwóch konturów. Dla identycznego konturu zwraca 0.

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

Tutaj cn1 i cnt2 są dwoma konturami, które należy porównać.

Krok 12: KONTROLA RUCHU:

KONTROLA RUCHU
KONTROLA RUCHU

PySerial:

Wykorzystaliśmy bibliotekę Pythona PySerial do konwersji przetworzonych danych na dane szeregowe w celu komunikacji z Arduino Uno za pomocą kabla Arduino USB. Po wykryciu określonego gestu przez opencv utworzyliśmy tymczasową zmienną "x" i przypisaliśmy jej unikalną wartość i przekonwertowaliśmy ją na wejście szeregowe za pomocą następującego wiersza poleceń: -

import serial #aby zaimportować bibliotekę Pyserial

serial. Serial('', baudrate = '9600', timeout = '0') # ustawienie wyjścia szeregowego.. NAZWA PORTU to nazwa portu, przez który nastąpi transmisja danych.

serial.write(b'x') # x to alfabet wysyłany do portu …b ma za zadanie przekonwertować ten ciąg na bajty.

Przetwarzanie Arduino:

Teraz arduino jest zakodowane w taki sposób, że każdy inny serial x jest liniowo mapowany do określonej akcji odpowiedzialnej za płynny ruch robota (powiedzmy, że wykrycie lewego gestu uruchomi silniki na prawo, aby skręcić w lewo). Możemy kontrolować ruch każdego koła zarówno translacyjnie, jak i obrotowo poprzez odpowiednią zmianę kodu.

L298N Sterownik silnika:-

Sterownik silnika służy jako pośrednik między silnikiem a źródłem zasilania, ponieważ silników nie można bezpośrednio zasilać ze względu na niskie napięcie znamionowe. Akumulator Li-Po jest podłączony do jego zacisku wejściowego 12 V, a gniazdo 5 V arduino łączymy z gniazdem wejściowym 5 V sterownika silnika, ostatecznie łącząc masę Li-Po, a także arduino we wspólnym gnieździe masy sterownika silnika.

Teraz zaciski silników są połączone w podanych gniazdach. Na koniec podłączamy zaciski wejściowe silnika do gniazd wyjściowych PWM arduino, pozwalając nam swobodnie decydować o dokładnych aspektach ruchu obrotowego i translacji.

Zalecana: