Sommario:

Veicolo autonomo: 7 passaggi (con immagini)
Veicolo autonomo: 7 passaggi (con immagini)

Video: Veicolo autonomo: 7 passaggi (con immagini)

Video: Veicolo autonomo: 7 passaggi (con immagini)
Video: FACCIAMO CASINO con 7 SUPERCAR in giro per DUBAI! 🔥🏎️ 2024, Dicembre
Anonim
Veicolo autonomo
Veicolo autonomo
Veicolo autonomo
Veicolo autonomo

Questo progetto è un robot che naviga in modo autonomo che cerca di raggiungere la sua posizione obiettivo evitando gli ostacoli sulla sua strada. Il robot sarà dotato di un sensore LiDAR che verrà utilizzato per rilevare gli oggetti nei dintorni. Man mano che gli oggetti vengono rilevati e il robot si muove, verrà aggiornata una mappa in tempo reale. La mappa verrà utilizzata per salvare le posizioni degli ostacoli che sono stati identificati. In questo modo, il robot non tenterà di nuovo un percorso fallito verso la posizione obiettivo. Tenterà invece percorsi che non hanno ostacoli o percorsi che non sono ancora stati controllati per la presenza di ostacoli.

Il robot si muoverà tramite due ruote motorizzate DC e due ruote piroettanti. I motori saranno fissati al fondo di una piattaforma circolare. I motori saranno controllati da due driver del motore. I driver del motore riceveranno i comandi PWM dal processore Zynq. Tutti gli encoder su ciascun motore possono essere utilizzati per tenere traccia della posizione e dell'orientamento dei veicoli. L'intero sistema sarà alimentato da una batteria LiPo.

Passaggio 1: assemblaggio del veicolo

Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo
Assemblaggio del veicolo

Il robot è alimentato da due motori fissati alle ruote laterali e quindi è inoltre supportato da due ruote piroettanti, una anteriore e una posteriore. La piattaforma e i supporti del motore sono stati realizzati in lamiera di alluminio. È stato acquistato un mozzo del motore per collegare le ruote al motore. Tuttavia, era necessario realizzare un giunto intermedio personalizzato perché lo schema dei fori del mozzo era diverso da quello della ruota.

Il motore selezionato era un motore Port Escap 12V DC con encoder incorporati. Questo motore può essere acquistato su ebay ad un prezzo molto ragionevole (vedi Distinta Materiali). Cerca le parole chiave "12V Escap 16 Motoriduttore CC Coreless con encoder" su ebay per trovare il motore. Di solito c'è una discreta quantità di venditori tra cui scegliere. Le specifiche e i pinout dei motori sono mostrati negli schemi seguenti.

L'assemblaggio del robot è iniziato con un modello CADdesign del telaio. Il modello seguente mostra la vista dall'alto del profilo di forma 2D progettato per il telaio.

Si suggerisce che il telaio sia progettato come un profilo 2D in modo che possa essere facilmente prodotto. Abbiamo tagliato un foglio di alluminio da 12 "X12" nella forma del telaio utilizzando un cutter a getto d'acqua. La piattaforma del telaio potrebbe anche essere tagliata con una sega a nastro.

Passaggio 2: montaggio dei motori

Motori di montaggio
Motori di montaggio
Motori di montaggio
Motori di montaggio

Il prossimo passo è realizzare i supporti del motore. Si suggerisce che i supporti del motore siano realizzati in lamiera di alluminio a 90 gradi. Utilizzando questa parte, il motore può essere fissato a sbalzo su una faccia della lamiera utilizzando i due

I fori M2 del motore e dell'altra faccia possono essere imbullonati alla piattaforma. È necessario praticare dei fori nel supporto del motore in modo che le viti possano essere utilizzate per fissare il motore sul supporto del motore e il supporto del motore sulla piattaforma. Il supporto del motore può essere visto nella figura sopra.

Successivamente il Pololu Motor Hub (vedi Distinta Materiali) viene posizionato sull'albero del motore e serrato con la vite di fermo fornita e la chiave a brugola. Lo schema dei fori del mozzo del motore Pololu non corrisponde allo schema dei fori della ruota VEX, quindi è necessario realizzare un accoppiatore intermedio personalizzato. Si suggerisce di utilizzare la lamiera di scarto in alluminio utilizzata per realizzare la piattaforma del telaio per realizzare l'accoppiatore. Lo schema dei fori e le dimensioni di questa coppia sono mostrati nella figura sottostante. Il diametro esterno e la forma (non è necessario che sia un cerchio) dell'accoppiatore in alluminio personalizzato non contano finché tutti i fori si adattano alla parte.

Passaggio 3: creazione di Vivado Block Design

Creazione di Vivado Block Design
Creazione di Vivado Block Design
Creazione di Vivado Block Design
Creazione di Vivado Block Design

- Inizia creando un nuovo progetto Vivado e seleziona Zybo Zynq 7000 Z010 come dispositivo di destinazione.

- Quindi fai clic su Crea nuovo design del blocco e aggiungi l'IP Zynq. Fare doppio clic sull'IP Zynq e importare le impostazioni XPS fornite per Zynq. Quindi abilita UART0 con MIO 10..11 nella scheda configurazioni MIO e assicurati anche che Timer 0 e Watchdog timer siano abilitati.

- Aggiungi due AXI GPIOS al design del blocco. Per GPIO 0 abilita il doppio canale e imposta entrambi su tutte le uscite. Imposta la larghezza GPIO per i bit del canale da 1 a 4 e per il canale da 2 a 12 bit, questi canali verranno utilizzati per impostare la direzione del motore e inviare la quantità di tick misurati dall'encoder al processore. Per GPIO 1 impostare un solo canale su tutti gli ingressi con una larghezza del canale di 4 bit. Questo verrà utilizzato per ricevere i dati dagli encoder. Rendi tutte le porte GPIO esterne.

- Quindi aggiungi due timer AXI. Rendi esterne le porte pwm0 su entrambi i timer. Questi saranno i pwm che controllano la velocità di rotazione dei motori.

- Infine eseguire l'automazione del blocco e l'automazione della connessione. Verifica che il design del blocco che hai corrisponda a quello fornito.

Passaggio 4: comunicazione con il LiDAR

Questo LiDAR utilizza un protocollo SCIP 2.0 per comunicare tramite UART, il file allegato descrive l'intero protocollo.

Per comunicare con il LiDAR utilizzeremo UART0. Il LiDAR restituisce 682 punti dati, ognuno dei quali rappresenta la distanza da un oggetto a quell'angolo. Il LiDAR esegue la scansione in senso antiorario da -30 gradi a 210 gradi con un passo di 0,351 gradi.

- Tutta la comunicazione al LiDAR avviene con caratteri ASCI, fare riferimento al protocollo SCIP per il formato utilizzato. Iniziamo inviando il comando QT per accendere il LiDAR. Quindi inviamo il comando GS più volte richiedendo 18 punti dati alla volta a ft nella FIFO UARTS a 64 byte. I dati restituiti dal LiDAR vengono quindi analizzati e archiviati nell'array globale SCANdata.

- Ogni punto dati memorizzato è di 2 byte di dati codificati. Il passaggio di questi dati nel decoder restituirà una distanza in millimetri.

Nel file main_av.c troverai le seguenti funzioni per comunicare con il LiDAR

sendLIDARcmd(comando)

- Questo invierà la stringa di input al LiDAR attraverso l'UART0

recvLIDARdata()

- Questo riceverà i dati dopo che un comando è stato inviato al LiDAR e memorizzerà i dati nel RECBuffer

requestDistanceData()

- Questa funzione invierà una serie di comandi per recuperare tutti i 682 punti dati. Dopo che ogni set di 18 punti dati è stato ricevuto, parseLIDARinput() viene chiamato per analizzare i dati e memorizzare in modo incrementale i punti dati in SCANdata.

Passaggio 5: popolamento della griglia con ostacoli

Griglia popolata con ostacoli
Griglia popolata con ostacoli
Griglia popolata con ostacoli
Griglia popolata con ostacoli

Il GRID memorizzato è un array 2D con ogni valore di indice che rappresenta una posizione. I dati memorizzati in ciascun indice sono rispettivamente 0 o 1, Nessun ostacolo e Ostacolo. La distanza quadrata in millimetri rappresentata da ciascun indice può essere modificata con la definizione GRID_SCALE nel file vehicle.h. La dimensione dell'array 2D può anche essere variata per consentire al veicolo di scansionare un'area più ampia modificando la definizione GRID_SIZE.

Dopo che un nuovo set di dati sulla distanza è stato scansionato dal LiDAR, viene chiamato updateGrid(). Questo itererà attraverso ogni punto dati memorizzato nell'array SCANdata per determinare quali indici nella griglia hanno ostacoli. Utilizzando l'orientamento corrente del veicolo possiamo determinare l'angolo che corrisponde a ciascun punto dati. Per determinare dove si trova un ostacolo basta moltiplicare la distanza corrispondente per cos/sin dell'angolo. Sommando questi due valori alla posizione xey attuale del veicolo si restituirà l'indice nella griglia dell'ostacolo. Dividendo la distanza restituita da questa operazione per GRID_SCALE ci permetterà di variare quanto è grande la distanza al quadrato di ogni indice.

Le immagini sopra mostrano l'ambiente attuale dei veicoli e la griglia risultante.

Passaggio 6: comunicare con i motori

Per comunicare con i motori iniziamo inizializzando i GPIO per controllare la direzione in cui gira il motore. Quindi scrivere direttamente nell'indirizzo di base dei PWM nell'AXI Timer ci consente di impostare cose come il periodo e il ciclo di lavoro che controllano direttamente il velocità di rotazione del motore.

Passaggio 7: pianificazione del percorso

Da implementare in un prossimo futuro.

Utilizzando la funzionalità di griglia e motore precedentemente descritta, è molto facile implementare algoritmi come A*. Mentre il veicolo si muove, continuerà a scansionare l'area circostante e determinerà se il percorso su cui si trova è ancora valido

Consigliato: