Go Down

Topic: input e ragionamenti per il PID (Read 4964 times) previous topic - next topic

lesto

Ciao
la domanda di oggi non è propriamente sull'arduino ma sul PID

ho 4 PID, uno per motore, che teoricamente mi servono per stabilizzare il quadricottero

allora, come input io passo:
angolo attuale (in radianti) e come setpoint l'angolo desiderato (in radianti)
attualmente l'angolo desiderato (o set-point) lo possiamo considerare sempre 0, in realtà viene modificato dalla trasmittente per muoversi (tranne su e giù)
l'output del PID sarà un valore, se è +5 per il motore sinistro, sarà -5 per quello destro, e così via

Poi prendo l'output del PID e lo sommo con la potenza desiderata dei motori.

Il problema di questo metodo è che a qualsiasi potenza desiderata, l'influenza del PID è sempre la stessa.
Pensavo ad una soluzione del genere: potenza+(potenza*PID) e cercare di mantenere l'output di PID nel range tra -1 e 1

Però ho un altro dubbio: per essere stabili, non è detto che se il motore di destra spinge 10 allora anche quello di sinistra spinge 10, potrebbe dover spingere 12 come 9, ciò è dettato dal fatto che non tutte le eliche sono perfettamente uguali, che i motori non sono montati millemetricamente alla stessa distanza dal centro, effetto suolo, e più avanti anche colpi di vento e altre sollecitazioni esterne.

Questo problema viene automaticamente risolto dal PID? Magari dalla parte I? O esiste qualche altra soluzione?



per chi non sa cos'è un quadricottero (e per vantarmi  :D):
http://www.facebook.com/photo.php?pid=755173&l=71017e5eae&id=100000061327654

non dovrebbe servire essere registrati a facebook per vedere la foto, in caso contrario avvisatemi ;)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


Il problema di questo metodo è che a qualsiasi potenza desiderata, l'influenza del PID è sempre la stessa.
Pensavo ad una soluzione del genere: potenza+(potenza*PID) e cercare di mantenere l'output di PID nel range tra -1 e 1


Il PID ti fornisce in uscita un valore che serve per compensare l'errore istantaneo, tale valore è tanto maggiore quanto è l'errore e l'accumulo di errore nel tempo, chi provvede a questo è la componente integrale.
In pratica se l'errore è piccolo l'out del pid può essere molto piccolo se non ci sono errori pregressi da compensare oppure molto grosso nel caso contrario e con una grande quantità di errori pregressi da compensare.
Non ha alcuna importanza il valore reale della potenza (= velocità eliche) fornita al motore, tanto il pid ti fornisce sempre la giusta quantità per compensare lo sbandamento perché questa dipende dalla velocità angolare desiderata e non dalla potenza in uso dai motori.
Però se il pid che stai usando è quello che hai postato nell'altro thread ti dico subito che quello non è un pid, ti consiglio una attenta lettura del tutor di Livio Orsini che ho linkato nell'altro thread.

gbm

ciao Lesto dai un occhio qui:
http://www.gioblu.com/tutorials/programmazione/102-che-cose-lalgoritmo-pid
Secondo me devi usare solo due pid per tutti e 4 motori, uno per x uno per y.
Community robotica / programmazione Arduino
www.gioblu.com

astrobeed

Concordo, infatti serve un pid per ogni grado di libertà da controllare, dato che parliamo di rollio e beccheggio il tutto si riduce a solo due pid, se vogliamo controllare anche l'imbardata, consigliato su un quadricottero, serve un terzo pid che andrà ad agire su tutti e quattro i motori.

lesto

dato che l'imbardata è comandata attraverso i due motori in rollio (roteanti) e i due in beccheggio (controroteanti) teoricamente tutto rimane fattibile con due PID, no?
vado a rivedermi i tutorial, sapevo che quel PID è un pò farlocco ma speravo bastasse :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed

Non è che è un po farlocco, è tutto farlocco :)
Sia in teoria, che in pratica, ti bastano due pid.
Purtroppo parliamo di controllare un assetto, quindi errori angolari, e non mi pare che sia possibile fare semplificazioni come avviene per l'errore di velocità.
Un consiglio, non usare i float nel pid, l'ATmega 328 è un micro da solo otto bit e non ha nessun supporto hardware per la matematica, usa solo numeri interi.




gbm

Se hai bisogno ti do una mano col codice!! Cmq ottimo progetto non vedo l'ora di vederlo volare
Community robotica / programmazione Arduino
www.gioblu.com

Stefanoxjx

Quando avrai fatto, fammi un fischio.
Da tempo ho in mente di fare un quadricottero super economico, però non ho mai avuto il tempo di cimentarmi.
Magari, con qualche dritta da parte tua e qualche modifica al tuo codice (se vorrai condividerlo), diverrà una cosa più semplice del previsto.
Ho iniziato a costruirne uno seguendo il progetto della MultiWii, però poi per motivi di tempo non sono più riuscito a finirlo :(
Comunque, la mia idea sarebbe quella di provare a fare un quadricottero addirittura con motori a spazzole.
Lo so, magari non ci farai un granchè, però sicuramente verrebbe fuori un progetto molto economico per chi non può/vuole
investire molto su un progetto simile.
www.multiwii.it
www.sdmodel.it

astrobeed


Comunque, la mia idea sarebbe quella di provare a fare un quadricottero addirittura con motori a spazzole.
Lo so, magari non ci farai un granchè, però sicuramente verrebbe fuori un progetto molto economico per chi non


Non ti voglio scoraggiare, ma con i motori brushed non vai da nessun parte, non solo sono meno potenti a parità di peso e dimensioni, ma sono pure molto meno efficienti, alla fine devi mettere tante di quelle batterie (= peso = maggiore potenza dei motori = più batterie = più potenza dei motori = ciclo vizioso) che è un miracolo se il quadricottero si solleva e vola per qualche decina di secondi prima di finire la carica.

gbm

in effetti meglio brushless, anche le cinesate ormai funzionano. Testato sulla mia pelle.
Community robotica / programmazione Arduino
www.gioblu.com

lesto

i primi xufo erano brushed, ma come dice astrobeed non è che fossero prestanti come gli attuali...
Il mio codice lo condividerò quando funzionerà, quindi spero presto :)
occhio non tanto alle cinesate quanto alle vibrazioni: per esempio a me le viti dell'albero motore tendono a svitarsi, per colpa delle vibrazioni. Sostituite quelle perse (ebbene sì) con viti da PC (il ferramenta sotto casa mi diceva che quella misura di viti era introvabile -.-) e il problemea ora non si presenta più, in caso una goccia di colla o sostanze apposite e via
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

f.schiano

correggetemi se sbaglio....

ma in questo caso (UAV) non sarebbe molto utile utilizzare un filtro di kalman, anche perchè se ci sono degli "errori di progetto" (come ad esempio il fatto che le eliche non sono tutte alla stessa distanza dal centro etc etc..) tu puoi inserire delle tolleranze e il modello matematico del tuo quadricottero "cambierà " a seconda della situazione...

lo so che sono tutte chiacchiere, però mi sembrava potesse essere uno spunto utile per te!

Tienici aggiornati
L'impossibile...richiede solo piu' tempo!

astrobeed


ma in questo caso (UAV) non sarebbe molto utile utilizzare un filtro di kalman,


Il kalman non serve a nulla per il controllo del quadricottero, serve per pulire dal rumore (tanto) i sensori, comunque la vedo molto difficile implementare tutti i filtri necessari e farli lavorare real time con la necessaria banda su ATmega 328.

lesto

si il kallman è un algoritmo lento ma fattibile. Io usa la DCM (direct cosine matrix) che è molto più veloce in tempo macchina, in pratica è un PI applicato ai quaternioni di rotazione.
E' un algoritmo recente, se googli trovi la tesi del tizio, che dimostra anche come sa leggermente meglio del kallman (il kallman al è difficile aggiungere altri tipi di sensori, la DCM invece nasce apposta, tiri fuori il quaternione dal sensore e via)

stavo ripensando al fatto di avere due soli pid e non uno per motore. Ho fatto qualche test (su un solo asse), per rimanere in equilibrio, se il motore RX spinge 35, quello SX deve spingere 40 (il range va da 0 a 180).
Credo che la I debba occuparsi di questo, ma per farlo deve essere un PID per motore, no?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

f.schiano



Il kalman non serve a nulla per il controllo del quadricottero, serve per pulire dal rumore (tanto) i sensori, comunque la vedo molto difficile implementare tutti i filtri necessari e farli lavorare real time con la necessaria banda su ATmega 328.


è giusto quello che dici, ma può servire anche per "pulire" il modello matematico del quadricottero da eventuali errori, per quello intendevo che potesse servire in questo caso!!!

p.s. @lesto appena posso voglio informarmi su questa DCM che sembra molto interessante, già ne avevo sentito parlare molto bene!!!
L'impossibile...richiede solo piu' tempo!

Go Up