Come posso usare la libreria PID di Arduino per guidare un robot in linea retta?


19

Vorrei creare un robot basato su Arduino con 2 ruote, encoder in quadratura su ciascuna ruota, un chip driver H-bridge (o controller del motore) e una macchina per colata continua. Voglio usare la libreria PID per assicurarmi che la velocità sia proporzionale alla distanza da percorrere.

A livello concettuale (supponendo che i motori non rispondano in modo identico ai livelli PWM) come posso implementare il controllo PID in modo che viaggi in linea retta e ad una velocità proporzionale alla distanza rimanente da percorrere?


Anche questa domanda ha il suo posto qui, poiché è specificamente basata sulla libreria PID di Arduino .
Anindo Ghosh,

Risposte:


18

specifiche

Guardando l' esempio di base PID Penso che sia sufficiente creare un'istanza di due copie del controller PID, una per ogni ruota, codificatore e pwm:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Quindi, nel tuo loop()equivalente, leggi solo entrambi gli encoder, passa ciascun valore dell'encoder al relativo PIDe infine scrivi entrambi i valori PWM.

Per ora SetpointLefte SetpointRightpuò effettivamente indicare lo stesso valore, ma definendoli separatamente in questo modo è possibile aggiungere la possibilità di girare in seguito.

concetti

Mentre questo può funzionare per il caso di base, se è abbastanza dipende davvero da quanto sia necessaria la linea retta.

Calcolo dei morti

Dato che hai encoder su ogni ruota, se esegui due anelli PID e confronti il seguente errore di ciascuna ruota , puoi potenzialmente calcolare l' errore abbe massimo sulla distanza, supponendo che le ruote non scivolino. Se l'errore è inferiore alle tue esigenze, la resa dei conti è tutto ciò di cui hai bisogno.

Se tuttavia le tue ruote sono inclini a slittare, potresti avere nascosto a seguito di un errore che il tuo sistema di controllo non è in grado di rilevare e avrai bisogno di un modo per rilevare uno slittamento o calcolare la posizione indipendentemente dagli encoder e quindi utilizzare un software di livello superiore per correggere richiesto posizioni / velocità delle ruote per mantenere una linea retta.

Determinazione della posizione relativa

Come suggerisce John , potresti essere in grado di utilizzare un accelerometro per determinare la posizione, ma data la loro precisione e l'effetto degli errori accumulati nel tempo, potresti essere meglio usare i dati dell'accelerometro per rilevare e correggere lo slittamento delle ruote.

Nella robotica mobile, le tecniche di filtraggio Kalman sono comunemente utilizzate per fondere i dati da più fonti, come un accelerometro e gli encoder ruota per determinare meglio la posizione corrente.

Qualunque cosa tu faccia con la relativa determinazione della posizione, tuttavia, nel tempo la posizione in cui credi di essere si allontanerà dalla tua reale posizione fisica.

Determinazione della posizione assoluta

L'unico modo per aggirare questo è quello di avere un punto di riferimento al di fuori del quadro di riferimento dei veicoli.

Un roomba, ad esempio, usa generalmente i calcoli morti per muoversi in una stanza, ma ogni volta che ha bisogno di attraccare, cerca un raggio di luce infrarossa emesso dal dock di ricarica. Mentre il roomba si sposta casualmente attraverso quel raggio, lo rileva, si blocca sul raggio e lo segue fino alla sua sorgente. In combinazione con i suoi sensori di protuberanza, può posizionarsi accuratamente sui contatti di ricarica.

Per il tuo robot, potrebbe avere una posizione iniziale, dove può tornare indietro e rilevare che si trova in quella posizione nota. A quel punto sa esattamente dove si trova e può segnalare quanto è lontana la sua posizione calcolata dalla sua posizione effettiva.

Un'altra opzione, se hai bisogno che il tuo robot viaggi in linea retta per centinaia di metri sarebbe quella di passare a una tecnica diversa, come l'aggiunta di uno scudo GPS Arduino .

Una combinazione di tecniche

In definitiva, a seconda dei requisiti di precisione, potrebbe essere necessario utilizzare una combinazione di queste tecniche.

Se è possibile un raggio guida, potresti essere in grado di fare ciò che desideri semplicemente con una linea invisibile seguendo la tecnica . Se hai bisogno di muoverti in qualsiasi linea retta arbitraria in un'area vincolata, allora come il roomba potresti essere in grado di usare una coppia di raggi guida (ad angolo retto l'uno rispetto all'altro) per permetterti di correggere la tua posizione sintetizzata su un asse cartesiano ogni volta che il robot passa una delle travi.

Ci sono molte opzioni qui e ciò che hai scelto dipenderà da ciò di cui hai bisogno.


1

Se non si utilizza un solo asse per guidare entrambe le ruote, le uniche soluzioni che posso vedere sono l'aggiunta di un accelerometro a 3 assi o di un altro sensore per rilevare l'orientamento del robot e regolare i segnali su ciascun motore di conseguenza.


0

Come detto sopra, inizi dicendo a ciascuna ruota di muoversi alla stessa velocità e quindi il PID si assicura che funzionino a quella velocità. Ma questo NON sarà perfetto. È necessario continuare a controllare e correggere gli errori (1), leggere periodicamente e confrontare i conteggi dell'encoder a due ruote e rendere una ruota leggermente più veloce se necessario per ottenere un conteggio uguale. e (2) gli encoder MAI sono perfetti per cui hai bisogno di un accelerometro e una bussola.

Stai guardando un filtro Kalman. se si desidera combinare i dati dell'encoder, della bussola e dell'accelerometro per fornire l'intestazione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.