Ottimizzazione del follower di linea


9

Sto lavorando alla costruzione di un robot follower di linea e voglio ottimizzarne le prestazioni. Mi è stato suggerito di utilizzare un algoritmo PID. Ho letto molto sul PID ma sono un po 'confuso riguardo a quanto segue:

Ho calcolato il valore_errore usando Kp*proportioonun'l+... Ma per quanto riguarda la variazione della velocità del motore, sono confuso su cosa usare durante il confronto la differenza (es. Posizione attuale - setpoint) o il valore di errore. Quello è che dovrei usare

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }

o

if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }

Inoltre esiste un intervallo specificato per i valori delle costanti Kp, Kio e Kd? Sto usando un robot a ruote differenziali per il mio seguace di linea.

Inoltre sarei felice se qualcuno mi suggerisse un altro algoritmo di ottimizzazione avanzato per migliorare il robot follower di linea.


Non sono sicuro di quale terminologia stai usando, ma nella terminologia dei sistemi di controllo è normale che la tua "differenza" sia il valore dell'errore e (per quanto posso dire) il tuo "valore_errore" è il comando di controllo.
TimWescott,

Ciao a tutti, la variabile Kp, ad esempio, è il guadagno proporzionale. Conosci la teoria del controllo?
leCrazyEngineer,

@leCrazyEngineer Non ricordo gran parte di questa domanda com'era 3 anni fa. Neanche io ho idea della teoria del controllo. Forse i ragazzi che hanno risposto avrebbero avuto qualche indizio.
meteore

Risposte:


8

Quando si utilizza un loop PID per guidare utilizzando la seguente linea, il setpoint sarà sempre lo stesso. Vorrai sempre che la linea sia nella stessa posizione rispetto al robot, ad esempio al centro del sensore.

Pertanto, se il sensore di linea emette un valore compreso tra -1 e 1 con 0 al centro del sensore, il valore impostato sarà zero (e la lettura del sensore e la differenza saranno uguali). Se il sensore di linea emette un valore compreso tra 0 e 10, il valore impostato sarà 5 (e la lettura del sensore e la differenza saranno diverse).

Dato che stai guidando impostando le ruote per girare a velocità diverse, quindi per seguire senza problemi una linea a una velocità costante, probabilmente vorrai regolare le velocità per entrambe le ruote in base all'errore. Ad esempio, se devi girare a sinistra per rimanere sulla linea, rallenterai la ruota sinistra e accelererai la ruota destra. Più devi girare, più avrai bisogno di rallentare la ruota interna e più avrai bisogno di accelerare la ruota esterna.

Considera la situazione in cui devi girare θ radianti a sinistra per correggere l'errore e e la tua velocità attuale è S0:

Sterzo differenziale

Quindi la tua ruota sinistra deve viaggiare SL=rθ e la tua ruota destra deve viaggiare SR=(r+B)θ.

Per mantenere la stessa velocità complessiva S0, hai bisogno S0=(r+B/2)θ, quindi la ruota sinistra dovrà viaggiare SL=S0-(B/2)θ mentre la ruota destra dovrà viaggiare SR=S0+(B/2)θ.

Poiché l'errore tende verso lo zero, anche le velocità di ciascun motore tenderanno l'una verso l'altra. Man mano che l'errore aumenta, anche i differenziali di velocità aumenteranno.

Potrebbe anche essere necessario che la ruota interna ruoti all'indietro se il sensore ti sta dicendo che la linea si sta curvando più strettamente della distanza tra le ruote. Queste sono complicazioni che puoi affrontare passo dopo passo, mentre il tuo controllo diventa più sofisticato.

Inoltre, poiché il tuo errore avrà valori sia positivi che negativi (per rappresentare il continuum dalla scala a sinistra ... troppo a sinistra ... sulla linea ... troppo a destra ... dalla scala a destra, allora dovresti non è mai necessario chiedere che ifl'errore sia positivo o negativo, è sufficiente calcolare nuovi valori in base al valore dell'errore, poiché un valore positivo e un valore negativo dovrebbero avere effetti opposti e simmetrici sui motori.

Si noti che per la riga seguente, potresti essere in grado di cavartela solo con il termine di guadagno proporzionale (cioè lasciando gli altri termini a zero). L'implementazione di un termine derivativo può consentire di aumentare il termine del guadagno proporzionale per ottenere un sistema più reattivo, ma è improbabile che un termine integrale possa essere di aiuto. Il fatto che se il tuo robot vada nella direzione sbagliata l'errore aumenti, significa che i movimenti fisici dei tuoi robot agiranno comunque come un termine integrale.

I valori specifici di P, D e I saranno determinati dalla reattività del tuo sistema. Per consigli generali sull'ottimizzazione dei parametri PID, vedere la mia risposta e altri su Quali sono le buone strategie per l'ottimizzazione dei loop PID?


secondo te "dovresti semplicemente calcolare nuovi valori in base al valore di errore, poiché un valore positivo e un valore negativo dovrebbero avere effetti opposti e simmetrici sui motori". ma come faccio a determinare quale motore dovrebbe ottenere l'effetto dell'errore?
meteore

@AnkitShah Lo fanno entrambi. Spero che il mio aggiornamento lo spieghi un po 'meglio.
Mark Booth

Grazie a @Mark Booth che ha davvero spiegato le cose. Non ho abbastanza rappresentante. sul sito per votare la tua risposta, ma davvero è stato spiegato bene.
meteore

Sono contento di aver potuto aiutare @AnkitShah - Se modifichi la tua domanda per rimuovere parte dell'ambiguità (come se stai usando un differenziale o uno sterzo ackermann) allora otterrai un voto da almeno me e forse anche da altri. Non dovresti impiegare molto a ottenere 15 rappresentanti se ascolti i suggerimenti che le persone fanno.
Mark Booth

Grazie @Mark ci sono altri algoritmi che aiutano a ridurre l'errore e fanno muovere il bot più agevolmente e seguire la linea?
meteore

3

Potresti voler dare un'occhiata a questa domanda su come ottimizzare i PID .

Sembra che tu stia confondendo il ruolo di errorin questo calcolo. L'equazione PID prende la misura dell'errore (posizione effettiva - posizione desiderata) e determina quanta "risposta" dovrebbe essere comandata nel controller (es. Quanta forza).

Quindi, invece di dire if (error_value > 0) { }, dovresti dire qualcosa del genere response = get_PID_calculation(error_value). A seconda della costruzione del veicolo specifico, tale risposta verrebbe inviata al motore di azionamento come la quantità di acceleratore, lo sterzo come angolo desiderato o qualche altro input di controllo.


Questo è il link al mio codice Arduino cosa mi consigliate. www1.datafilehost.com/d/5dcbdd4e
meteore

Dipende, cosa sta facendo di sbagliato il robot?
Ian,
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.