Go Down

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

lesto

ottimo lavoro, è un buon inizio.
Come ti sei accorto i sensori vanno "puliti", in oltre i sensori hanno un "output rate" (vedi datasheet per i valori) che in pratica è quante volte al secondo si aggiornano. Leggere i sensori più in fretta senza apposita pulizia dei valori crea risultati sballati. Poi applichi il kallmann, che pulisce i segnali ulteriormente, e poi fai una "sensor fusion", ovvero applichi un algoritmo che "mischia" i dati dei sensori.
Lavora tranquillamente su un singolo asse, tanto tranne la rotazione su se stesso (yaw), che puoi implementare più avanti,
Io uso la DCM che fa sia da filtro che da sensor fusion (https://github.com/lestofante/arduinoSketch/blob/master/QuadricotteroCompleto/stabilization/Stabilizzazione.cpp), ed è lo stesso algoritmo usato nella libreria freeIMU, anzi, mi pare che lui usi la versione "base" di Mayhony mentre io uso quella modificata da Madgwick che incorpora la compensazione per la distorsione magnetica del magnetometro
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lesto



Guarda sulla mia firma il progetto quadrilatero completo,


Ma vola ?


no, è un codice vecchissimo (5 mesi fa), ora sono allo stesso punto di samu_87 ma con migliore stabilità e su tutti gli assi (yaw compreso) ma comnadabile solo come potenza motore(throttle) via Seriale (debug del quaternione graficamente a 30Hz se non ricordo male).
Ovviamente ora è tutto fermo perchè sto portando il codice sull STM32, se ne avessi il tempo. Forse sono riuscito a comunicarci via seriale attraverso un traslatore di livelli e un chip FTDI, l'USB per ora l'ho abbandonata che mi ha portato via un sacco di tempo senza risultati.

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


Ovviamente ora è tutto fermo perchè sto portando il codice sull STM32, se ne avessi il tempo.


Io ho già fatto il porting del mio codice per dsPIC33 sulla STM32F3, funziona abbastanza bene devo solo finire di ottimizzare ed eliminare qualche bug minore.
Come prima impressione, corroborata da verifiche pratiche e strumentali, posso confermarti che i sensori della STM32F3 sono realmente superiori a quelli che utilizzavo sulla precedente versione della IMU, ovvero l'ITG3200 e l'ADXL345 con il magnetometro HMC5883L.
Inutile dire che avanza tempo cpu in abbondanza per gestire il quadri e il GPS con tanto di funzionalità per il volo autonomo, questo anche grazie alla presenza della fpu e del core dsp, impossibile chiedere di più per solo 14 Euro  :smiley-mr-green:

lesto

si, ma io voglio i dati via USB!!!!! a parte che in realtà se la seriale mi funziona bene, è giusto a 3,3v come gli xbee di cui ne ho una coppia a casa...
il problema è il tempo da dedicarci, speravo nelle vacanze di natale ma una capellona mi ha agguantato, e addio al già poco tempo libero :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

samu_87



Ho fatto qualche passo avanti, vi posto il video del risultato (ancora in beta) che ho ottenuto applicando un PID per cercare di bilanciare un asse: https://www.youtube.com/watch?v=Jo9mfy4mhxg


Direi che sei sulla buona strada :)

Quote

Ho notato però che l'input del sensore è poco uniforme, quindi per procedere devo assolutamente implementare un filtro di kalman come questo http://www.gioblu.com/tutorials/programmazione/98-filtro-di-kalman-con-arduino ma ho una domanda da niubbo,


Si ti serve un Kalman, ma non quella cosa che trovi sul tutorial che hai linkato, è tutto meno che un vero Kalman :)
Il Kalman lo applichi a tutto il sistema, ovvero a tutti i d.o.f., e questo richiede un grosso lavoro di analisi matematica e devi anche conoscere in modo abbastanza preciso le funzioni di trasferimento del sistema altrimenti te lo scordi di implementare un Kalman che sia realmente preciso.
Potresti optare per la soluzione di Lesto che utilizza solo la DCM, molto più semplice da implementare e offre lo stesso buoni risultati.
Ovviamente c'è sempre la questione pid, che è tutt'altro che secondaria, e da quello che hai scritto qui direi che non hai le idee molto chiare su cosa sia e come funziona il pid  :)
Ti consiglio di cercare il corso pid di Livio Orsini, lo trovi in formato pdf liberamente scaricabile, è la miglior introduzione possibile al mondo del pid che, dietro l'apparente semplicità della formulazione canonica, nasconde molte insidie e alberga il maligno (come direbbe Bonolis  :smiley-mr-green: ).


Intanto ti ringrazio, mi sa che inizierò la DCM.

Per quanto riguarda il PID ho trovato questi materiali, inserisco i link così che possano essere utili ad altri:

http://www.fabbrimarco.com/droboitalia/Le%20guide%20di%20Roboitalia%20-%20il%20PID%20facile1.pdf

http://www.plcforum.info/didattica/conreg/conreg.htm

Poi devo assolutamente visualizzare l'andamento dei valori con grafici tramite Processing.

Ringrazio molto anche lesto!

samu_87

Code: [Select]

P = errore / kP;
I = I + roll * kI;
D = ((errore - erroreOld) / interval) * kD;

float PID = P + I + D;


Ora le formule di PID dovrebbero essere corrette giusto?! considerando che interval è la durata dell loop.

Da qui capisco che con queste tre regole posso controllare una sola variabile di output, nel senso, il PID mi permette di correggere un errore, l'errore è dato da un valore aspettato e un valore letto, il PID minimizza questo errore. Se fin qui ci sono ora dico che il mio errore è lo scostamento dallo zero di un asse X del quale possiedo il valore, come attuatori ho due motori che compiono lo stesso numero di giri, il PID mi fornirà (se settato a dovere) un valore da sottrarre a un motore e sommare all'altro che mi garantisce la stabilità di tale asse.

Dovendo stabilizzare due assi X e Y dovrò gestire due PID distinti per ogni asse??
O mi sfugge il funzionamento della DCM che fonde gli input?!

Grazie!

astrobeed


si, ma io voglio i dati via USB!!!!! a parte che in realtà se la seriale mi funziona bene, è giusto a 3,3v come gli xbee di cui ne ho una coppia a casa...


La parte USB non l'ho ancora guardata, però è sicuramente possibile come testimonia il video linkato.


Quote

ma una capellona mi ha agguantato, e addio al già poco tempo libero :)


Questa si che è una cosa positiva  :smiley-mr-green:

http://vimeo.com/56784314

astrobeed


Per quanto riguarda il PID ho trovato questi materiali, inserisco i link così che possano essere utili ad altri:
http://www.fabbrimarco.com/droboitalia/Le%20guide%20di%20Roboitalia%20-%20il%20PID%20facile1.pdf
http://www.plcforum.info/didattica/conreg/conreg.htm


Il primo link è solo una introduzione molto all'acqua di rose al pid, l'autore è un amico.
Il secondo link è il corso pid di Livio Orsini che ti avevo indicato, studialo con molta attenzione perché è ottimo.

Quote

Poi devo assolutamente visualizzare l'andamento dei valori con grafici tramite Processing.


Fattibile, però ti consiglio di dare un'occhiata a questo sito, trovi una soluzione pronta all'uso e totalmente free.

astrobeed


Ora le formule di PID dovrebbero essere corrette giusto?! considerando che interval è la durata dell loop.


No, quello non è un pid, gli assomiglia ma non lo è

Quote

Da qui capisco che con queste tre regole posso controllare una sola variabile di output, nel senso, il PID mi permette di correggere un errore


Non è corretto, un pid può avere più input di feedback e multipli output di correzione, ovviamente le cose si complicano non poco, solitamente si preferisce utilizzare singoli pid tra loro concatenati che vengono indicati come pid a doppio, triplo, etc, anello a seconda del numero di feedback in ingresso.

Quote

, l'errore è dato da un valore aspettato e un valore letto, il PID minimizza questo errore.


Lo scopo del pid non è minimizzare, è mantenere l'errore a zero, ovviamente in pratica è impossibile e in realtà il sistema oscilla in modo periodico attorno allo zero, più è efficace il pid e minore è l'intensità delle oscillazioni e maggiore il periodo, il pid quasi ideale ha una caratteristica smorzata sull'errore che rimane a valori talmente bassi che si possono considerare nulli perché non hanno alcun effetto sul sistema.

Quote

Se fin qui ci sono ora dico che il mio errore è lo scostamento dallo zero di un asse X del quale possiedo il valore, come attuatori ho due motori che compiono lo stesso numero di giri, il PID mi fornirà (se settato a dovere) un valore da sottrarre a un motore e sommare all'altro che mi garantisce la stabilità di tale asse.


Stai commettendo un grosso errore di valutazione, il controllo primario non è la posizione, è la velocità di rotazione dell'asse, solo quando l'hai azzerata, o mantenuta costante ad un valore desiderato, puoi prendere in considerazione di portare l'asse ad un certo valore di inclinazione desiderato, e non è detto che sia per forza zero.
Detto in altri termini ti serve un pid a doppio anello, input velocità angolare (giroscopio, parametro primario) e posizione angolare (input accelerometro/magnetometro, parametro secondario).

Quote

O mi sfugge il funzionamento della DCM che fonde gli input?!


La DCM ti fornisce l'assetto, non esegue la correzione, quello è compito del pid.

samu_87



Stai commettendo un grosso errore di valutazione, il controllo primario non è la posizione, è la velocità di rotazione dell'asse, solo quando l'hai azzerata, o mantenuta costante ad un valore desiderato, puoi prendere in considerazione di portare l'asse ad un certo valore di inclinazione desiderato, e non è detto che sia per forza zero.
Detto in altri termini ti serve un pid a doppio anello, input velocità angolare (giroscopio, parametro primario) e posizione angolare (input accelerometro/magnetometro, parametro secondario).



Quindi io ho il mio sensore GY-521 che mi fornisce dati di giroscopio e accelerometro, ora utilizzo i dati provenienti dal giroscopio che mi danno la distanza (in radianti? valori compresi fra -16000 e 16000) dallo zero che rappresenta l'asse perfettamente parallelo al suolo.
Dovrei quindi usare il valore dell'accelerometro?
Quindi in futuro PID a doppio anello che tramite l'accelerometro tiene l'asse "in bolla" e tramite il radiocomando varia un parametro inclinazione che viene mantenuto dal secondo anello del PID?

Grazie e scusa l'ignoranza ma iniziare non è facile :-)

astrobeed


Quindi io ho il mio sensore GY-521 che mi fornisce dati di giroscopio e accelerometro, ora utilizzo i dati provenienti dal giroscopio che mi danno la distanza (in radianti? valori compresi fra -16000 e 16000) dallo zero che rappresenta l'asse perfettamente parallelo al suolo.


Attenzione, il giroscopio fornisce la velocità angolare, non la posizione, questa semmai potresti ricavarla tramite integrazione, però è un metodo che in pochissimo tempo ti porta ad errori enormi.
Per ottenere in modo preciso la posizione si usa la sensor fusion tra giroscopio e accelerometro, e questa te la fa la DCM, però intanto puoi tranquillamente lavorare con solo i dati giroscopici per mettere a punto l'anello controllo velocità facendo in modo che l'asse rimane stabile dove lo metti e se gli dai un colpo deve fermarsi da solo nel modo più rapido possibile.

samu_87



Quindi io ho il mio sensore GY-521 che mi fornisce dati di giroscopio e accelerometro, ora utilizzo i dati provenienti dal giroscopio che mi danno la distanza (in radianti? valori compresi fra -16000 e 16000) dallo zero che rappresenta l'asse perfettamente parallelo al suolo.


Attenzione, il giroscopio fornisce la velocità angolare, non la posizione, questa semmai potresti ricavarla tramite integrazione, però è un metodo che in pochissimo tempo ti porta ad errori enormi.
Per ottenere in modo preciso la posizione si usa la sensor fusion tra giroscopio e accelerometro, e questa te la fa la DCM, però intanto puoi tranquillamente lavorare con solo i dati giroscopici per mettere a punto l'anello controllo velocità facendo in modo che l'asse rimane stabile dove lo metti e se gli dai un colpo deve fermarsi da solo nel modo più rapido possibile.



Ok perfetto! quindi per ora mi concentro solamente sul valore del giroscopio relativo all'asse che misuro giusto?! O mi serve anche l'asse Y?

Mi potresti dire per che motivo si scostano le mie equazioni del PID?!

astrobeed


Ok perfetto! quindi per ora mi concentro solamente sul valore del giroscopio relativo all'asse che misuro giusto?!


Si

Quote

Mi potresti dire per che motivo si scostano le mie equazioni del PID?!


Semplicemente perché non è PID :)
Studia attentamente il corso di Livio Orisini, tra gli esempi fa anche quello del controllo velocità che è proprio quello che ti serve.
Un aiuto extra, il controllo velocità è un caso particolare del pid per via del significato fisico delle varie componenti, la derivata della velocità è l'accelerazione e l'integrale è lo spazio, per questo motivo l'elemento stabilizzante è la derivata e non l'integrale come avviene di solito nel pid.
Da notare che nel controllo velocità la componente integrale può portare ad effetti indesiderati come l'aumento (sia + che -) della velocità invece della sua stabilizzazione, questo perché il PID cerca di recuperare lo spazio perso, o guadagnato, per effetto dell'errore in modo da mantenere la velocità media costante, questo comportamento può risultare fatale su un quadricottero.

lesto

pid per x, y e z, la DCM prende i valori dei sensori e ti da un'orietamento nello spazio usando i quaternioni (se guardi il codice poi per comodità trasformo il quaternionein angoli euleriani "umani")
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

samu_87



Ok perfetto! quindi per ora mi concentro solamente sul valore del giroscopio relativo all'asse che misuro giusto?!


Si

Quote

Mi potresti dire per che motivo si scostano le mie equazioni del PID?!


Semplicemente perché non è PID :)
Studia attentamente il corso di Livio Orisini, tra gli esempi fa anche quello del controllo velocità che è proprio quello che ti serve.
Un aiuto extra, il controllo velocità è un caso particolare del pid per via del significato fisico delle varie componenti, la derivata della velocità è l'accelerazione e l'integrale è lo spazio, per questo motivo l'elemento stabilizzante è la derivata e non l'integrale come avviene di solito nel pid.
Da notare che nel controllo velocità la componente integrale può portare ad effetti indesiderati come l'aumento (sia + che -) della velocità invece della sua stabilizzazione, questo perché il PID cerca di recuperare lo spazio perso, o guadagnato, per effetto dell'errore in modo da mantenere la velocità media costante, questo comportamento può risultare fatale su un quadricottero.


Ho capito il mio errore di fondo, è necessario che il controllo PID venga eseguito ad intervalli costanti.
Per fare questo mi serve un Timer Interrupt che lanci il controllo ogni 10ms (il valore l'ho preso dal testo che ho letto, se avete consigli sono ben accetti, come al solito :) )

La mia domanda è, avento arduino mega2560, ci sono librerie che mi gestiscono il timer interrupt?! io ho cercato ma ho trovato solamente per arduino 168/328 (i numeri nn li ricordo precisamente)

Al solito grazie 1000!

Go Up