Spisu treści:

Samouczek wykrywania obiektów robota czworonożnego Jetson Nano: 4 kroki
Samouczek wykrywania obiektów robota czworonożnego Jetson Nano: 4 kroki

Wideo: Samouczek wykrywania obiektów robota czworonożnego Jetson Nano: 4 kroki

Wideo: Samouczek wykrywania obiektów robota czworonożnego Jetson Nano: 4 kroki
Wideo: Sieci neuronowe do wykrywania obiektów 0030 2024, Czerwiec
Anonim
Image
Image

Nvidia Jetson Nano to zestaw programistyczny, który składa się z SoM (System on Module) i referencyjnej płytki nośnej. Jest przeznaczony przede wszystkim do tworzenia systemów wbudowanych, które wymagają dużej mocy obliczeniowej dla zastosowań uczenia maszynowego, widzenia maszynowego i przetwarzania wideo. Możesz obejrzeć szczegółową recenzję tego na moim kanale YouTube.

Nvidia stara się, aby Jetson Nano był jak najbardziej przyjazny dla użytkownika i łatwy w opracowywaniu projektów. Rozpoczęli nawet mały kurs, jak zbudować robota z Jetson Nano, kilka dni po premierze tablicy. Szczegóły dotyczące tego projektu znajdziesz tutaj.

Jednak sam miałem kilka problemów z Jetbotem jako projektem:

1) To nie było dla mnie wystarczająco EPIC. Jetson Nano to bardzo ciekawa deska ze świetnymi możliwościami przetwarzania, a zrobienie z niej prostego robota kołowego wydawało się po prostu bardzo… rozczarowującą rzeczą.

2) Wybór sprzętu. Jetbot wymaga pewnego sprzętu, który jest drogi/można go zastąpić innymi alternatywami - na przykład używa joysticka do zdalnej obsługi. Brzmi fajnie, ale czy naprawdę potrzebuję joysticka do sterowania robotem?

Tak więc zaraz po tym, jak dostałem w swoje ręce Jetson Nano, zacząłem pracować nad własnym projektem, Jetspiderem. Pomysł polegał na zreplikowaniu podstawowych wersji demonstracyjnych, które miał Jetbot, ale z bardziej powszechnym sprzętem i możliwym do zastosowania w szerszej gamie projektów.

Krok 1: Przygotuj swój sprzęt

Przygotuj swój sprzęt
Przygotuj swój sprzęt

Do tego projektu wykorzystałem wczesny prototyp czworonożnego robota Zuri, wykonany przez Zoobotics. Długo leżał w laboratorium naszej firmy. Wyposażyłem go w wycinany laserowo drewniany uchwyt do Jetson Nano i uchwyt do aparatu. Ich konstrukcja jest zastrzeżona, więc jeśli dla swojego robota Jetson Nano chcesz stworzyć coś podobnego, możesz rzucić okiem na projekt Meped, który jest podobnym czworonogiem z projektem open-source. W rzeczywistości, ponieważ nikt nie miał kodu źródłowego mikrokontrolera Zuri (Arduino Mega) w naszym laboratorium, użyłem kodu z Mepeda z drobnymi poprawkami w przesunięciu nóg/stopek.

Użyłem zwykłej kamery internetowej zgodnej z USB Raspberry Pi i klucza USB Wifi.

Najważniejsze jest to, że ponieważ zamierzamy używać Pyserial do komunikacji szeregowej między mikrokontrolerem a Jetson Nano, twój system może zasadniczo używać dowolnego typu mikrokontrolera, o ile może być połączony z Jetson Nano za pomocą kabla szeregowego USB. Jeśli twój robot wykorzystuje silniki prądu stałego i sterownik silnika (na przykład oparty na L298P), możliwe jest bezpośrednie połączenie sterownika silnika z Jetson Nano GPIO. Ale niestety do sterowania serwami można użyć tylko innego mikrokontrolera lub dedykowanego sterownika serwomechanizmu I2C, ponieważ Jetson Nano nie ma sprzętowego GPIO PWM.

Podsumowując, możesz użyć robota z dowolnym mikrokontrolerem, który można połączyć z Jetson Nano za pomocą kabla USB. Przesłałem kod dla Arduino Mega do repozytorium github dla tego samouczka, a część związana z połączeniem Jetson Nano z Arduino jest tutaj:

if(Serial.available()) {przełącznik(Serial.read()) {

{

przypadek 1':

Naprzód();

przerwa;

przypadek „2”:

plecy();

przerwa;

przypadek „3”:

Skręć w prawo();

przerwa;

przypadek „4”:

Skręć w lewo();

przerwa;

Sprawdzamy, czy są dostępne dane, a jeśli tak, przekazujemy je do struktury kontrolnej switch-case. Zwróć uwagę, że dane z numeru seryjnego są znakami, zwróć uwagę na pojedynczy cudzysłów wokół cyfr 1, 2, 3, 4.

Krok 2: Zainstaluj niezbędne pakiety

Na szczęście dla nas domyślny obraz systemu Jetson Nano zawiera wiele preinstalowanych elementów (takich jak OpenCV, TensorRT itp.), więc wystarczy zainstalować kilka innych pakietów, aby kod działał i włączyć SSH.

Zacznijmy od włączenia SSH na wypadek, gdybyś chciał wykonać całą resztę pracy zdalnie.

aktualizacja sudo apt

sudo apt install openssh-server

Serwer SSH uruchomi się automatycznie.

Aby połączyć się z komputerem Ubuntu przez sieć LAN, wystarczy wpisać następujące polecenie:

ssh nazwa_użytkownika@adres_ip

Jeśli masz komputer z systemem Windows, będziesz musiał zainstalować klienta SSH, na przykład Putty.

Zacznijmy od zainstalowania Pythona Package Manager(pip) i Pillow do manipulacji obrazami.

sudo apt zainstaluj python3-pip python3-pil

Następnie zainstalujemy repozytorium Jetbot, ponieważ polegamy na niektórych częściach jego struktury do wykrywania obiektów.

sudo apt install python3-smbus python-pyserial

klon git

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py zainstalować

Na koniec sklonuj moje repozytorium Github dla tego projektu do swojego katalogu domowego i zainstaluj Flask i kilka innych pakietów do zdalnego sterowania robotem za pomocą serwera WWW.

klon git

Płyta CD

sudo pip3 install -r wymagania-opencv

Pobierz przeszkolony model SSD (Single Shot Detector) z tego linku i umieść go w folderze jetspider_demos.

Teraz możemy iść!

Krok 3: Uruchom kod

Uruchom kod
Uruchom kod

Zrobiłem dwa dema dla Jetspider, pierwsze to prosta teleopacja, bardzo podobna do tej, którą zrobiłem wcześniej dla łazika Banana Pi, a drugie wykorzystuje TensorRT do wykrywania obiektów i wysyła polecenia ruchu przez połączenie szeregowe do mikrokontrolera.

Ponieważ większość kodu teleoperacji jest opisana w moim innym samouczku (wprowadziłem tylko drobne poprawki, poprawiając transmisję wideo), tutaj skupię się na części Object Detection.

Główny skrypt do śledzenia obiektu to object_following.py w jetspider_object_following, dla teleoperacji spider_teleop.py w jetspider_teleoperation.

Obiekt następujący po skrypcie rozpoczyna się od zaimportowania niezbędnych modułów oraz zadeklarowania zmiennych i instancji klas. Następnie uruchamiamy serwer sieciowy Flask z tą linią

app.run(host='0.0.0.0', threaded=True)

Jak tylko otworzymy adres 0.0.0.0(localhost) w naszej przeglądarce internetowej lub adres Jetson Nano w sieci (można sprawdzić za pomocą polecenia ifconfig), ta funkcja zostanie wykonana

zdefiniuj indeks():

Renderuje szablon strony internetowej, który mamy w folderze szablonów. Szablon ma wbudowane źródło wideo, więc po zakończeniu ładowania zostanie wykonane def video_feed():, które zwróci obiekt Response zainicjowany funkcją generatora.

Sekret implementacji aktualizacji w miejscu (aktualizacja obrazu na stronie internetowej dla naszego strumienia wideo) polega na użyciu odpowiedzi wieloczęściowej. Odpowiedzi wieloczęściowe składają się z nagłówka zawierającego jeden z typów zawartości wieloczęściowej, po którym następują części oddzielone znacznikiem granicy, z których każdy ma swój własny typ zawartości specyficznej dla części.

W funkcji def gen(): implementujemy funkcję generatora w nieskończonej pętli, która przechwytuje obraz, wysyła go do funkcji def execute(img): w wyniku czego otrzymujemy obraz do wysłania na stronę internetową.

def execute(img): funkcja jest miejscem, w którym dzieje się cała magia, pobiera obraz, zmienia jego rozmiar za pomocą OpenCV i przekazuje go do instancji klasy Jetbot ObjectDetector „model”. Zwraca listę wykryć, a my używamy OpenCV do rysowania wokół nich niebieskich prostokątów i pisania adnotacji z klasą wykrytego obiektu. Następnie sprawdzamy, czy istnieje interesujący nas obiekt detectmatching_detections = [d for d in detections[0] if d['label'] == 53]

Możesz zmienić ten numer (53) na inny numer z zestawu danych CoCo, jeśli chcesz, aby twój robot podążał za innymi obiektami, 53 to jabłko. Cała lista znajduje się w pliku Categories.py.

Na koniec, jeśli przez 5 sekund nie zostanie wykryty żaden obiekt, przesyłamy znak „5”, aby robot zatrzymał się przez numer seryjny. Jeśli obiekt zostanie znaleziony, obliczamy odległość od środka obrazu i odpowiednio postępujemy (jeśli blisko środka, idź prosto (znak "1" na serialu), jeśli po lewej, idź w lewo, itd.). Możesz grać z tymi wartościami, aby określić najlepszą dla swojej konkretnej konfiguracji!

Krok 4: Ostatnie myśli

Końcowe przemyślenia
Końcowe przemyślenia

Oto sedno demonstracji ObjectFollowing. Jeśli chcesz dowiedzieć się więcej o strumieniowaniu wideo na serwerze internetowym Flask, możesz rzucić okiem na ten wspaniały samouczek autorstwa Miguela Grinberga.

Możesz również rzucić okiem na notatnik Nvidia Jetbot Object Detection tutaj.

Mam nadzieję, że moje implementacje dem Jetbot pomogą zbudować Twojego robota z wykorzystaniem frameworka Jetbot. Nie zaimplementowałem demonstracji omijania przeszkód, ponieważ uważam, że wybór modelu nie przyniesie dobrych rezultatów omijania przeszkód.

Dodaj mnie na LinkedId, jeśli masz jakieś pytania i zasubskrybuj mój kanał YouTube, aby otrzymywać powiadomienia o ciekawszych projektach dotyczących uczenia maszynowego i robotyki.

Zalecana: