Inhaltsverzeichnis:
- Schritt 1: Zusammenbau des Fahrzeugs
- Schritt 2: Motoren montieren
- Schritt 3: Vivado Block Design erstellen
- Schritt 4: Kommunikation mit dem LiDAR
- Schritt 5: Raster mit Hindernissen füllen
- Schritt 6: Kommunikation mit Motoren
- Schritt 7: Pfadplanung
Video: Autonomes Fahrzeug - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Bei diesem Projekt handelt es sich um einen autonom navigierenden Roboter, der versucht, seine Zielposition zu erreichen und dabei Hindernissen auf seinem Weg auszuweichen. Der Roboter wird mit einem LiDAR-Sensor ausgestattet sein, mit dem Objekte in seiner Umgebung erkannt werden. Wenn Objekte erkannt werden und sich der Roboter bewegt, wird eine Echtzeitkarte aktualisiert. Die Karte wird verwendet, um die Standorte der identifizierten Hindernisse zu speichern. Auf diese Weise wird der Roboter einen fehlgeschlagenen Weg zur Zielposition nicht erneut versuchen. Stattdessen versucht es Wege, die entweder keine Hindernisse haben oder Wege, die noch nicht auf Hindernisse überprüft wurden.
Der Roboter bewegt sich durch zwei Gleichstrommotorräder und zwei Lenkrollen. Die Motoren werden an der Unterseite einer kreisförmigen Plattform befestigt. Die Motoren werden von zwei Motortreibern gesteuert. Die Motortreiber erhalten PWM-Befehle vom Zynq-Prozessor. Encoder an jedem Motor werden alle verwendet, um die Position und Ausrichtung des Fahrzeugs zu verfolgen. Das gesamte System wird mit einem LiPo-Akku betrieben.
Schritt 1: Zusammenbau des Fahrzeugs
Der Roboter wird von zwei Motoren angetrieben, die an den Seitenrädern angebracht sind und wird dann zusätzlich von zwei Lenkrollen, einem vorne und einem hinten, unterstützt. Die Plattform- und Motorhalterungen wurden aus Aluminiumblech gefertigt. Eine Motornabe wurde gekauft, um die Räder am Motor zu befestigen. Es musste jedoch eine kundenspezifische Zwischenkupplung hergestellt werden, da sich das Lochbild der Nabe vom Lochbild des Rades unterscheidet.
Der ausgewählte Motor war ein Port Escap 12V DC-Motor mit eingebauten Encodern. Dieser Motor kann bei ebay zu einem sehr günstigen Preis erworben werden (siehe Stückliste). Suchen Sie nach den Schlüsselwörtern „12V Escap 16 Coreless Geared DC Motor with Encoders“bei ebay, um den Motor zu finden. Normalerweise gibt es eine große Anzahl von Verkäufern, aus denen Sie auswählen können. Die Spezifikationen und Pinbelegungen der Motoren sind in den folgenden Diagrammen dargestellt.
Die Montage des Roboters begann mit einem CAD-Modellentwurf des Chassis. Das folgende Modell zeigt die Draufsicht des 2D-Formprofils, das für das Chassis entworfen wurde.
Es wird vorgeschlagen, das Chassis als 2D-Profil auszubilden, damit es leicht hergestellt werden kann. Wir schneiden ein 12 "X 12" großes Aluminiumblech mit einem Wasserstrahlschneider in die Form des Chassis. Die Chassis-Plattform könnte auch mit einer Bandsäge geschnitten werden.
Schritt 2: Motoren montieren
Der nächste Schritt besteht darin, die Motorhalterungen zu machen. Es wird empfohlen, die Motorhalterungen aus 90-Grad-Blechaluminium herzustellen. Mit diesem Teil kann der Motor auf einer Seite des Blechs mit den beiden freitragend befestigt werden
M2-Bohrungen des Motors und der anderen Seite können mit der Plattform verschraubt werden. In die Motorhalterung müssen Löcher gebohrt werden, damit der Motor an der Motorhalterung und die Motorhalterung an der Plattform mit Schrauben befestigt werden kann. Die Motorhalterung ist in der Abbildung oben zu sehen.
Als nächstes wird die Pololu Motornabe (siehe Stückliste) auf die Motorwelle gesetzt und mit der mitgelieferten Stellschraube und Inbusschlüssel festgezogen. Das Lochbild der Pololu-Motornabe stimmt nicht mit dem Lochbild des VEX-Rads überein, daher muss eine kundenspezifische Zwischenkupplung angefertigt werden. Es wird empfohlen, das für die Chassis-Plattform verwendete Schrottblech Aluminium für die Herstellung der Kupplung zu verwenden. Das Lochmuster und die Abmessungen dieses Paares sind in der folgenden Abbildung dargestellt. Der Außendurchmesser und die Form (muss kein Kreis sein) der kundenspezifischen Aluminiumkupplung spielen keine Rolle, solange alle Löcher auf das Teil passen.
Schritt 3: Vivado Block Design erstellen
- Beginnen Sie mit der Erstellung eines neuen Vivado-Projekts und wählen Sie das Zybo Zynq 7000 Z010 als Zielgerät aus.
- Klicken Sie als nächstes auf Neues Blockdesign erstellen und fügen Sie die Zynq-IP hinzu. Doppelklicken Sie auf die Zynq-IP und importieren Sie die bereitgestellten XPS-Einstellungen für Zynq. Aktivieren Sie dann UART0 mit MIO 10..11 auf der Registerkarte MIO-Konfigurationen und stellen Sie außerdem sicher, dass Timer 0 und der Watchdog-Timer aktiviert sind.
- Fügen Sie dem Blockdesign zwei AXI GPIOS hinzu. Aktivieren Sie für GPIO 0 Dual Channel und stellen Sie beide auf alle Ausgänge ein. Stellen Sie die GPIO-Breite für Kanal 1 auf 4 Bit und für Kanal 2 auf 12 Bit ein. Diese Kanäle werden verwendet, um die Motorrichtung einzustellen und die Anzahl der Ticks, die der Encoder misst, an den Prozessor zu senden. Stellen Sie für GPIO 1 nur einen Kanal auf alle Eingänge mit einer Kanalbreite von 4 Bit ein. Dies wird verwendet, um Daten von den Encodern zu empfangen. Machen Sie alle GPIO-Ports extern.
- Als nächstes Fügen Sie zwei AXI-Timer hinzu. Machen Sie die PWM-Ports auf beiden Timern extern. Dies sind die PWMs, die die Drehzahl der Motoren steuern.
- Führen Sie schließlich die Blockautomatisierung und die Verbindungsautomatisierung aus. Vergewissern Sie sich, dass das von Ihnen verwendete Blockdesign mit dem bereitgestellten übereinstimmt.
Schritt 4: Kommunikation mit dem LiDAR
Dieser LiDAR verwendet ein SCIP 2.0-Protokoll, um über UART zu kommunizieren, die angehängte Datei beschreibt das gesamte Protokoll.
Um mit dem LiDAR zu kommunizieren, verwenden wir UART0. Der LiDAR gibt 682 Datenpunkte zurück, die jeweils die Entfernung zu einem Objekt in diesem Winkel darstellen. Der LiDAR scannt gegen den Uhrzeigersinn von -30 Grad bis 210 Grad mit einem Schritt von 0,351 Grad.
- Die gesamte Kommunikation zum LiDAR erfolgt mit ASCI-Zeichen, das verwendete Format ist dem SCIP-Protokoll zu entnehmen. Wir beginnen mit dem Senden des QT-Befehls, um den LiDAR einzuschalten. Wir senden dann den GS-Befehl mehrmals, um 18 Datenpunkte gleichzeitig an ft im UARTS 64 Byte FIFO anzufordern. Die vom LiDAR zurückgegebenen Daten werden dann geparst und im globalen SCANdata-Array gespeichert.
- Jeder gespeicherte Datenpunkt besteht aus 2 Bytes codierter Daten. Die Übergabe dieser Daten an den Decoder gibt eine Distanz in Millimetern zurück.
In der Datei main_av.c finden Sie folgende Funktionen zur Kommunikation mit dem LiDAR
sendLIDARcmd(Befehl)
- Dadurch wird die Eingabezeichenfolge über den UART0 an den LiDAR gesendet
recvLIDARdata()
- Dieser empfängt Daten, nachdem ein Befehl an den LiDAR gesendet wurde und speichert die Daten im RECBuffer
requestDistanceData()
- Diese Funktion sendet eine Reihe von Befehlen, um alle 682 Datenpunkte abzurufen. Nachdem jeder Satz von 18 Datenpunkten empfangen wurde, wird parseLIDARinput() aufgerufen, um die Daten zu analysieren und die Datenpunkte inkrementell in SCANdata zu speichern.
Schritt 5: Raster mit Hindernissen füllen
Das gespeicherte GRID ist ein 2D-Array, wobei jeder Indexwert einen Standort darstellt. Die in jedem Index gespeicherten Daten sind entweder eine 0 oder eine 1, kein Hindernis bzw. ein Hindernis. Der quadratische Abstand in Millimetern, den jeder Index darstellt, kann mit der GRID_SCALE-Definition in der Datei vehicle.h geändert werden. Die Größe des 2D-Arrays kann auch variiert werden, damit das Fahrzeug einen größeren Bereich scannen kann, indem die GRID_SIZE-Definition modifiziert wird.
Nachdem ein neuer Satz von Entfernungsdaten aus dem LiDAR gescannt wurde, wird updateGrid() aufgerufen. Dadurch wird jeder im SCANdata-Array gespeicherte Datenpunkt durchlaufen, um zu bestimmen, welche Indizes im Raster Hindernisse aufweisen. Anhand der aktuellen Ausrichtung des Fahrzeugs können wir den Winkel bestimmen, der jedem Datenpunkt entspricht. Um festzustellen, wo sich ein Hindernis befindet, multiplizieren Sie einfach die entsprechende Entfernung mit dem cos/sin des Winkels. Das Addieren dieser beiden Werte zur aktuellen x- und y-Position des Fahrzeugs gibt den Index im Gitter des Hindernisses zurück. Wenn wir die von dieser Operation zurückgegebene Distanz durch GRID_SCALE teilen, können wir variieren, wie groß die quadratische Distanz jedes Index ist.
Die obigen Bilder zeigen die aktuelle Umgebung des Fahrzeugs und das resultierende Raster.
Schritt 6: Kommunikation mit Motoren
Um mit den Motoren zu kommunizieren, beginnen wir mit der Initialisierung der GPIOs, um die Richtung zu steuern, in die sich der Motor dreht. Dann können wir direkt in die Basisadresse der PWMs im AXI-Timer schreiben, um Dinge wie die Periode und den Arbeitszyklus einzustellen, die den direkt steuern Geschwindigkeit, mit der der Motor dreht.
Schritt 7: Pfadplanung
Soll in naher Zukunft umgesetzt werden.
Unter Verwendung der zuvor beschriebenen Gitter- und Motorfunktionalität ist es sehr einfach, Algorithmen wie A* zu implementieren. Während sich das Fahrzeug bewegt, scannt es weiterhin die Umgebung und stellt fest, ob der Weg, auf dem es sich befindet, noch gültig ist