Pages: 1 ... 86 87 [88] 89 90 ... 106   Go Down
Author Topic: [Multicotteri] Elettronica : IMU, MCU, Sensori ed algoritmi di controllo  (Read 99255 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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

Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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 :-)
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?!
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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.
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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")
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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 smiley )

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!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato ad implementare un timer interrupt come qui illustrato http://arduinomega.blogspot.it/2011/05/timer2-and-overflow-interrupt-lets-get.html e il tutto funziona alla perfezione, solamente che integrandolo nella funzione PID fa a pugni con la libreria che implementa la comunicazione I2C (wire.h) e il dispositivo non risponde più.

Io ho bisogno di avere 4 interrupt per la ricezione dalla trasmittente, 1 interrupt per la comunicazione I2C e 1 interrupt per sincronizzare la funzione PID. Giusto?!

Se così fosse ci sto al pelo, perché arduino Mega 2560 ha giusto giusto 5 interrupt. Soluzioni?!

Mi viene in mente che la libreria Servo.h utilizza l'interrupt 2... quindi non ci sto con gli interrupt..SOLUZIONI???  smiley-cry
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per il PID non ti serve la precisione di un timer interrupt, va bene fareun check con millis() per vedere se è trascorso il giusto tempo. Considera che il PPM "classico" lavora sui 50Hz, quindi cambiare più spesso la velocità non serve a nulla
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Considera che il PPM "classico" lavora sui 50Hz, quindi cambiare più spesso la velocità non serve a nulla

Ma ti devo cazziare subito oppure preferisci che ti faccio recapitare un invito premio per il quizzettone ?  smiley-grin
Regola prima, il ciclo pid DEVE essere almeno 10 volte più veloce della costante di tempo del sistema, meglio se 20 volte.
Regola seconda, lo slicing del pid non solo deve essere molto preciso, non deve essere affetto da jitter, la millis,e pure la micros, buttale in quel posto e tira la catena che non ci fa nulla.
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nel mio codice l'update del PID e dei motori(Servo) sono fatti nello stesso update e ho trovato vantaggi nel farlo andare a 50Hz invece che ad ogni loop.

Invece la DCM (che al suo interno usa dei PID) calcolo il tempo in micros() trascorso dall'ultimo update. Funziona meglio così che in un loop a tempo "fisso" (richiesta dati i2c, update, stampa su seriale, flush seriale) però non ho usato i timer.

Se facciamo girare il PID a un tempo fisso, più in fretta dell'attuatore, non "inganniamo" la parte integrale del pid?
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se facciamo girare il PID a un tempo fisso, più in fretta dell'attuatore, non "inganniamo" la parte integrale del pid?

Il PID deve essere molto più veloce del sistema, è il presupposto base per il suo funzionamento.
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

uff questo non era spiegato sulle cose che ho letto.. mannaggia  smiley-mr-green
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 ... 86 87 [88] 89 90 ... 106   Go Up
Jump to: