Qual è l'approccio giusto per scrivere il controller di spin per un robot da calcio?


14

Immagina di programmare un robot da calcio a 3 ruote. Che tipo di controller useresti per farlo girare? P? PID?

L'obiettivo di questo controller è che dovrebbe far stare il robot in un angolo definito (0 gradi) e tornare indietro se ruotato a mano o altro robot.

Uso i motori passo-passo per il mio robot e non per i servi, quindi devo implementarlo nel mio software!

Ho già scritto un controller di tipo P di esempio e il movimento è abbastanza buono. Ma vorrei renderlo migliore se possibile. Il codice è il seguente:

void spinSpeed(int devidedValue, int addedValue, int correction) {

    if(degree<correction && degree>-correction) {
        motorSpeed = 0;
    } else {
        if(degree > 0) {
            motorSpeed = ((degree)/(devidedValue) + (addedValue));
        } else {
            motorSpeed = ((degree)/(devidedValue) - (addedValue));  
        }
    }
}

correctionè un intervallo in cui il robot non ha movimento. degreeè un numero compreso tra -127 e 128 che viene restituito dalla bussola. motorSpeedè un numero compreso tra 0 e 255 che viene applicato al PWM.


Presumibilmente questa routine viene eseguita ogni volta che la compas genera un nuovo valore per degree?
Mark Booth

@MarkBooth Ho il mio codice da un po '(1), quindi in ogni ciclo ottiene il valore dalla bussola, lo dà alla funzione e quindi applica il risultato ai motori.
Miro Markaravanes,

Esaminerei il tipo di controller utilizzato da un servo, dal momento che stai cercando di duplicare il comportamento dei servo nel software.
Chris Laplante,

Non uso i servi. Uso i motori passo-passo, quindi non esiste già un tale comportamento nel motore.
Miro Markaravanes,

2
Ciao Miro, in cambio dello stack è meglio modificare la tua domanda in risposta alle domande nei commenti, in questo modo i commenti possono essere riordinati (eliminati) in modo che non distraggano dalla domanda stessa.
Mark Booth

Risposte:


7

La cosa importante da ricordare su un circuito di controllo PID è che ogni termine è destinato a dominare il controllo in momenti diversi durante una mossa.

Il termine proporzionale ha lo scopo di dominare e fornire una coppia maggiore (o nella velocità del tuo caso) quanto più ti allontani dalla posizione target.

Il termine derivato è destinato a dominare durante la fase di "crociera" della tua tipica mossa trapezoidale. Aiuta a regnare un termine proporzionale molto alto e limitare l'accelerazione in fuga quando sei lontano dalla tua destinazione, ma può anche aiutare ad aumentare la velocità con cui converti sulla tua destinazione quando ti avvicini ad esso e il termine proporzionale contribuisce molto meno .

Se si utilizza un controller di velocità anziché un controller di coppia, il termine derivato potrebbe effettivamente essere nascosto all'interno del controller di velocità e non direttamente accessibile al loop PID. Questo può rendere il controllo più semplice (in genere accelera il più rapidamente possibile fino alla velocità desiderata o alla velocità massima, a seconda di quale sia inferiore), ma può anche renderlo meno prevedibile. Spesso un termine D (o P) eccessivamente aggressivo può provocare un ciclo limite (spesso chiamato erroneamente risonanza o oscillazione a causa del suono dei motori che ronza o addirittura urla in questo stato, sebbene il ciclo limite sia una descrizione molto più accurata ).

Il termine integrale è lì per correggere l' errore residuo di stato stazionario , ovvero dove esiste una differenza persistente a lungo termine tra dove ti viene chiesto di andare e dove sei effettivamente. Il valore attuale correction(in realtà solo la tolleranza) funziona come l'opposto di un termine integrale, interrompe completamente il motore quando ci si trova in una banda morta attorno alla posizione desiderata.

A causa di questi fattori, guadagnerai poco dall'implementazione di un loop PID completo a meno che non pianifichi anche un profilo di velocità con fasi di accelerazione, crociera e decelerazione distinte.

Ricorda inoltre che la banda morta e la mancanza del termine I significheranno che la posizione finale sarà sempre in qualche modo casuale e molto probabilmente differirà a seconda della direzione in cui ti avvicini alla posizione desiderata. Pertanto, la ripetibilità bidirezionale potrebbe essere molto peggiore della ripetibilità standard.

Per ulteriori informazioni sulla differenza tra precisione, ripetibilità e risoluzione, vedere questa eccellente descrizione . Nel tuo caso, la tua risoluzione è il tuo sensore bussola, mentre sia l'accuratezza che la ripetibilità sono molto probabilmente limitate dal tuo correctionvalore, poiché se il correctionvalore è maggiore della risoluzione della bussola, stai gettando via parte della tua precisione di posizione in cambio di poter spegni il motore quando sei vicino.


8

Un controller PID sarebbe il migliore, utilizzando una bussola è quindi un compito relativamente semplice ottenere il rilevamento del proprio robot e confrontarlo con il rilevamento che si desidera ottenere e utilizzare alcune tecniche di ottimizzazione PID per ottenere un movimento di rotazione regolare verso l'intestazione desiderata. Questo approccio può anche essere applicato alla rotazione di un determinato importo in modo accurato.

Ho già fatto un po 'di robotica in questo campo, questo è quello che abbiamo usato nel nostro robot, facendo un compito non troppo dissimile al tuo ...


1
Grazie per la tua risposta. Volevo accettare la risposta, ma vorrei vedere più risposte, quindi accetterò quando ci saranno più risposte;)
Miro Markaravanes,
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.