aiuto con il PID

Ciao
nella mia applicazione ho un piccolo problema.
Ho degli angoli, che rappresentano la rotazione nello spazio del mezzo(quadricottero).
Ora con un pid dovrei comandare i motori, ma ho qualche dubbio, non avendo mai usato questa tipologia di algoritmi.
Innanzitutto il codice che vorrei usare e' questo Arduino Playground - PIDLibrary
se non erro come input metto l'angolo attuale, come setPoint 0 (angolo=0 vuol dire che il mezzo e' livellato) e basta?
ovviamente questo per ogni motore, pensavo di sommare agli angoli un piccolo numero che rappresenta quanto aumentare la spinta dei motori, ma non credo funzioni, forse conviene aumentare di un poco il valore in output ai motori di un valore fisso?

help :slight_smile:

Premessa:

  1. Ho l'influenza e c'è qualcuno che suona il tamburo nella mia testa.
  2. Con Pid_Beta6 ho avuto a che fare di recente quello che sono riuscito a fare non è molto il risultato lo vedi come codice nel playground http://www.arduino.cc/playground/Italiano/posizionatore

ATTENZIONE che ho modificato la libreria per fare i calcoli ogni tot us e non ms, quindi
myPID.SetSampleTime(500); 500 sono us.

Ho degli angoli, che rappresentano la rotazione nello spazio del mezzo(quadricottero).

Ne ho visti, ma sono a digiuno quindi:
Sono quattro motori?
Ogni motore e indipendente dall'altro?

Ora con un pid dovrei comandare i motori, ma ho qualche dubbio, non avendo mai usato questa tipologia di algoritmi.

Ti posso spiegare terra terra, ci provo:
Il Setpoint è il valore desiderato compreso nell'intervallo dei valori specificato con "myPID.SetOutputLimits(10, 255);"

Input è compreso tra 0 e 1023 di default ma lo puoi cambiare.

I parametri del PID:
P guadagno proporzionale.
I guadagno integrale.
D guadagno Derivata sul tempo.
Consigliano tutti di partire con I e D = 0, aumentando P fino a entrare in oscillazione.

se non erro come input metto l'angolo attuale, come setPoint 0 (angolo=0 vuol dire che il mezzo e' livellato) e basta?

Input negli esempi lo prendo da un valore letto con analogRead().

Io l'ho usato per salvare la velocità del encoder.

Nota all'inizio il P lo mettevo negativo poi mi sono reso conto che va positivo se un'incremento di Input ha come risultante un decremento di Output.
Cioè se hai Input=0° Output=512, e Input diventa +5 Output si riduce fino a fare in modo che Input sia 0°.

Però non so se Input accetta valori negativi per indicare -5°.

Ok mi fermo qui non so più se quello che dico a un senso ciao.

dunque, i 4 motori sono indipendenti.
quindi per stabilizzarmi lungo x e y bastano gli angoli x e y, però sommo pure l'angolo di rotazione in z ai motori, perchè 2 sono roteanti e 2 controroteanti (così il mezzo può girarsi sul posto, o meglio non iniziare a girare su se stesso come una trottola :D)...
piccola foto per intenderci(non è il mio, il mio è fatto in casa e moolto più grosso):

configurazione dei motori:

  1
2  3
  4

1 (roteante) si becca x+z
2 (controroteante) y-z
3 (controroteante) -y-z
4 (roteante) -x+z
gli angoli sono in radianti da -PI a +PI (pigreco), quindi facili da trasformare nel range 1-1023

quindi io do come input gli angoli e come set point la potenza del motore desiderata in base all'input dell'utente?

dai su che finita la parte PID mi manca solo da montare l'elettronica e poi potrete gustare qualche video degli schianti :slight_smile:

quindi per stabilizzarmi lungo x e y bastano gli angoli x e y, però sommo pure l'angolo di rotazione in z ai motori, perchè 2 sono roteanti e 2 controroteanti (così il mezzo può girarsi sul posto, o meglio non iniziare a girare su se stesso come una trottola Cheesy)...

Dunque, vediamo se ho capito, guardando la foto posso avere rotazione sull'asse Z immaginando le coordinate in 3d. Certo se i motori girano tutti in un senso c'è avvitamento, penso che ci sia un sensore giroscopico a bordo, però non so che dati fornisce.

Hai visto su youtube come fanno a sperimentare il PID per il quadcotter, hanno un solo asse, l'altro asse deve produrre un flusso portante uguale e contrario, per evitare avvitamento e spostamento, però deve essere possibile da parte dell'utente destabilizzare il controllore per fargli compiere rotazione su Z e spostamento in 3D.

Il Setpoint dovrebbe essere l'input dell'utente per dosare la potenza, Output è il valore del duty cycle, però tu ha di bisogno di 4 valori in output o no?.

Metti qualche foto o link video così vediamo sta bestia.

Ciao.

interessa anche a me questo argomento .. Sto anche io costruendo un quadricottero :slight_smile:

se non hai voglia di sbattere la testa ti consiglio di usare le varie implementazioni già pronte.
Io ho usato un mix di sensori (gyro analogici e acc nunchuk) non supportata, e ho voluto sperimentare la "neonata" DCM anzichè il kallmann filter