Go Down

Topic: [Multicotteri] Elettronica : IMU, MCU, Sensori ed algoritmi di controllo (Read 132 times) previous topic - next topic

sciorty

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

astrobeed


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.

astrobeed


sciorty

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!


lesto

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:
Code: [Select]
I = I + (P * durata loop) / kI;
se i è l'errore precedente ok, è "simile" a fare [valore errore * ?t (durata loop) ]

e del primo blocco

Code: [Select]
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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up