Spisu treści:

Rpibot - O nauce robotyki: 9 kroków
Rpibot - O nauce robotyki: 9 kroków

Wideo: Rpibot - O nauce robotyki: 9 kroków

Wideo: Rpibot - O nauce robotyki: 9 kroków
Wideo: AUTOMATYKA ROBOTYKA CNC - 200zł/h pracy?! | DO ROBOTY 2024, Lipiec
Anonim
Rpibot - O nauce robotyki
Rpibot - O nauce robotyki

Jestem inżynierem oprogramowania wbudowanego w niemieckiej firmie motoryzacyjnej. Zacząłem ten projekt jako platforma edukacyjna dla systemów wbudowanych. Projekt został wcześniej odwołany, ale tak bardzo mi się podobał, że kontynuowałem w wolnym czasie. To jest wynik…

Miałem następujące wymagania:

  • Prosty sprzęt (koncentracja na oprogramowaniu)
  • Tani sprzęt (około 100 €)
  • Możliwość rozbudowy (niektóre opcje są już częścią opisu)
  • Napięcie zasilania wszystkich komponentów z jednego źródła 5V (powerbank)

Tak naprawdę nie było celu poza nauką. Platforma może być używana do nauki, obserwacji, konkursów robotycznych, …

To nie jest samouczek dla początkujących. Potrzebujesz podstawowej wiedzy na temat:

  • Programowanie (Python)
  • Elektronika podstawowa (do łączenia modułów odpowiednim napięciem)
  • Podstawowa teoria sterowania (PID)

W końcu prawdopodobnie będziesz miał problemy, tak jak ja. Z pewną ciekawością i wytrwałością przejdziesz przez projekt i rozwiążesz wyzwania. Mój kod jest tak prosty, jak to tylko możliwe, a krytyczne wiersze kodu są skomentowane, aby dać wskazówki.

Pełny kod źródłowy i pliki są dostępne tutaj:

Kieszonkowe dzieci:

Mechanika

  • 1x płyta ze sklejki (format A4, grubość 4 mm)
  • 3x M4 x 80 Śruba i nakrętka
  • 2x Motoreduktory z wtórnym wałem wyjściowym dla enkodera. Koła.
  • 1x Wolne koło

1x mocowanie kamery obrotowo-uchylnej (opcjonalnie)

Elektronika

  • 1x Raspberry Pi Zero z nagłówkiem i kamerą
  • 1x sterowanie serwo PCA 9685
  • 2x Optyczne koło i obwód enkodera
  • 1x żeńskie przewody połączeniowe;
  • 1x powerbank USB
  • 1x DRV8833 podwójny sterownik silnika
  • 2x Micro serwa SG90 do obrotu i pochylenia kamery (opcjonalnie)
  • 1x MPU9250 IMU (opcjonalnie)
  • 1x ultradźwiękowy czujnik odległości HC-SR04 (opcjonalnie)
  • 1x płyta perforowana i drut lutowniczy, nagłówki, …

Krok 1: Zbuduj podwozie

Zbuduj podwozie
Zbuduj podwozie
Zbuduj podwozie
Zbuduj podwozie
Zbuduj podwozie
Zbuduj podwozie

Nie jestem dobrym mechanikiem. Również celem projektu nie jest spędzanie zbyt dużo czasu w podwoziu. W każdym razie zdefiniowałem następujące wymagania:

  • Tanie materiały
  • Szybki montaż i demontaż
  • Możliwość rozbudowy (np. miejsce na dodane czujniki)
  • Lekkie materiały oszczędzające energię dla elektroniki

Proste i tanie podwozie można wykonać ze sklejki. Można go łatwo obrabiać wyrzynarką i wiertarką ręczną. Możesz skleić małe drewniane elementy, aby stworzyć uchwyty na czujniki i silniki.

Pomyśl o wymianie uszkodzonych komponentów lub debugowaniu elektrycznym. Główne części powinny być przymocowane śrubami, aby można je było wymienić. Pistolet do klejenia na gorąco może być prosty, ale prawdopodobnie nie jest najlepszym sposobem na zbudowanie podwozia… Potrzebowałem dużo czasu, aby wymyślić prostą koncepcję łatwego demontażu części. Druk 3D jest dobrą alternatywą, ale może być dość kosztowny lub czasochłonny.

Wolne koło jest wreszcie bardzo lekkie i łatwe w montażu. Wszystkie alternatywy były ciężkie lub pełne tarcia (próbowałem kilku z nich, zanim znalazłem ostatnią). Musiałem tylko wyciąć drewnianą podkładkę, aby wypoziomować koło bez ogona po zamontowaniu głównych kół.

Właściwości koła (do obliczeń programowych)

Obwód: 21,5 cmImpulsy: 20 impulsów/obr. Rozdzielczość: 1,075 cm (ostatecznie 1 impuls to ok. 1cm, co jest łatwe do obliczeń programowych)

Krok 2: Elektronika i okablowanie

Elektronika i okablowanie
Elektronika i okablowanie
Elektronika i okablowanie
Elektronika i okablowanie
Elektronika i okablowanie
Elektronika i okablowanie

Projekt wykorzystuje różne moduły, jak pokazano na schemacie.

Kontrolerem głównym jest Raspberry Pi Zero. Odczytuje czujniki i steruje silnikami za pomocą sygnału PWM. Jest podłączony do zdalnego komputera przez Wi-Fi.

DRV8833 to dwusilnikowy mostek H. Dostarcza wystarczającą ilość prądu do silników (czego Raspberry Pi nie może zrobić, ponieważ wyjścia mogą dostarczać tylko trochę mA).

Enkoder optyczny dostarcza sygnał w kształcie kwadratu za każdym razem, gdy światło przechodzi przez koła enkodera. Użyjemy przerwań sprzętowych Raspberry Pi, aby uzyskać informacje za każdym razem, gdy sygnał się przełącza.

pca9695 to płyta sterowania serwo. Komunikuje się za pomocą magistrali szeregowej I2C. Ta płytka dostarcza sygnały PWM i napięcie zasilania, które kontrolują serwomechanizmy dla obrotu i pochylenia krzywki.

MPU9265 to 3-osiowe przyspieszenie, 3-osiowa prędkość obrotowa kątowa i 3-osiowy czujnik strumienia magnetycznego. Wykorzystamy go głównie do uzyskania kursu kompasu.

Poszczególne moduły są połączone ze sobą przewodem połączeniowym. Płytka stykowa pełni rolę dyspozytora i dostarcza napięcia zasilania (5V i 3,3V) oraz masy. Wszystkie połączenia są opisane w tabeli połączeń (patrz załącznik). Podłączenie 5V do wejścia 3,3V prawdopodobnie zniszczy twój chip. Zachowaj ostrożność i dwukrotnie sprawdź całe okablowanie przed zasilaniem (tutaj szczególnie należy wziąć pod uwagę enkoder). Należy zmierzyć multimetrem główne napięcia zasilania na tablicy dyspozytorskiej przed podłączeniem wszystkich tablic. Moduły zostały przymocowane nylonowymi śrubami do obudowy. Również tutaj byłem szczęśliwy, że mogłem je naprawić, ale także usunąć w przypadku awarii.

Jedynym lutowaniem były w końcu silniki oraz płytka stykowa i nagłówki. Szczerze mówiąc, podobają mi się zworki, ale mogą prowadzić do luźnego połączenia. W niektórych sytuacjach niektóre programy monitorujące mogą pomóc w analizie połączeń.

Krok 3: Infrastruktura oprogramowania

Infrastruktura oprogramowania
Infrastruktura oprogramowania
Infrastruktura oprogramowania
Infrastruktura oprogramowania

Po zdobyciu mechaniki skonfigurujemy infrastrukturę programową, aby zapewnić komfortowe warunki rozwoju.

Gita

Jest to darmowy i otwarty system kontroli wersji. Jest używany do zarządzania dużymi projektami jako Linux, ale może być również łatwo używany do małych projektów (zobacz Github i Bitbucket).

Zmiany w projekcie można śledzić lokalnie, a także przesyłać na zdalny serwer, aby udostępniać oprogramowanie społeczności.

Główne używane polecenia to:

git clone https://github.com/makerobotics/RPIbot.git [Pobierz kod źródłowy i konfigurację git]

git pull origin master [pobierz najnowsze dane ze zdalnego repozytorium]

git status [pobierz status lokalnego repozytorium. Czy są jakieś zmienione pliki?] git log [pobierz listę zatwierdzeń] git add. [dodaj wszystkie zmienione pliki do etapu, które będą brane pod uwagę przy następnym zatwierdzeniu] git commit -m "komentarz do zatwierdzenia" [zatwierdź zmiany w lokalnym repozytorium]git push origin master [prześlij wszystkie zatwierdzenia do zdalnego repozytorium]

Logowanie

Python udostępnia kilka wbudowanych funkcji rejestrowania. Struktura oprogramowania powinna już definiować wszystkie ramy rejestrowania przed rozpoczęciem dalszego rozwoju.

Rejestrator można skonfigurować tak, aby logował się w określonym formacie w terminalu lub w pliku dziennika. W naszym przykładzie rejestrator jest konfigurowany przez klasę webserver, ale moglibyśmy też zrobić to samodzielnie. Tutaj ustawiamy tylko poziom rejestrowania na DEBUG:

rejestrator = rejestrowanie.getLogger(_nazwa_)

logger.setLevel(logowanie. DEBUG)

Pomiar i kreślenie

Aby analizować sygnały w czasie, najlepiej jest wykreślić je na wykresie. Ponieważ Raspberry Pi ma tylko terminal konsoli, prześledzimy dane w pliku csv oddzielonym średnikami i wykreślimy je ze zdalnego komputera.

Plik śledzenia oddzielony średnikami jest generowany przez nasz główny kod Pythona i musi mieć takie nagłówki:

znacznik czasu;odchylenieCorr;enkoderR;I_L;odoDistance;ax;enkoderL;I_R;odchylenie;eSpeedR;eSpeedL;pwmL;prędkośćL;CycleTimeControl;wz;pwmR;prędkośćR;Iyaw;hdg;m_y;m_x;eYaw;cycleTimeSense;

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Pierwsza kolumna zawiera sygnaturę czasową. Poniższe kolumny są bezpłatne. Skrypt kreślenia jest wywoływany z listą kolumn do wykreślenia:

remote@pc:~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Skrypt fabularny jest dostępny w folderze narzędzi:

Ploter używa mathplotlib w Pythonie. Musisz go skopiować na swój komputer.

Dla większej wygody skrypt Pythona jest wywoływany przez skrypt bash (plot.sh), który służy do kopiowania pliku śledzenia Raspberry Pi na zdalny komputer i wywoływania plotera z wyborem sygnału. Skrypt bash „plot.sh” pyta jeśli plik ma zostać skopiowany. Było to dla mnie wygodniejsze niż ręczne kopiowanie za każdym razem. "sshpass" służy do kopiowania pliku z Raspberry Pi na zdalny komputer przez scp. Jest w stanie skopiować plik bez pytania o hasło (przekazuje je jako parametr).

W końcu otwiera się okno z fabułą, jak pokazano na obrazku.

Zdalna komunikacja

Interfejs programistyczny do Raspberry Pi to SSH. Pliki mogą być edytowane bezpośrednio w miejscu docelowym lub kopiowane przez scp.

Aby sterować robotem, na Pi działa serwer sieciowy, który zapewnia kontrolę za pośrednictwem gniazd sieciowych. Ten interfejs jest opisany w następnym kroku.

Skonfiguruj Raspberry Pi

W folderze "doc" kodu źródłowego znajduje się plik opisujący konfigurację Raspberry Pi (setup_rpi.txt). Nie ma wielu wyjaśnień, ale wiele przydatnych poleceń i linków.

Krok 4: Interfejs użytkownika

Interfejs użytkownika
Interfejs użytkownika

Używamy lekkiego serwera internetowego Tornado do hostowania interfejsu użytkownika. Jest to moduł Pythona, który nazywamy, gdy uruchamiamy oprogramowanie sterujące robotem.

Architektura oprogramowania

Interfejs użytkownika składa się z następujących plików: gui.html [Opis elementów sterujących i układu strony internetowej] gui.js [Zawiera kod javascript do obsługi elementów sterujących i otwierania połączenia gniazda sieciowego z naszym robotem] gui.css [Zawiera style kontrolki HTML. Tutaj definiuje się pozycje elementów sterujących]

Komunikacja websocket

Interfejs użytkownika nie jest najfajniejszy, ale wykonuje swoją pracę. Skupiłem się tutaj na technologiach, które były dla mnie nowe, takich jak Websockets.

Strona internetowa komunikuje się z serwerem robota za pomocą Websockets. Jest to dwukierunkowy kanał komunikacyjny, który pozostanie otwarty po zainicjowaniu połączenia. Wysyłamy polecenia robota przez Websocket do Raspberry Pi i otrzymujemy informacje (prędkość, pozycja, strumień kamery) z powrotem do wyświetlenia.

Układ interfejsu

Interfejs użytkownika umożliwia ręczne wprowadzanie poleceń. To było używane na początku do wysyłania poleceń do robota. Pole wyboru włącza i wyłącza strumień kamery. Dwa suwaki kontrolują obrót i pochylenie kamery. Prawa górna część interfejsu użytkownika steruje ruchem robota. Możesz kontrolować prędkość i odległość celu. Podstawowe informacje telemetryczne są wyświetlane na rysunku robota.

Krok 5: Programowanie platformy robota

Programowanie platformy robota
Programowanie platformy robota
Programowanie platformy robota
Programowanie platformy robota
Programowanie platformy robota
Programowanie platformy robota

Ta część była głównym celem projektu. Zrefaktorowałem wiele oprogramowania, wprowadzając nowe podwozie z silnikami prądu stałego. Używałem Pythona jako języka programowania z różnych powodów:

  • Jest to główny język Raspberry Pi
  • Jest to język wysokiego poziomu z wieloma wbudowanymi funkcjami i rozszerzeniami
  • Jest zorientowany obiektowo, ale może być również używany do programowania sekwencyjnego
  • Nie jest wymagana kompilacja ani łańcuch narzędzi. Edytuj kod i uruchom go.

Główna architektura oprogramowania

Oprogramowanie jest zorientowane obiektowo, podzielone na kilka obiektów. Mój pomysł polegał na podzieleniu kodu na 3 bloki funkcjonalne:

Zmysł Myśl Aktywuj

Sense.py

Akwizycja i przetwarzanie głównych czujników. Dane są przechowywane w słowniku do wykorzystania w kolejnym etapie.

Control.py

Podklasa uruchamiania steruje silnikami i serwomechanizmami po pewnej abstrakcji. Główny obiekt Control obsługuje polecenia wysokiego poziomu, a także algorytmy sterowania (PID) dla silnika.

rpibot.py

Ten główny obiekt to zarządzanie serwerem sieciowym Tornado oraz tworzenie instancji klasy sensu i kontroli w osobnych wątkach.

Każdy moduł można uruchomić samodzielnie lub jako część całego projektu. Możesz tylko wykryć i wydrukować informacje z czujnika, aby sprawdzić, czy czujniki są prawidłowo podłączone i dostarczają właściwe informacje.

Regulacja PID

Pierwsze zadanie to dowiedzieć się, co chcemy kontrolować. Zacząłem od kontrolowania pozycji, co było bardzo złożone i niewiele pomagało.

Na koniec chcemy kontrolować prędkość każdego koła, a także kierunek robota. W tym celu musimy kaskadować dwie logiki sterujące.

Aby krok po kroku zwiększać złożoność, robotem należy sterować:

otwarta pętla (o stałej mocy)

pwm = K

następnie dodaj algorytm zamkniętej pętli

pwm = Kp.speedError+Ki. Integration(speedError)

i na koniec dodaj kontrolę kierunku jako ostatni krok.

Do regulacji prędkości użyłem sterowania „PI”, a „P” tylko do odchylenia. Parametry ustawiam ręcznie, eksperymentując. Prawdopodobnie można by tu zastosować znacznie lepsze parametry. Mój cel był po prostu linią prostą i prawie go dostałem. Stworzyłem interfejs w oprogramowaniu do zapisywania niektórych zmiennych przez interfejs użytkownika. Ustawienie parametru Kp na 1.0 wymaga następującego polecenia w interfejsie użytkownika:

ZESTAW;Kp;1,0

Mogłem ustawić parametr P na tyle nisko, aby uniknąć przekroczenia. Pozostały błąd jest korygowany parametrem I (błąd zintegrowany)

Trudno mi było dowiedzieć się, jak połączyć kaskadowo obie kontrolki. Rozwiązanie jest proste, ale wcześniej próbowałem wielu innych sposobów… W końcu zmieniłem docelową prędkość kół, aby skręcały się w jednym lub drugim kierunku. Bezpośrednia zmiana wyjścia kontroli prędkości była błędem, ponieważ kontrola prędkości próbowała usunąć to zaburzenie.

Zastosowany schemat sterowania jest załączony. Pokazuje tylko lewą stronę sterowania robota.

Krok 6: Kalibracje czujnika

Kalibracje czujnika
Kalibracje czujnika
Kalibracje czujników
Kalibracje czujników
Kalibracje czujnika
Kalibracje czujnika

Pierwszą rzeczą do rozważenia jest to, że cały IMU musi działać poprawnie. Zamówiłem 3 części i odesłałem je z powrotem, dopóki nie będę miał w pełni sprawnego czujnika. W każdym poprzednim czujniku niektóre części czujnika nie działały poprawnie lub wcale. Wykorzystałem kilka przykładowych skryptów, aby przetestować podstawy przed zamontowaniem go w robocie.

Sygnały czujnika IMU muszą zostać skalibrowane przed użyciem. Niektóre sygnały czujników zależą od kąta montażu i pozycji.

Kalibracje przyspieszenia i prędkości obrotowej

Najłatwiejsza kalibracja dotyczy przyspieszenia wzdłużnego (A_x). Na postoju powinno być około 0 m/s². Jeśli odpowiednio obrócisz czujnik, możesz zmierzyć grawitację (około 9, 8 m/s²). Aby skalibrować a_x, wystarczy go odpowiednio zamontować, a następnie zdefiniować przesunięcie, aby uzyskać 0 m/s² podczas postoju. Teraz A_x jest skalibrowany. W podobny sposób można uzyskać przesunięcia dla prędkości obrotowych podczas postoju.

Kalibracja magnetometru dla kompasu

W przypadku czujników pola magnetycznego konieczna jest bardziej złożona kalibracja. Użyjemy m_x i m_y, aby uzyskać pole magnetyczne w poziomie. Posiadanie m_x i m_y da nam możliwość obliczenia kierunku kompasu.

Dla naszego prostego celu kalibrujemy tylko odchylenie twardego żelaza. Należy to wykonać, ponieważ czujnik znajduje się w końcowej pozycji, ponieważ zależy to od zaburzeń pola magnetycznego.

Rejestrujemy m_x i m_y podczas obracania robota wokół osi z. Wykreślamy m_x vs m_y na wykresie XY. Wynik w postaci wielokropka, jak pokazano na rysunku. Wielokropek musi być wyśrodkowany względem początku. Tutaj rozważamy maksymalne i minimalne wartości m_x i m_y, aby uzyskać przesunięcia w obu kierunkach. Na koniec sprawdzamy kalibrację i widzimy, że wielokropek jest teraz wyśrodkowany.

Kalibracja miękkiego żelaza oznaczałaby, że zmieniamy obraz z elipsy w okrąg. Można to zrobić, dodając współczynnik do każdej wartości czujnika.

Procedurę testową można teraz zakodować w celu ponownej kalibracji lub przynajmniej sprawdzenia, czy czujniki są nadal skalibrowane.

Kurs kompasu

Dane z magnetometru będą teraz używane do obliczania kierunku kompasu. W tym celu musimy przekonwertować sygnały m_x i m_y na kąt. Python bezpośrednio dostarcza funkcję math.atan2, która ma ten cel. Pełne obliczenie jest zdefiniowane w pliku mpu9250_i2c.py ("calcHeading(mx, my, mz)").

Krok 7: Alternatywne projekty

Alternatywne projekty
Alternatywne projekty
Alternatywne projekty
Alternatywne projekty
Alternatywne projekty
Alternatywne projekty

Projekt zajął dużo czasu, ponieważ projekt był całkowicie otwarty. Dla każdego komponentu wykonałem prototypową implementację i doświadczyłem ograniczeń systemu.

Najbardziej złożonym tematem był enkoder koła. Przetestowałem 3 różne opcje przed znalezieniem aktualnie używanego kodera optycznego. Myślę, że porzucone rozwiązania są również bardzo interesujące w takim projekcie. Dotyczy to części, w których nauczyłem się najwięcej.

Serwo ciągłego obrotu podłączone do pca 9695

Aby uniknąć dodatkowego mostka H dla silnika prądu stałego, najpierw zacząłem od serwomechanizmów o ciągłym obrocie. Były one napędzane przez obecny serwowzmacniacz pca 9695. Cała mechanika napędu i odpowiadająca mu elektronika były znacznie prostsze. Ten projekt miał dwie wady:

  • Słaby zakres sterowania serw.
  • Brakujące miejsce trzymania enkodera

Serwa zaczynają się poruszać z 50% pwm i mają pełną prędkość około 55%. To bardzo słaby zakres kontroli.

Bez trzymania enkodera znalezienie gotowego enkodera było bardzo trudne. Przetestowałem 3 różne enkodery odbicia, które zostały zamontowane na podwoziu. Na zewnątrz koła okleiłem samoprzylepne koło enkoderowe z czarno-białymi sekcjami. Użyłem czujników QTR-1RC, które wymagają intensywnego przetwarzania sygnału, aby uzyskać właściwy sygnał. Raspberry Pi nie było w stanie wykonać tego rodzaju przetwarzania w czasie rzeczywistym. Postanowiłem więc dodać do robota NodeMCU D1 mini jako kontroler czasu rzeczywistego. Został podłączony do Raspberry Pi przez szeregowy UART w celu dostarczenia przetworzonych danych z czujnika. NodeMCU zarządzało również czujnikiem HC-SR04. Mechanika była trudna i niezbyt solidna, linia szeregowa otrzymywała hałas z linii I2C i silników, więc w końcu zbudowałem drugą wersję podwozia z prostymi silnikami zębatymi DC napędzanymi przez mostek H. Silniki te mają dodatkowy wał wyjściowy do umieszczenia enkodera optycznego.

Krok 8: Przetwarzanie obrazu

Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu
Przetwarzanie obrazu

Aby usprawnić autonomiczną jazdę, możemy wykonać pewne przetwarzanie obrazu.

Biblioteka opencv jest odniesieniem do tego. Może być używany przez Pythona do szybkiego wdrożenia wykrywania przeszkód.

Przechwytujemy obraz i stosujemy niektóre zadania przetwarzania obrazu:

Pierwsze testy przeprowadzono z transformacjami Canny'ego i Sobela. Canny może być dobrym kandydatem, ale nie jest wystarczająco rozsądny. Sobel jest zbyt rozsądny (wykryto za dużo obiektów).

W końcu stworzyłem własny filtr, aby wymieszać wszystkie gradienty poziome i pionowe (wykrywanie mebli):

  • Przekształć kolorowy obraz w obraz o poziomie szarości
  • Rozmyj obraz, aby usunąć niewielki szum
  • Próg obrazu do obrazu czarno-białego
  • Teraz wykrywamy gradienty poziome i pionowe, aby wykrywać obiekty takie jak ściany i meble
  • Filtrujemy tylko duże pozostałe kontury (patrz kolorowe kontury na zdjęciu)

Teraz możemy wykorzystać te nowe informacje do wykrywania przeszkód…

Krok 9: Kolejne kroki…

Następne kroki…
Następne kroki…
Następne kroki…
Następne kroki…

Teraz mamy prostą platformę robota z czujnikami, siłownikami i kamerą. Moim celem jest poruszanie się autonomicznie i powrót na stację bez dodawania kolejnych czujników. W tym celu będę potrzebować następujących kroków:

  • Połączenie czujników z odchyleniem i magnetycznymi sygnałami kursu
  • Przetwarzanie obrazu z kamery (dostępny jest tylko niski procesor)
  • Wykrywanie kolizji (odległość ultradźwiękowa i kamera)
  • Budowanie mapy lub orientacja

Teraz idź i stwórz własne wyzwania lub cele…

Zalecana: