Approccio all'utilizzo del PID per ottenere un robot differenziale che guida dritto


13

Considera un robot con azionamento differenziale che ha due ruote motorizzate con un encoder collegato a ciascuna per il feedback. Supponiamo che ci sia una funzione per ciascun motore CC che prende un galleggiante da -1 a 1 e imposta i segnali PWM per fornire una quantità proporzionale di potenza a quel motore. Sfortunatamente, non tutti i motori sono uguali, quindi l'invio di ogni motore allo stesso segnale PWM fa virare il robot a sinistra oa destra. Sto cercando di pensare a come guidare il robot direttamente usando gli encoder collegati a ciascun motore come input per un loop PID.

Ecco come lo farei: prenderei la differenza tra gli encoder sinistro e destro, rileggerei l'errore tra un certo intervallo, normalizzarlo per essere da [-1, 1], e quindi mapparlo sulle potenze del motore da 0 a 1. Quindi se io e D fossimo zero e ottenessimo un errore di 1 (quindi il motore sinistro ha girato molto più del motore destro), allora il motore sinistro sarebbe impostato su 0 e il motore destro impostato su 1 (causando un duro sinistra).

Ci sono problemi con questo? Qual è un approccio migliore?

Risposte:


5

Ci sono problemi con questo?

Il problema principale è che mentre la soluzione proposta correggerà istantaneamente per una discrepanza tra le prestazioni dei motori, non correggerà l'errore accumulato, per non parlare di errori più complessi in posizione come l' errore di Abbe (vedi più avanti).

Qual è un approccio migliore?

Ci sono diverse cose che puoi fare, a seconda di quale sia la tua tolleranza agli errori e di quanti sforzi vuoi fare per correggerli.

Il primo passo sarebbe quello di impostare una coppia di loop PID, uno per ogni ruota, dando ad entrambi la stessa posizione richiesta. Come ho suggerito nella mia risposta a una domanda simile , se si mantengono entrambe le ruote entro un limite di errore molto stretto rispetto a dove si chiede loro di essere, allora ci vorrà del tempo per accumulare un errore sufficiente a causare una virata evidente.

Sarà anche molto più facile mettere a punto due loop PID a livello di motore nominalmente indipendenti piuttosto che mettere a punto un singolo sistema combinato complesso e interdipendente. Per resistere a qualsiasi modifica del controllo di livello superiore, è necessario che ciascun motore si comporti nel modo più simile possibile all'altro motore per il maggior tempo possibile e ciò richiede realmente circuiti di servo separati.

Esistono tuttavia alcune ulteriori complicazioni, e dipende dalla precisione di cui hai bisogno e dalla quantità di sforzi che sei disposto a fare per correggerle per quanto riguarda la soluzione. È possibile che Dead Reckoning sia sufficiente, oppure potrebbe essere necessario aggiungere la determinazione della posizione relativa o assoluta al robot.

Un problema è che anche se la vostra sinistra e ruote di destra entrambi i conteggi encoder mossa 1000, si potrebbe ancora finire in una posizione diversa su due piste diverse.

Ad esempio, supponiamo che tu abbia un errore di inseguimento massimo di 10 conteggi dell'encoder e che i tuoi motori funzionino a una velocità di 10 conteggi dell'encoder per ogni iterazione del loop PID. Il tuo motore sinistro potrebbe muovere 5,10,10,10 ... 10,5 mentre il tuo motore destro potrebbe avere un profilo di 4,11,10,10 ... 10,5 e anche quella leggera differenza di accelerazione all'avvio della mossa potrebbe far muovere il robot leggermente nella direzione sbagliata. Non solo, ma più ti muovi in ​​quella direzione, maggiore sarà l'errore in termini assoluti. Questo è ciò di cui stiamo parlando quando parliamo dell'errore di Abbe e senza un modello cinematico complesso o una sorta di riferimento esterno, non sarete mai in grado di correggerlo.

Per ulteriori informazioni, vedere la mia risposta a una domanda simile ma non del tutto duplicata: come posso utilizzare la libreria PID di Arduino per guidare un robot in linea retta? e la mia risposta all'ottimizzazione di Line Follower anche correlata


2

Ho un robot con 2 ruote indipendenti.

Ho scelto di usare un giroscopio per mantenerlo diretto nella direzione desiderata, i dossi scivolano e persino raccoglierlo e girarlo sono di scarsa importanza in quanto correggerà semplicemente la sua direzione.

Uso un singolo PID, che aggiunge / sottrae una correzione alla velocità corrente desiderata per ciascuno dei 2 motori in conformità con l'errore nell'intestazione (direzione) corrente come determinato dal giroscopio.

Ad esempio, ho impostato la velocità al 50% e l'intestazione a 20 gradi. questo normalmente guida entrambi i motori con una potenza del 50%. ma man mano che la rotta si spegne, il PID effettuerà le regolazioni aggiungendo un po 'di potenza a un motore e rimuovendo un po' di potenza dall'altro, quindi potresti finire con una divisione del 45% / 55% tra i motori mentre il pid corregge la rotta.

I giroscopi hanno i loro problemi, anche se con un po 'di tempo trascorso a calibrare sto ancora scoprendo che il mio gryo ha una deriva di circa 1 grado al minuto. Potrebbe essere perché la terra ruota di 15 gradi all'ora, questo dovrebbe anche essere considerato a lungo termine.

Come precedentemente affermato, gli encoder sulle ruote sono un'ottima idea per sapere effettivamente fino a che punto hai viaggiato.


Mi piacerebbe vedere il tuo codice per questo. Sto iniziando lungo lo stesso percorso con un giroscopio / accelerometro / magnetometro, ma sono ancora nella fase iniziale di cercare di dare un senso alle letture di questi sensori.
Ron Smith,

Ecco un link al mio codice, temo che potrebbe non essere facile da capire. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton,
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.