Pages: [1] 2 3   Go Down
Author Topic: input e ragionamenti per il PID  (Read 4224 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-grin):
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 smiley-wink
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"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

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

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Community robotica / programmazione Arduino
www.gioblu.com

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"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

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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"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

Non è che è un po farlocco, è tutto farlocco smiley
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.



Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se hai bisogno ti do una mano col codice!! Cmq ottimo progetto non vedo l'ora di vederlo volare
Logged

Community robotica / programmazione Arduino
www.gioblu.com

0
Offline Offline
Sr. Member
****
Karma: 1
Posts: 443
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"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

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

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

in effetti meglio brushless, anche le cinesate ormai funzionano. Testato sulla mia pelle.
Logged

Community robotica / programmazione Arduino
www.gioblu.com

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Germany
Offline Offline
Edison Member
*
Karma: 2
Posts: 1363
Here we go!!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9172
"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

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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Germany
Offline Offline
Edison Member
*
Karma: 2
Posts: 1363
Here we go!!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


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

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

Pages: [1] 2 3   Go Up
Jump to: