[Multicotteri] Elettronica : IMU, MCU, Sensori ed algoritmi di controllo

lesto:
sono 3 valori, una è la P che dice quanto inflienza la parte Proporzionale, la I dice come comportari nel modo Integrativo (ovvero: se la P prima non è bastata, aggiunge qualcosa in più), e la D per il modo derivatico (ovvero: se ci avviciniamo al punto desisderato, smorza la P)

Se lo spieghi così non ci capisce nulla, nel quadricottero hai una esigenza primaria, tenere la velocità angolare su i tre assi a 0, ovvero assetto stabile, questo è quello che viene detto volo acro perché il controllo non fa nulla per riportare il quadri in volo livellato, questo è il modo stable.
Prendiamo un attimo in considerazione solo il modo acro, il pid è un controllo velocità a tutti gli effetti e in caso di comandi 0 dello stick controllo assetto (Pitch e Roll) e di quello della direzione (yaw) il punto da raggiungere è 0, cioè tenere la velocità angolare a 0 su tutti e tre gli assi,
Adesso ragioniamo un attimo su cosa sono la derivata e l'integrale della velocità, ovvero la componente I e D del PID, la P è la velocità stessa, la derivata della velocità è l'accelerazione (A = V/T) mentre l'integrale è lo spazio (S = T*V).
Quanto sopra significa che la componente D del pid altro non è che l'accelerazione con cui viene modificata la velocità per portarla al punto desiderato, questa accelerazione diventa sempre minore all'avvicinarsi del punto e cambia di segno se viene oltrepassato, la componente I rappresenta sia o spazio angolare, se preferisci di quanti gradi è spostato l'asse dal punto desiderato, che la divergenza nel tempo, ovvero lo spazio perso durante lo scorrere del tempo per effetto dell'errore di posizione.
In pratica il PID interviene in tre modi simultaneamente, prima applica un fattore correttivo costante (P) che dipende esclusivamente dall'errore a cui applica un fattore di accelerazione che si modifica, sia aumentando che riducendo, nel tempo (D) e un fattore correttivo che aumenta in modo algebrico in funzione di quanto tempo è trascorso e l'entità dell'errore (I).
La somma dei tre fattori correttivi, a cui viene applicato uno specifico gain (le famigerate Kp, Ki, Kd) porta ad un valore di compensazione (offset) da applicare alla variabile di controllo.
Attenzione che il PID non fornisce direttamente il valore del controllo, fornisce un offset da sommare algebricamente alla variabile di controllo, tale offset cambia nel tempo in accordo con l'intensità dell'errore e i parametri K, ovvero tende ad arrivare a 0 mentre ci avviciniamo al punto desiderato e tende ad aumentare fino al massimo consentito quando ci allontaniamo dal punto, in pratica l'offset non è mai a 0, oscilla leggermente, in modo smorzato, attorno al punto.

sciorty:
Questo? Sarebbe meglio perchè ad essere sincero non ho capito molto :smiley:

Yes.

Sarà che l'ho solo sbirciato perchè non ho avuto tutto il pomeriggio, sarà che desideravo vedere un'applicazione pratica, ho trovato molto utile questo.
Però le formule che cita sono:
P = valore errore * kP (variabile utilizzata per la regolazione)
I = [valore errore * ?t (durata loop) ] * per kI (regolazione)
D = valore errore - valore errore loop precedente / ?t (durata loop)

Mentre mi pare che lui usi:
P = errore / kP;
I = I + (P * durata loop) / kI;
D = (errore - errore precedente) / durata loop / kD;

Non mi coincidono!

a parte che metà delle formule che citi senza usare le paretesi cambiano se scegli la convenzione di partire da sinistra o da destra per svolgere le operazioni.

comunqe X * a == Z/(1/a), poi mi pare errata del secondo blocco:

I = I + (P * durata loop) / kI;

se i è l'errore precedente ok, è "simile" a fare [valore errore * ?t (durata loop) ]

e del primo blocco

valore errore - valore errore loop precedente / ?t (durata loop)

quì non compare il termine D, ma se lo aggiungi moltiplicando il tutto vedrai che basandoti sul fatto che in realtà la PID del primo blocco è 1/PID del secondo e tutto torna

Non capisco ragazzi :\ non per colpa vostra, è che ancora forse mi è astratto questo concetto e non riesco a concretizzare quello che mi dite..

P rappresenta quanto dobbiamo agire, cioè l'errore, quindi la differenza tra l'angolo(parliamo di quadri magari)desiderato e quello attuale, ed è dato appunto dall'errore * la costante kP

I non ho capito cosa sia ma è dato dall'errore * il tempo passato dall'ultima correzione* la costante kI

D rappresenta la velocità con cui agire sull'errore? Dato da: (errore-errore ultima correzione)/ tempo passato dall'ultima correzione?

Giusto? (No :wink: )
Mi sento un po' in imbarazzo a chiedere qui perchè non so se siete moralmente tenuti a spiegarmelo in questo topic, ma in ogni caso scusate!

no, prima trovi l'errore, facendo (angolo desisderato-angolo attuale) che può essere positivi che negativo

poi per trasformare il valore di errore in un valore per l'azionamento che vuoi usare, e il sistema è con il componente P. La P si comporta come una retta: tanto più grande è P, tanto più è inclinata la retta rispetto all'asse X (dove asse X = errore, asse Y = output del pid)

notare che il tempo non centra niente: a qualsiasi istante il valore del componente P può essere conosciuto con certezza conoscendo l'input.

la I invece lavora con il tempo; è come la P, però se l'errore era presente anche alla misurazione precedente, lo aggiunge all'output.

Immaginati di andare in skate:per avanzare di tot metri dai una spinta X (Proporzionale). Ma se sei in salita non basta X, dovrai dare X+Y dove Y è proporzionale ai metri in meno che hai percorso nelle spinte precedenti.
Ovviamente Y crescerà fino a quando con X+Y non percorri i metri desiderati anche in salita. Quando tornerai in piano la Y tornerà, con la setssa velocità con cui è cresciuta, ad essere 0.

Ottimo esempio, ci sono andato in skate per un paio d'anni :smiley:

Quindi in parole povere la P è l'errore, la I è come l'errore ma al posto di azzerarsi quando l'errore è 0 scende piano piano? (raddriza il quadri dolcemente?)

la I è proporzionale alla somma dell'errore, in pratica se c'è un errore si accumula. Ovviamente l'errore può essere sia positivo che negativo, riuscendo quindi ad azzerarsi. Insomma si può dire che la P è il normale riflesso, la I la memoria a medio termine con cui modifichi l'impulso iniziale in base al comportamento passato dell'errore, però è a medio termine perchè mano a mano che raggiungi il punto desisderato si cancella

ecco un'altro test che ho fatto. (non state a guardare la qualità del montaggio, sono una chiavica)

Solo una critica relativa all'uso di una scena di Apocalypse now, sicuramente un grandissimo film, la scena in questione è il prologo dell'attacco ad un villaggio dove gli elicotteri Americani fanno una vera e propria strage, indipendentemente da chi era il buono e chi era il cattivo mi pare di cattivo gusto abbinare un ricordo intriso di sangue, morte e dolore ad un quadricottero.

lesto:
La P si comporta come una retta:

Mica è vero, in base alla funzione di trasferimento del sistema la P può benissimo essere una qualunque funzione matematica tutt'altro che lineare.

notare che il tempo non centra niente: a qualsiasi istante il valore del componente P può essere conosciuto con certezza conoscendo l'input.

Questo è corretto, lo scopo della P è fornire una correzione prossima al punto desiderato.

la I invece lavora con il tempo;

La I e la D sono esattamente quello che dicono di essere, ovvero l'integrale dell'errore e la sua derivata, nel caso della velocità angolare come errore sono rispettivamente lo spazio perso, o guadagnato, sulla distanza angolare, e l'accelerazione angolare, è molto importante trovare, e comprendere, i legami fisici dei parametri per poter scrivere un pid realmente efficiente.
Come ho già rimarcato la formuletta canonica del PID è solo un descrittore e non la soluzione, ogni pid è diverso da un altro e vanno analizzati e risolti singolarmente, p.e. un pid per il controllo della velocità è diverso da quello per il controllo della distanza, tra parentesi il pid controllo velocità è un caso particolare ove il parametro D è quello stabilizzante e quello I destabilizzante, normalmente è il contrario.

mi dispiace ti dia fastidio l'idea, ma personalmente non la vedo come te, ma più da un punto di vista cinematografico e ognuno ci vede quello che vuole. comunque grazie per la critica, sono sempre costruttive :stuck_out_tongue:

http://www.ebay.it/itm/STM32F4-DISCOVERY-USB-STM32F407VGT6-STM32-ARM-Cortex-M4-Development-Board-Embed-/170884988017?pt=Bauteile&hash=item27c989fc71#ht_696wt_1037

è la scheda di cui parlavate prima??

cavde:
è la scheda di cui parlavate prima??

No, questa è molto più performante e decisamente più grossa come dimensioni fisiche, comunque sempre compatibile con un quadri, sopra c'è solo un accelerometro con solo otto bit di risoluzione, non va bene per un quadri, è necessario aggiungere una IMU esterna.
La cosa divertente è che la scheda che hai linkato da RS la paghi solo 12.65 Euro + iva, su ebay la vendono a molto di più del suo reale prezzo.

cavde devbe ancora uscire la scheda di cui parleremo

lesto:
cavde devbe

ROTFL :smiley:

La STM32F3 Discovery dovrebbe essere disponibile a partire da metà Ottobre.

:grin:

comuque astro le spedizioni dai sisti che la propongono sono alte (20€), e io la vorrei al volo ( due, una da regalare :slight_smile: ) quindi se non c'è la certezza che RS la venda possiamo fare un acquisto di gruppo? magari si aggiunge pure cavde e qualcun'altro

lesto:
comuque astro le spedizioni dai sisti che la propongono sono alte (20€), e io la vorrei al volo ( due, una da regalare :slight_smile: ) quindi se non c'è la certezza che RS la venda

Non appena sarà realmente disponibile di sicuro la trovi sia da RS, spedizione meno di 7 Euro, che da Watterott, quindi il problema non si pone minimamente.

fa ridere soprattutto perchè cavde deriva da "carde" e dalla mia r moscia :smiley:

ciao,
sto mettendo su un simulatore per algoritmi di stabilizzazione del quad. Ne avevo già fatto uno maho perso il codice :smiley:
al momento c'è l'ambiente grafico 3d, il motore fisico, e un quad stilizato.
Ogni update fisico viene chiamato un update della classe QuadLogic, che sarà dove il codice utente viene inserito. (input: angoli x, y, z, posizione x, y, z; output ppm 4 canali)

per ora la logica mantiene un'altezza fissa, è solo P + I, quindi in realtà "galleggia" come una nave sul mare mosso, e setto lo stesso valore PPM su tutti i canali, però carino da vedere come riesce a mantenere la posizone anche da inclinato, credo che si un bug che le forze non sono solidali col quad ma relative al mondo esterno.

in oltre col sinistro del mouse è possibile sparare una pallina per destabilizzare un pò il sistema..

Domani inizio a lavorarci su seriamente (oggi ho montato grafica e fisica, o meglio il framework JME3) e posto il codice su github.

Domanda: qualcuno ha delle curve motore "ppm/velocità", nel senso: quanto velocemente è in grado un motore di cambiare velocità (e di conseguenza spinta) in un dato istante (1/60 di secondo è la risoluzione attuale).
So che la cosa in realtà varia in base a molti fattori blablabla, ma a me basta una media per capire se posso far finta che i motori siano istantanei, o se devo limitare il cambio di impulso generato in base al PPM limitandolo in base al valore precedente.

Poi, volendo implementare anche l'effetto "rotazionario" sarebbe fico sapere quanto velocemente gira il vostro quad in base ai valori PPM... ma qui la cosa si complica. Quando (e se) il mio quad volerà potrò rilavare i dati in volo e quindi tunare il sistema apposta, ma per ora brancolo nel buio, e mi piacerebbe avere almeno una posto dove pre-testare virtualmente la stabilità dei vari algoritmi.