input e ragionamenti per il PID

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


non dovrebbe servire essere registrati a facebook per vedere la foto, in caso contrario avvisatemi :wink:

lesto:
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.

ciao Lesto dai un occhio qui:

Secondo me devi usare solo due pid per tutti e 4 motori, uno per x uno per y.

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.

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 :slight_smile:

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

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

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 :frowning:
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.

Stefanoxjx:
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.

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

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 :slight_smile:
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

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

f.schiano:
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.

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?

astrobeed:
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!!!

codice e video del MARG (gyro+accelerometri+megnetometri), IMU(gyro+acce)
http://code.google.com/p/imumargalgorithm30042010sohm/

Ecco alcuni link a progetti con PID e quadricotteri con i miei sorgenti:
http://www.elenafrancesco.org/arduino/baronpilot/

Un esempio:

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

Mi ero scordato di risponderti su questa cosa.
Kalman e DCM sono due cose differenti e con scopi diversi, l'una non esclude l'altra, Kalman è un filtro, o se preferisci una definizione più tecnica è un osservatore, serve per ripulire dal rumore il segnale ricavato dai sensori inerziali che per loro natura sono molto rumorosi.
Puoi anche non usare il kalman, e con l'hardware di Arduino è una scelta quasi obbligata perché non disponi della necessaria potenza di calcolo per implementarlo in real time su tutti i sensori, però in questo modo sacrifichi moltissimo la sensibilità minima reale (= perdita di precisione) rendendo quasi impossibile ottenere le grandezze fisiche da integrazione in modo preciso e stabile, in particolare la velocità dagli accelerometri e l'angolo dai giroscopi.
Comunque alla fine tutto dipende dal risultato che si vuole ottenere, se lo scopo è un quadricottero abbastanza stabile da portare con il telecomando senza essere un bravo pilota non è il caso di complicarsi troppo la vita.
Se lo scopo è un UAV in grado di volare, sul serio, da solo allora scordati di usare un ATmega 328 come unico processore, devi andare su micro di gran lunga superiori e non ne basta uno solo, come minimo servono un paio di dsPIC33, uno dedicato ai sensori e uno per la navigazione.

A me interessa un sacco studiare sistemi multicore!!
Sicuramente uno standalone che acquisisca e filtri dalla IMU è fondamentale, oppure ti procuri una IMU con gia un MCU presente, tipo arduIMU.
Un altro MCU, (anche un 168 basta e avanza) se il budget lo permette è molto utile che salvi su sd i dati in real time x capire cosa succede e semplificare il debugging.

Un buon punto d'inizio è questa IMU 9 Degrees of Freedom - Sensor Stick prodotta da Sparkfun, ed è solo un entry level sul profilo prestazioni se lo scopo è realizzare un UAV come si deve.
Alla IMU occorre aggiungere un micro con sufficiente potenza di calcolo, consigliato il solito dsPIC33, per ripulire in real time tutti i dati ed eventualmente inviarli ad un pc tramite telemetria, molto meglio che la memorizzazione su SD perché è possibile correlare in tempo reale i movimenti del quadricottero con i dati dei sensori e le azioni di correzione dell'algoritmo di controllo.