Spisu treści:

Pojazd autonomiczny: 7 kroków (ze zdjęciami)
Pojazd autonomiczny: 7 kroków (ze zdjęciami)

Wideo: Pojazd autonomiczny: 7 kroków (ze zdjęciami)

Wideo: Pojazd autonomiczny: 7 kroków (ze zdjęciami)
Wideo: Dacia Jogger - najtańszy nowy 7-osobowy samochód rodzinny (PL) - test i jazda próbna 2024, Listopad
Anonim
Pojazd autonomiczny
Pojazd autonomiczny
Pojazd autonomiczny
Pojazd autonomiczny

Ten projekt to autonomicznie poruszający się robot, który stara się osiągnąć swoją pozycję docelową, omijając przeszkody na swojej drodze. Robot będzie wyposażony w czujnik LiDAR, który posłuży do wykrywania obiektów w jego otoczeniu. Po wykryciu obiektów i poruszaniu się robota mapa w czasie rzeczywistym zostanie zaktualizowana. Mapa posłuży do zapisania lokalizacji zidentyfikowanych przeszkód. W ten sposób robot nie powtórzy nieudanej drogi do pozycji docelowej. Zamiast tego będzie próbować ścieżek, które albo nie mają przeszkód, albo ścieżek, które nie zostały jeszcze sprawdzone pod kątem przeszkód.

Robot będzie poruszał się za pomocą dwóch kół napędzanych silnikiem prądu stałego oraz dwóch kółek samonastawnych. Silniki zostaną przymocowane do dolnej części okrągłej platformy. Silniki będą sterowane przez dwóch kierowców silników. Sterowniki silników otrzymają polecenia PWM z procesora Zynq. Enkodery na każdym silniku służą do śledzenia pozycji i orientacji pojazdów. Cały system będzie zasilany baterią LiPo.

Krok 1: Montaż pojazdu

Montaż pojazdu
Montaż pojazdu
Montaż pojazdu
Montaż pojazdu
Montaż pojazdu
Montaż pojazdu
Montaż pojazdu
Montaż pojazdu

Robot napędzany jest dwoma silnikami przymocowanymi do bocznych kół, a następnie dodatkowo wspierany przez dwa kółka samonastawne, jedno z przodu i jedno z tyłu. Platforma i mocowania silnika zostały wykonane z blachy aluminiowej. Zakupiono piastę silnika do mocowania kół do silnika. Jednak konieczne było wykonanie niestandardowego łącznika pośredniego, ponieważ układ otworów w piaście był inny niż układ otworów w kole.

Wybranym silnikiem był silnik Port Escap 12 V DC z wbudowanymi enkoderami. Ten silnik można kupić w serwisie eBay za bardzo rozsądną cenę (patrz zestawienie materiałów). Wyszukaj słowa kluczowe „12V Escap 16 Bezrdzeniowy silnik z przekładnią na prąd stały z enkoderami” w serwisie eBay, aby znaleźć silnik. Zwykle jest spora liczba sprzedawców do wyboru. Specyfikacje i pinouty silników są pokazane na poniższych schematach.

Montaż robota rozpoczął się od modelu CADprojekt podwozia. Poniższy model przedstawia widok z góry profilu kształtu 2D zaprojektowanego dla podwozia.

Sugeruje się, aby obudowa została zaprojektowana jako profil 2D, aby można ją było łatwo wyprodukować. Wycinamy arkusz aluminium o wymiarach 12”X12” na kształt podwozia za pomocą przecinaka strumieniem wody. Platformę podwozia można było również ciąć piłą taśmową.

Krok 2: Montaż silników

Montaż silników
Montaż silników
Montaż silników
Montaż silników

Następnym krokiem jest wykonanie mocowań silnika. Sugeruje się, aby mocowania silnika były wykonane z 90-stopniowej blachy aluminiowej. Za pomocą tej części silnik można przymocować wspornikiem do jednej powierzchni blachy za pomocą dwóch

Otwory M2 silnika i drugiej powierzchni można przykręcić do platformy. W uchwycie silnika należy wywiercić otwory, aby można było użyć śrub do zamocowania silnika na uchwycie silnika i mocowania silnika do platformy. Mocowanie silnika widać na powyższym rysunku.

Następnie piasta silnika Pololu (patrz wykaz materiałów) jest umieszczana na wale silnika i dokręcana za pomocą dostarczonej śruby ustalającej i klucza imbusowego. Układ otworów w piaście silnika Pololu nie pasuje do układu otworów w kole VEX, dlatego należy wykonać niestandardowe sprzęgło pośrednie. Sugeruje się wykorzystanie złomu aluminiowego, z którego wykonano platformę podwozia, do wykonania łącznika. Układ otworów i wymiary tej pary pokazano na poniższym rysunku. Zewnętrzna średnica i kształt (nie musi być kołem) niestandardowego aluminiowego łącznika nie ma znaczenia, o ile wszystkie otwory pasują do części.

Krok 3: Tworzenie projektu bloku Vivado

Tworzenie projektu bloku Vivado
Tworzenie projektu bloku Vivado
Tworzenie projektu bloku Vivado
Tworzenie projektu bloku Vivado

- Zacznij od stworzenia nowego projektu Vivado i wybierz Zybo Zynq 7000 Z010 jako urządzenie docelowe.

- Następnie kliknij Utwórz nowy projekt bloku i dodaj adres IP Zynq. Kliknij dwukrotnie adres IP Zynq i zaimportuj dostarczone ustawienia XPS dla Zynq. Następnie włącz UART0 z MIO 10..11 w zakładce MIO configurations, a także upewnij się, że Timer 0 i Watchdog są włączone.

- Dodaj dwa AXI GPIOS do projektu bloku. Dla GPIO 0 włącz podwójny kanał i ustaw oba na wszystkie wyjścia. Ustaw szerokość GPIO dla kanału 1 do 4 bitów, a dla kanału 2 do 12 bitów, kanały te będą używane do ustawiania kierunku silnika i wysyłania liczby taktów, jaką mierzy enkoder do procesora. Dla GPIO 1 ustaw tylko jeden kanał na wszystkie wejścia o szerokości kanału 4 bity. Będzie on używany do odbierania danych z koderów. Uczyń wszystkie porty GPIO zewnętrznymi.

- Dalej Dodaj dwa Timery AXI. Ustaw porty pwm0 na obu zegarach jako zewnętrzne. Będą to pwm, które kontrolują prędkość, z jaką obracają się silniki.

- Na koniec uruchom automatyzację bloku i automatyzację połączeń. Sprawdź, czy projekt bloku, który posiadasz, jest zgodny z dostarczonym.

Krok 4: Komunikacja z LiDAR

Ten LiDAR wykorzystuje protokół SCIP 2.0 do komunikacji przez UART, załączony plik opisuje cały protokół.

Do komunikacji z LiDARem będziemy używać UART0. LiDAR zwraca 682 punkty danych, z których każdy reprezentuje odległość do obiektu pod tym kątem. LiDAR skanuje w kierunku przeciwnym do ruchu wskazówek zegara od -30 stopni do 210 stopni z krokiem 0,351 stopnia.

- Cała komunikacja z LiDARem odbywa się za pomocą znaków ASCI, patrz protokół SCIP dla używanego formatu. Zaczynamy od wysłania polecenia QT, aby włączyć LiDAR. Następnie kilkakrotnie wysyłamy polecenie GS, żądając jednocześnie 18 punktów danych, aby wstawić 64 bajtowe FIFO UARTS. Dane zwrócone z LiDAR są następnie analizowane i przechowywane w globalnej tablicy SCANdata.

- Każdy zapisany punkt danych to 2 bajty zakodowanych danych. Przekazanie tych danych do dekodera zwróci odległość w milimetrach.

W pliku main_av.c znajdziesz następujące funkcje do komunikacji z LiDARem

sendLIDARcmd(polecenie)

- Spowoduje to wysłanie ciągu wejściowego do LiDAR przez UART0

recvLIDARdane()

- Spowoduje odebranie danych po wysłaniu polecenia do LiDAR i zapisanie danych w RECBuffer

requestDistanceData()

- Ta funkcja wyśle serię poleceń, aby pobrać wszystkie 682 punkty danych. Po odebraniu każdego zestawu 18 punktów danych wywoływana jest funkcja parseLIDARinput() w celu przeanalizowania danych i przyrostowego przechowywania punktów danych w SCANdata.

Krok 5: Zapełnianie siatki przeszkodami

Zapełnianie siatki przeszkodami
Zapełnianie siatki przeszkodami
Zapełnianie siatki przeszkodami
Zapełnianie siatki przeszkodami

Przechowywana GRID jest tablicą 2D, w której każda wartość indeksu reprezentuje lokalizację. Dane przechowywane w każdym indeksie to odpowiednio 0 lub 1, brak przeszkód i przeszkoda. Odległość kwadratową w milimetrach, którą reprezentuje każdy indeks, można zmienić za pomocą definicji GRID_SCALE w pliku vehicle.h. Rozmiar tablicy 2D można również zmieniać, aby umożliwić pojazdowi skanowanie większego obszaru poprzez modyfikację definicji GRID_SIZE.

Po zeskanowaniu nowego zestawu danych o odległości z LiDAR wywoływana jest funkcja updateGrid(). Spowoduje to iterację przez każdy punkt danych przechowywany w tablicy SCANdata w celu określenia, które indeksy w siatce mają przeszkody. Korzystając z aktualnej orientacji pojazdu możemy określić kąt, który odpowiada każdemu punktowi danych. Aby określić, gdzie znajduje się przeszkoda, wystarczy pomnożyć odpowiednią odległość przez cos/sin kąta. Dodanie tych dwóch wartości do aktualnej pozycji pojazdów x i y zwróci indeks w siatce przeszkody. Dzielenie odległości zwróconej przez tę operację przez GRID_SCALE pozwoli nam zróżnicować wielkość kwadratu odległości każdego indeksu.

Powyższe zdjęcia pokazują aktualne środowisko pojazdów i powstałą siatkę.

Krok 6: Komunikacja z silnikami

Aby komunikować się z silnikami, zaczynamy od zainicjowania GPIO do sterowania kierunkiem, w którym silnik się obraca. Następnie zapisanie bezpośrednio do adresu bazowego PWM w AXI Timer pozwala nam ustawić takie rzeczy, jak okres i cykl pracy, które bezpośrednio kontrolują prędkość, z jaką obraca się silnik.

Krok 7: Planowanie ścieżki

Do wdrożenia w najbliższej przyszłości.

Wykorzystując opisaną wcześniej funkcjonalność sieci i silnika, bardzo łatwo jest zaimplementować algorytmy takie jak A*. Gdy pojazd się porusza, będzie nadal skanował okolicę i określał, czy ścieżka, na której się porusza, jest nadal ważna

Zalecana: