Inhoudsopgave:

Autonoom voertuig: 7 stappen (met afbeeldingen)
Autonoom voertuig: 7 stappen (met afbeeldingen)

Video: Autonoom voertuig: 7 stappen (met afbeeldingen)

Video: Autonoom voertuig: 7 stappen (met afbeeldingen)
Video: Autonoom voertuig voor gewasbescherming in kas 2024, November
Anonim
Autonoom voertuig
Autonoom voertuig
Autonoom voertuig
Autonoom voertuig

Dit project is een autonoom navigerende robot die probeert zijn doelpositie te bereiken terwijl hij onderweg obstakels ontwijkt. De robot zal worden uitgerust met een LiDAR-sensor die wordt gebruikt om objecten in zijn omgeving te detecteren. Als objecten worden gedetecteerd en de robot beweegt, wordt een realtime kaart bijgewerkt. De kaart wordt gebruikt om de locaties van geïdentificeerde obstakels op te slaan. Op deze manier zal de robot een mislukt pad naar de doelpositie niet opnieuw proberen. Het zal in plaats daarvan paden proberen die geen obstakels hebben of paden die nog niet zijn gecontroleerd op obstakels.

De robot zal bewegen door twee DC-motor aangedreven wielen en twee zwenkwielen. De motoren worden aan de onderkant van een cirkelvormig platform bevestigd. De motoren worden aangestuurd door twee motordrivers. De motordrivers ontvangen PWM-commando's van de Zynq-processor. Encoders op elke motor worden allemaal gebruikt om de positie en oriëntatie van het voertuig bij te houden. Het hele systeem wordt gevoed door een LiPo-batterij.

Stap 1: Het voertuig monteren

Het voertuig monteren
Het voertuig monteren
Het voertuig monteren
Het voertuig monteren
Het voertuig monteren
Het voertuig monteren
Het voertuig monteren
Het voertuig monteren

De robot wordt aangedreven door twee motoren die aan de zijwielen zijn bevestigd en wordt vervolgens ondersteund door twee zwenkwielen, één voor en één achter. Het platform en de motorsteunen zijn gemaakt van plaatstaal aluminium. Er werd een motornaaf aangeschaft om de wielen aan de motor te bevestigen. Er moest echter een aangepaste tussenkoppeling worden gemaakt omdat het gatenpatroon van de naaf anders was dan het gatenpatroon van het wiel.

De geselecteerde motor was een Port Escap 12V DC-motor met ingebouwde encoders. Deze motor is op ebay te koop voor een zeer redelijke prijs (zie stuklijst). Zoek trefwoorden "12V Escap 16 Coreless Geared DC Motor with Encoders" op ebay om de motor te vinden. Er zijn meestal een behoorlijk aantal verkopers om uit te kiezen. De specificaties en pin-outs van de motoren worden weergegeven in de onderstaande diagrammen.

De assemblage van de robot begon met een CAD-modelontwerp van het chassis. Het onderstaande model toont het bovenaanzicht van het 2D-vormprofiel dat is ontworpen voor het chassis.

Er wordt voorgesteld om het chassis te ontwerpen als een 2D-profiel, zodat het gemakkelijk kan worden vervaardigd. We snijden een 12 "X12" plaat aluminium in de vorm van het chassis met behulp van een waterstraalsnijder. Het chassisplatform kon ook worden gesneden met een lintzaag.

Stap 2: Motoren monteren

Montagemotoren
Montagemotoren
Montagemotoren
Montagemotoren

De volgende stap is het maken van de motorsteunen. Er wordt gesuggereerd dat de motorsteunen gemaakt zijn van 90-graden plaatstaal aluminium. Met behulp van dit onderdeel kan de motor vrijdragend op één zijde van het plaatwerk worden bevestigd met behulp van de twee

M2 gaten van de motor en het andere vlak kunnen aan het platform worden vastgeschroefd. Er moeten gaten in de motorsteun worden geboord, zodat schroeven kunnen worden gebruikt om de motor op de motorsteun en de motorsteun op het platform te bevestigen. De motorsteun is te zien in de bovenstaande afbeelding.

Vervolgens wordt de Pololu-motornaaf (zie stuklijst) op de motoras geplaatst en vastgedraaid met de meegeleverde stelschroef en inbussleutel. Het gatenpatroon van de Pololu-motornaaf komt niet overeen met het gatenpatroon van het VEX-wiel, dus er moet een aangepaste tussenkoppeling worden gemaakt. Er wordt gesuggereerd dat het schrootplaatmetaal dat wordt gebruikt om het chassisplatform te maken, wordt gebruikt om de koppeling te maken. Het gatenpatroon en de afmetingen van dit koppel is weergegeven in onderstaande figuur. De buitendiameter en vorm (hoeft geen cirkel te zijn) van de aangepaste aluminium koppeling maakt niet uit, zolang alle gaten op het onderdeel passen.

Stap 3: Vivado-blokontwerp maken

Vivado-blokontwerp maken
Vivado-blokontwerp maken
Vivado-blokontwerp maken
Vivado-blokontwerp maken

- Begin met het maken van een nieuw Vivado-project en selecteer de Zybo Zynq 7000 Z010 als het doelapparaat.

- Klik vervolgens op nieuw blokontwerp maken en voeg het Zynq IP-adres toe. Dubbelklik op het Zynq IP-adres en importeer de verstrekte XPS-instellingen voor de Zynq. Schakel vervolgens UART0 in met MIO 10..11 onder het tabblad MIO-configuraties en zorg er ook voor dat Timer 0 en de Watchdog-timer zijn ingeschakeld.

- Voeg twee AXI GPIOS toe aan het blokontwerp. Schakel voor GPIO 0 dual channel in en stel beide in op alle uitgangen. Stel de GPIO-breedte in voor kanaal 1 tot 4 bits en voor kanaal 2 tot 12 bits, deze kanalen worden gebruikt om de motorrichting in te stellen en het aantal tikken dat de encoder meet naar de processor te sturen. Stel voor GPIO 1 slechts één kanaal in op alle ingangen met een kanaalbreedte van 4 bits. Dit wordt gebruikt om gegevens van de encoders te ontvangen. Maak alle GPIO-poorten extern.

- Voeg vervolgens twee AXI Timers toe. Maak de pwm0-poorten op beide timers extern. Dit zijn de pwms die de snelheid regelen waarmee de motoren draaien.

- Voer ten slotte de blokautomatisering en verbindingsautomatisering uit. Controleer of het blokontwerp dat u heeft, overeenkomt met het opgegeven ontwerp.

Stap 4: Communiceren met de LiDAR

Deze LiDAR gebruikt een SCIP 2.0-protocol om te communiceren via UART, het bijgevoegde bestand beschrijft het hele protocol.

Om met de LiDAR te communiceren, gebruiken we UART0. De LiDAR retourneert 682 gegevenspunten die elk de afstand tot een object onder die hoek vertegenwoordigen. De LiDAR scant tegen de klok in van -30 graden tot 210 graden met een stap van 0,351 graden.

- Alle communicatie met de LiDAR gebeurt met ASCI-tekens, raadpleeg het SCIP-protocol voor het gebruikte formaat. We beginnen met het verzenden van het QT-commando om de LiDAR in te schakelen. Vervolgens sturen we het GS-commando verschillende keren met het verzoek om 18 datapunten tegelijk naar de UARTS 64-byte FIFO te plaatsen. De gegevens die door de LiDAR worden geretourneerd, worden vervolgens geparseerd en opgeslagen in de globale SCANdata-array.

- Elk opgeslagen datapunt is 2 bytes aan gecodeerde data. Door deze gegevens in de decoder door te geven, wordt een afstand in millimeters geretourneerd.

In het main_av.c bestand vind je de volgende functies om te communiceren met de LiDAR

sendLIDARcmd(opdracht)

- Dit stuurt de invoerreeks naar de LiDAR via de UART0

recvLIDARdata()

- Deze ontvangt gegevens nadat een opdracht naar de LiDAR is verzonden en slaat de gegevens op in de RECBuffer

requestDistanceData()

- Deze functie stuurt een reeks opdrachten om alle 682 datapunten op te halen. Nadat elke set van 18 gegevenspunten is ontvangen, wordt parseLIDARinput() aangeroepen om de gegevens te ontleden en de gegevenspunten stapsgewijs op te slaan in SCANdata.

Stap 5: Raster vullen met obstakels

Raster vullen met obstakels
Raster vullen met obstakels
Raster vullen met obstakels
Raster vullen met obstakels

Het GRID dat wordt opgeslagen is een 2D-array waarbij elke indexwaarde een locatie vertegenwoordigt. De gegevens die in elke index zijn opgeslagen, zijn respectievelijk een 0 of een 1, Geen obstakel en obstakel. De vierkante afstand in millimeters die elke index vertegenwoordigt, kan worden gewijzigd met de GRID_SCALE-definitie in het voertuig.h-bestand. De grootte van de 2D-array kan ook worden gevarieerd zodat het voertuig een groter gebied kan scannen door de GRID_SIZE-definitie te wijzigen.

Nadat een nieuwe set afstandsgegevens is gescand vanuit de LiDAR wordt updateGrid() aangeroepen. Dit doorloopt elk datapunt dat is opgeslagen in de SCANdata-array om te bepalen welke indexen in het raster obstakels hebben. Met behulp van de huidige oriëntatie van het voertuig kunnen we de hoek bepalen die overeenkomt met elk gegevenspunt. Om te bepalen waar een obstakel is, vermenigvuldigt u eenvoudig de bijbehorende afstand met cos/sin van de hoek. Door deze twee waarden toe te voegen aan de huidige x- en y-positie van het voertuig, wordt de index in het raster van het obstakel geretourneerd. Door de afstand te delen die door deze bewerking wordt geretourneerd door de GRID_SCALE, kunnen we variëren hoe groot de vierkante afstand van elke index is.

De bovenstaande foto's tonen de huidige omgeving van het voertuig en het resulterende raster.

Stap 6: Communiceren met motoren

Om met de motoren te communiceren, beginnen we met het initialiseren van de GPIO's om de richting waarin de motor draait te regelen. Door vervolgens rechtstreeks naar het basisadres van de PWM's in de AXI Timer te schrijven, kunnen we dingen instellen zoals de periode en de Duty-cyclus die direct de snelheid waarmee de motor draait.

Stap 7: Padplanning

In de nabije toekomst te implementeren.

Met behulp van de eerder beschreven raster- en motorfunctionaliteit is het heel eenvoudig om algoritmen zoals A* te implementeren. Terwijl het voertuig beweegt, blijft het de omgeving scannen en bepalen of het pad waarop het zich bevindt nog geldig is

Aanbevolen: