Spisu treści:

Robot śledzący piłkę: 8 kroków
Robot śledzący piłkę: 8 kroków

Wideo: Robot śledzący piłkę: 8 kroków

Wideo: Robot śledzący piłkę: 8 kroków
Wideo: Jak zbudować robota który śledzi piłkę? (Python, OpenCV) 2024, Grudzień
Anonim
Robot śledzący piłkę
Robot śledzący piłkę
Robot śledzący piłkę
Robot śledzący piłkę
Robot śledzący piłkę
Robot śledzący piłkę

W tym miejscu opowiem, jak zrobić robota śledzącego piłkę, który będzie identyfikował piłkę i podążał za nią. Jest to w zasadzie zautomatyzowana technika nadzoru, którą można wykorzystać we współczesnym świecie. Więc po prostu wskoczmy i zacznijmy budować…

UWAGA: To zadanie częściowe przesłane do Deakin University, School of IT, SIT-210 Embedded Systems Development

Kieszonkowe dzieci

www.hackster.io/junejarohan/ball-tracking-robot-7a9865

Krok 1: Wprowadzenie

Wstęp
Wstęp

Dzisiejszy nadzór ma poważną wadę, ponieważ opiera się na zaangażowaniu ludzi, których, jak wszyscy wiemy, można łatwo odwrócić, dlatego niezwykle ważne było dla nas odkrycie systemu, który może monitorować regiony w sposób autonomiczny i ciągły. A także chcemy identyfikować nieprzyjemne lub niechciane rzeczy i zagrożenia, jednocześnie podejmując decyzje i odpowiednio na nie reagować. Tak więc śledzenie obiektów za pomocą inteligentnych systemów i komputerów jest niezbędne i kluczowe dla osiągnięcia zautomatyzowanego nadzoru.

Każdy zewnętrzny system nadzoru musi być w stanie śledzić obiekty poruszające się w jego polu widzenia, klasyfikować te obiekty i wykrywać niektóre z ich działań. Opracowałem metodę śledzenia i klasyfikowania tych obiektów w realistycznych scenariuszach. Śledzenie obiektów w jednej kamerze odbywa się za pomocą odejmowania tła, a następnie korespondencji regionów. Uwzględnia to wiele wskazówek, w tym prędkości, rozmiary i odległości ramek ograniczających.

Krok 2: Materiały i oprogramowanie użyte w tym projekcie

Materiały i oprogramowanie użyte w tym projekcie
Materiały i oprogramowanie użyte w tym projekcie
Materiały i oprogramowanie użyte w tym projekcie
Materiały i oprogramowanie użyte w tym projekcie
Materiały i oprogramowanie użyte w tym projekcie
Materiały i oprogramowanie użyte w tym projekcie

Używane komponenty sprzętowe:

  • Raspberry Pi (x1)
  • Moduł kamery Raspberry Pi (x1)
  • Czujnik ultradźwiękowy (x3)
  • Sterowniki silników SparkFun Dual H-Bridge L298 (x1)
  • Silnik prądu stałego (x1)
  • Deska do krojenia chleba (x1)
  • Podłączanie przewodów

Używane oprogramowanie:

Otwórz CV

Narzędzia ręczne:

Pyton

Krok 3: Co robić?

Każdy zewnętrzny system nadzoru musi być w stanie śledzić obiekty poruszające się w jego polu widzenia, klasyfikować te obiekty i wykrywać niektóre z ich działań. Opracowałem metodę śledzenia i klasyfikowania tych obiektów w realistycznych scenariuszach. Śledzenie obiektów w jednej kamerze odbywa się za pomocą odejmowania tła, a następnie korespondencji regionów. Uwzględnia to wiele wskazówek, w tym prędkości, rozmiary i odległości ramek ograniczających.

Kluczową rzeczą przy wykrywaniu obrazów klatka po klatce było uniknięcie jakichkolwiek spadków klatek, ponieważ wtedy bot może przejść w stan zawieszenia, jeśli bot nie zauważy kierunku ruchu piłki z powodu spadków klatek. Jeśli piłka wyjdzie poza zasięg kamery, przejdzie w stan, który nazywamy stanem zawieszenia, w takim przypadku bot wykonuje obrót o 360 stopni, aby zobaczyć przestrzeń wokół niej, aż piłka wróci kamerę, a następnie zacznij poruszać się w jej kierunku.

Do analizy obrazu pobieram każdą klatkę, a następnie maskuję ją potrzebnym kolorem. Następnie znajduję wszystkie kontury i znajduję największy z nich i oprawiam go w prostokąt. I pokaż prostokąt na głównym obrazie i znajdź współrzędne środka prostokąta.

Wreszcie bot próbuje przenieść współrzędne piłki do środka jej osi współrzędnych. Tak działa robot. Można to dodatkowo wzmocnić, używając urządzenia IoT, takiego jak cząsteczka fotonu, która może informować o wykryciu przedmiotu io tym, że robot za nim podąża lub gdy robot zgubił go i teraz wraca do bazy.

W celu przetwarzania obrazu musisz zainstalować oprogramowanie OpenCV na swoim raspberry pi, co było dla mnie dość trudne.

Możesz uzyskać wszelkie informacje wymagane do zainstalowania OpenCV za pomocą tego linku: kliknij tutaj

Krok 4: Schematy

Image
Image
Schematy
Schematy
Schematy
Schematy

Powyżej podałem schemat do mojego projektu, a wraz z nim jest płytka drukowana (PCB).

A oto niektóre z głównych połączeń, które musisz zrobić:

• Przede wszystkim moduł kamery Raspberry Pi jest bezpośrednio podłączony do Raspberry Pi.

• Czujniki ultradźwiękowe VCC są podłączone do wspólnego zacisku, tak samo jak GND (masa), a pozostałe dwa porty czujnika ultradźwiękowego są podłączone do pinów GPIO na Raspberry Pi.

• Silniki są połączone za pomocą mostka H.

• Zasilanie jest dostarczane z baterii.

Dodałem również film, który może pomóc w zrozumieniu działania czujnika ultradźwiękowego i jego działania.

a także możesz skorzystać z tego linku, jeśli nie możesz znaleźć powyższego filmu.

Krok 5: Jak to zrobić?

Zrobiłem ten projekt przedstawiający podstawowego robota, który może śledzić piłkę. Robot wykorzystuje kamerę do przetwarzania obrazu poprzez robienie klatek i śledzenie piłki. Do śledzenia piłki wykorzystuje się różne cechy, takie jak jej kolor, rozmiar, kształt.

Robot znajduje zakodowany kolor, a następnie szuka kuli tego koloru i podąża za nią. Wybrałem Raspberry Pi jako mikrokontroler w tym projekcie, ponieważ pozwala na użycie jego modułu kamery i daje dużą elastyczność w kodzie, ponieważ używa języka Pythona, który jest bardzo przyjazny dla użytkownika, a także pozwala nam używać biblioteki OpenCV do analizy obrazów.

Do przełączania kierunku obrotów silników lub ich zatrzymywania zastosowano mostek H.

Do analizy obrazu pobieram każdą klatkę, a następnie maskuję ją potrzebnym kolorem. Następnie znajduję wszystkie kontury i znajduję największy z nich i oprawiam go w prostokąt. I pokaż prostokąt na głównym obrazie i znajdź współrzędne środka prostokąta.

Wreszcie bot próbuje przenieść współrzędne piłki do środka jej osi współrzędnych. Tak działa robot. Można to dodatkowo wzmocnić, używając urządzenia IoT, takiego jak cząsteczka fotonu, która może informować o wykryciu przedmiotu io tym, że robot za nim podąża lub gdy robot zgubił go i teraz wraca do bazy. W tym celu będziemy korzystać z internetowej platformy oprogramowania, która łączy urządzenia i pozwala im wykonywać określone działania na określonych wyzwalaczach, czyli wyzwalaczach IFTTT.

Krok 6: Pseudo-kod

Pseudo kod
Pseudo kod

Oto pseudokod części wykrywającej przy użyciu OpenCV, w której wykrywamy piłkę.

Krok 7: Kod

Kod
Kod
Kod
Kod
Kod
Kod
Kod
Kod

Powyżej znajdują się fragmenty kodu, a poniżej szczegółowy opis kodu.

# zaimportuj niezbędne pakiety

IMPORTUJEMY WSZYSTKIE POTRZEBNE OPAKOWANIA

from picamera.array import PiRGBArray #Ponieważ w raspberry pi występuje problem z rozdzielczością, nie będzie można przechwytywać klatek przez VideoCapture

z picamera importuj PiCamera importuj RPi. GPIO jako GPIO importuj czas importuj numpy jako np

TERAZ KONFIGURUJEMY SPRZĘT I PRZYDZIELAMY PINY PODŁĄCZONE DO RASPBERRY PI

GPIO.setmode(GPIO. BOARD)

GPIO_TRIGGER1 = 29 #Lewy czujnik ultradźwiękowy

GPIO_ECHO1 = 31

GPIO_TRIGGER2 = 36 #Przedni czujnik ultradźwiękowy

GPIO_ECHO2 = 37

GPIO_TRIGGER3 = 33 #Prawy czujnik ultradźwiękowy

GPIO_ECHO3 = 35

SILNIK1B=18 #Lewy silnik

SILNIK1E=22

SILNIK2B=21 #Prawy silnik

SILNIK2E=19

LED_PIN=13 #Jeżeli znajdzie kulkę to zapali się dioda

# Ustaw szpilki jako wyjście i wejście

GPIO.setup(GPIO_TRIGGER1, GPIO. OUT) # Wyzwalacz GPIO.setup(GPIO_ECHO1, GPIO. IN) # Echo GPIO.setup(GPIO_TRIGGER2, GPIO. OUT) # Wyzwalacz GPIO.setup(GPIO_ECHO2, GPIO. IN) GPIO.setup(GPIO_TRIGGER3, GPIO. OUT) # Wyzwalanie GPIO.setup(GPIO_ECHO3, GPIO. IN) GPIO.setup(LED_PIN, GPIO. OUT)

# Ustaw wyzwalacz na False (Niski)

GPIO.output (GPIO_TRIGGER1, False) GPIO.output (GPIO_TRIGGER2, False) GPIO.output (GPIO_TRIGGER3, False)

FUNKCJA TA WYKORZYSTUJE WSZYSTKIE CZUJNIKI ULTRADŹWIĘKOWE ZBIERZ ODLEGŁOŚĆ OD OBIEKTÓW WOKÓŁ NASZEGO BOTA

# Pozwól modułowi się osiedlić

def sonar(GPIO_TRIGGER, GPIO_ECHO): start=0 stop=0 # Ustaw piny jako wyjście i wejście GPIO.setup(GPIO_TRIGGER, GPIO. OUT) # Trigger GPIO.setup(GPIO_ECHO, GPIO. IN) # Echo # Ustaw wyzwalacz na False (Low) GPIO.output(GPIO_TRIGGER, False) # Zezwól modułowi na ustawienie time.sleep(0.01) #gdy odległość > 5: #Wyślij impuls 10us, aby wyzwolić GPIO.output(GPIO_TRIGGER, True) time.sleep(0.00001) GPIO. output(GPIO_TRIGGER, False) begin = time.time() podczas gdy GPIO.input(GPIO_ECHO)==0 i time.time()

PRZYGOTOWANIE SILNIKÓW PRĄDU STAŁEGO DO PRACY Z MALINOWYM PI

GPIO.setup(MOTOR1B, GPIO. OUT)

GPIO.setup(MOTOR1E, GPIO. OUT)

GPIO.setup(MOTOR2B, GPIO. OUT) GPIO.setup(MOTOR2E, GPIO. OUT)

ZDEFINIOWANIE FUNKCJI OBSŁUGI ROBOTA I WPROWADZANIA GO W RÓŻNYCH KIERUNKACH

def naprzód():

GPIO.output(MOTOR1B, GPIO. HIGH) GPIO.output(MOTOR1E, GPIO. LOW) GPIO.output(MOTOR2B, GPIO. HIGH) GPIO.output(MOTOR2E, GPIO. LOW) def reverse(): GPIO.output(MOTOR1B, GPIO. LOW) GPIO.output(MOTOR1E, GPIO. HIGH) GPIO.output(MOTOR2B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO. HIGH) def rightturn(): GPIO.output(MOTOR1B, GPIO. LOW) GPIO.output(MOTOR1E, GPIO. HIGH) GPIO.output(MOTOR2B, GPIO. HIGH) GPIO.output(MOTOR2E, GPIO. LOW) def leftturn(): GPIO.output(MOTOR1B, GPIO. HIGH) GPIO.output(MOTOR1E), GPIO. LOW) GPIO.output(MOTOR2B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO. HIGH)

def stop():

GPIO.output(MOTOR1E, GPIO. LOW) GPIO.output(MOTOR1B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO. LOW) GPIO.output(MOTOR2B, GPIO. LOW)

URUCHOMIENIE MODUŁU KAMERY I REGULACJA USTAWIEŃ

#ZDJĘCIE KAMERY

#zainicjuj kamerę i pobierz odwołanie do nieprzetworzonego przechwytywania kamery camera = PiCamera() camera.resolution = (160, 120) camera.framerate = 16 rawCapture = PiRGBArray(camera, size=(160, 120)) # zezwól na kamerę do czasu rozgrzewki.sleep(0.001)

TERAZ REALIZUJEMY NAJWAŻNIEJSZĄ RZECZ GDZIE BOT PODĄŻA ZA PIŁKĄ I UNIKAJĄC PRZESZKÓD NA DRODZE

while(1<10): { #odległość od przedniego czujnika ultradźwiękowego odległośćC = sonar(GPIO_TRIGGER2, GPIO_ECHO2) #odległość od prawego czujnika ultradźwiękowego odległośćR = sonar(GPIO_TRIGGER3, GPIO_ECHO3) #odległość od lewego czujnika ultradźwiękowego odległośćL = sonar(GPIO_TRIGGER1, GPIO_ECHO1) if(distanceC=8: rightturn() time.sleep(0.00625) stop() time.sleep(0.0125) forward() time.sleep(0.00625) stop() time.sleep(0.0125) #gdy znaleziono== 0: leftturn() time.sleep(0.00625) elif distanceL>=8: leftturn() time.sleep(0.00625) stop() time.sleep(0.0125) forward() time.sleep(0.00625) stop() time.sleep (0.0125) rightturn() time.sleep(0.00625) stop() time.sleep(0.0125) else: stop() time.sleep(0.01) else: #w przeciwnym razie przesuwa się do przodu() time.sleep(0.00625) if(distanceC>10): #przenosi współrzędne kuli na środek wyobrażonej osi kamery.if(centre_x=20): if(centre_x0): flag=1 leftturn() time.sleep(0.025) forward() time.sleep(0.00003125) stop() time.sleep(0.00625) else: stop() time.sleep(0.01)

w przeciwnym razie:

#jeżeli trafi piłkę i jest za blisko zapala się dioda. GPIO.output(LED_PIN, GPIO. HIGH) time.sleep(0.1) stop() time.sleep(0.1) #cv2.imshow("draw", frame) rawCapture.truncate(0) # wyczyść strumień w ramach przygotowań do następna klatka }

WYKONAJ NIEZBĘDNE PORZĄDKI

GPIO.cleanup() #uwolnij wszystkie piny GPIO

Krok 8: Linki zewnętrzne

Link do filmu demonstracyjnego: kliknij tutaj (Youtube)

Link do kodu na Git-hub: kliknij tutaj (Git-Hub)

Zalecana: