Pendolo inverso Simulazione modello non lineare Controllo in retroazione dello stato e Osservatore dello stato Esercitazioni di Controlli Automatici LS (Prof. C. Melchiorri) 1 Modello del pendolo inverso Si consideri il modello di un pendolo inverso montato su di una base rotante mostrato in Figura 1: θ Pendolo Base Motore CC + Riduttore α Figure 1: Schema e foto del pendolo inverso. Il modello dinamico del pendolo inverso può essere scritto, sfruttando la formulazione di EuleroLagrange, nel seguente modo: M (q)q̈ + C(q̇, q)q̇ + Dq̇ + g(q) = τ − τf (1) dove q = [α θ]T è il vettore delle coordinate generallizate (rispettivamente l’angolo fra la base rotante e il punto riferimento sulla parte fissa e l’angolo del pendolo rispetto alla posizione verticale rivolta verso l’alto), τ e τf sono i vettori delle coppie e degli attriti agenti sui giunti, M (q) è la matrice di inerzia del sistema, C(q̇, q) è la matrice degli effetti centripeti e di Coriolis, D è la matrice degli attriti viscosi e g(q) è il vettore delle coppie dovute agli effetti gravitazionali. In particolare, per questo sistema si ha: I1 + m2 (l12 + l22 sin2 (θ)) −m2 l1 l2 cos(θ) (2) M (q) = −m2 l1 l2 cos(θ) I2 l2 cos(θ)θ̇ l2 cos(θ)α̇ + l1 θ̇ (3) C(q̇, q) = −m2 l2 sin(θ) −l2 cos(θ)α̇ 0 1 Descrizione Costante di coppia del motore Resistenza di armatura Rapporto di riduzione del motore Raggio della base Massa della base Momento d’inerzia della base Coeff. d’attrito viscoso della base Posizione baricentro del pendolo (rispetto al punto di ancoraggio) Massa del pendolo Momento d’inerzia del pendolo Coeff. d’attrito viscoso del pendolo Sensibilità del potenziometro (sensore di posizione della base) Risoluzione dell’encoder (sensore di posizione del pendolo) Simbolo Km Rm Gr l1 m1 I1 dα l2 Valore 0.00767 2.6 60.5 0.2 0.128 0.0044 0.0001 0.43 Unità di misura N m A−1 Ω m2 I2 dθ Ps 0.14 0.019 0.0152 1.637 Kg Kg m2 N m2 s−1 rad V −1 Er 1.534 · 10−3 rad step−1 m Kg Kg m2 N m2 s−1 m Table 1: Parametri del pendolo inverso. D= dα 0 0 dθ , g(q) = 0 −m2 l2 g sin(θ) , τ= τm 0 , τf = 0 0 (4) dove τm è la coppia applicata dal motore elettrico in corrente continua che muove la base. I Parametri del sistema sono riportati in Tab. 1. Notare che viene trascurato l’attrito statico (τf = 0). Data l’entità delle dinamiche meccaniche di questo sistema, viene adottato il modello semplificato del motore elettrico in corrente continua tramite il quale è possibile muovere la base: τm = K 2 G2 Km Gr v − m R α̇ = Kv v − Kα α̇ Rm Rm (5) dove v e la tensione in ingresso al motore (uscita della scheda di acquisizione). Si riscriva l’eq. (1) nella forma1 : q̈ = M (q)−1 [−C(q̇, q)q̇ − Dq̇ − g(q) + τ − τf ] (6) Dalle eq. (2)-(5), assumendo come vettore di stato x = [α θ α̇ θ̇]T e come vettore di ingresso u = [v], è possibile scrivere il modello del sistema nella forma: ẋ = f (x, u) (7) Sul sistema sono disponibili due sensori, un potenziometro ed un encoder ottico, per la misura della posizione della base e del pendolo, rispettivamente α e θ. L’equazione d’uscita del pendolo inverso può quindi essere scritta nel seguente modo: 1/Ps 0 0 0 y1 = y= x (8) 0 1/Er 0 0 y2 Il sistema presenta infiniti punti di equilibrio, di cui stabili quelli corrispondenti a xeqs = [α0 (2n + 1)π 0 0]T (pendolo rivolto verso il basso) e instabili corrispondenti a xeqi = [α0 2nπ 0 0]T (pendolo rivolto verso l’alto), con n intero e α0 una qualsiasi posizione della base. 2 Analisi e sintesi del controllo Obiettivo del controllo è quello di stabilizzare il sistema nell’intorno di un qualsiasi punto di equilibrio instabile corrispondente alla posizione del pendolo rivolta verso l’alto. Si risponda quindi ai seguenti quesiti: 1 Per le proprietà del modello dinamico di Eulero-Lagrange, la matrice M(q) è sempre invertibile. 2 1. Effettuare la simulazione del sistema non lineare; 2. Si linearizzi il sistema nell’intorno di un punto di equilibrio instabile; 3. Verificare la raggiungibilità, l’osservabilità e la scomposizione di Kalman del sistema linearizzato; 4. Si realizzi una retroazione statica dello stato tale che il sistema in retroazione risulti asintoticamente stabile. Si verifichi la risposta del sistema per diverse condizioni iniziali del sistema non lineare; 5. Si realizzi una legge di controllo ottimo a tempo infinito che minimizzi gli scostamenti del pendolo dalla posizione eretta. Si verifichi la risposta del sistema per diverse condizioni iniziali del sistema non lineare; 6. Dal momento che non si possiede una misura di tutto lo stato del sistema, si realizzi un osservatore dello stato del sistema linearizzato e lo si inserisca nello schema di controllo; 7. Si consideri il problema della regolazione della posizione della base mantenendo il pendolo in posizione eretta (inseguimento del setpoint); 8. Si implementi il regolatore progettato in ambiente RTAI e si confronti la risposta del sistema con quella di Matlab. 3 3.1 TRACCIA DI SOLUZIONE Simulazione del sistema non lineare Per la simulazione del sistema non lineare, si utilizza l’ambiente Simulink. Si faccia riferimento allo schema il fig. 2. u 0 ingresso di equilibrio MATLAB Function stato reale dotx modello non lineare del pendolo 1 x xo s Integratore [a0+da 2*n*pi+dteta dota0 dotteta0] [a0 2*n*pi 0 0] Stato iniziale Punto di equilibrio C y uscita stato modello linearizzato Figure 2: Schema Simulink per la simulazione del modello non lineare del pendolo inverso. Il blocco “MATLAB Function” che rappresenta il modello non lineare del pendolo inverso implementa l’eq. (7). I suoi ingressi sono quindi la tensione di alimentazione del motore (ingresso di controllo u = [v]) e lo stato attuale del sistema x. L’uscita è la derivata dello stato ẋ = f (x, u). Il blocco integratore provvede al calcolo della soluzione del sistema. Notare che le condizione iniziali dell’integratore (stato iniziale del sistema x0 ) sono state inserite in un blocco esterno. È quindi necessario, prima di tutto, scrivere il modello dato dalle eq. (5) e (6) nella forma data dall’eq. (7). Per effettuare il controllo sulla base del sistema linearizzato, allo stato del sistema non lineare viene sottratto lo stato nell’intorno del quale il modello è stato linearizzato (che in generale può essere diverso dallo stato iniziale). Questo perchè una volta che il sistema è stato stabilizzato, l’unico punto di equilibrio per il sistema linearizzato sarà lo stato xf = [0 0 0 0]T , ovvero l’origine dello spazio degli stati. È quindi necessario traslare lo stato di equilibrio (o, più in generale, la triettoria di equilibrio) del modello non lineare nell’origine. Data la linearità della funzione di uscita, è possibile applicare la funzione di uscita eq. (8) direttamente anche allo stato del modello linearizzato, ottenendo lo scostamento del segnale di uscita del sistema rispetto al punto di equilibrio considerato. 3 3.2 Linearizzazione del modello dinamico del sistema Si vuole linearizzare il sistema nell’intorno dello stato di equilibrio instabile x0 = [0 0 0 0]T con ingresso di controllo nullo u0 = 0. Prendendo in considerazione l’eq. (7), si determini in modello linearizzato: ∂f (x, u) ∂f (x, u) x + u = Al x + Bl u (9) ẋ = ∂x (x0 ,u0 ) ∂u (x0 ,u0 ) 1/Ps 0 0 0 y = x = Cl x (10) 0 1/Er 0 0 3.3 Raggiugibilità e Osservabilità Per lo studio della raggiugibilità e della osservabilità del sistema linearizzato, si faccia uso delle funzioni matlab ctrb, obsv, mininv, maxinv e kalmcd. Si verifichi se possibile realizzare un osservatore asintotico dello stato utilizzando le misure di uno solo dei due sensori a disposizione. 3.4 Retroazione dello stato Per il progetto della retroazione dello stato, si procede considerando il sistema linearizzato dato dalle matrici Al , Bl , Cl , Dl . La matrice K può quindi essere ricavata con il comando K=-place(Al,Bl,autovalori) (oppure con il comando acker). 3.5 Osservatore dello stato Per il progetto dell’osservatore dello stato per il sistema linearizzato, si procede considerando il sistema duale ATl , ClT , BlT , DlT . A questo punto, il progetto della matrice di retroazione dell’osservatore si riduce al problema di sintesi della matrice di retroazione dello stato del sistema duale. La matrice L può quindi essere ricavata con il comando L=-place(Al’,Cl’,autovalori)’. Gli autovalori assegnati al sistema tramite la legge di controllo ottimo possono essere ricavati tramite il comando matlab eig(Al+Bl*K). 3.6 Inseguimento del setpoint Si consideri il problema di controllo con retroazione dello stato con setpoint non-nullo. Nel caso in esame il sistema ha un solo ingresso e due uscite. Non quindi possibile, in maniera diretta, progettare la matrice di ingresso per il servomeccanismo. È possibile procedere con il progetto della matrice d’ingresso Ki se si considera esclusivamente la relazione fra ingresso di controllo u e posizione della base del pendolo y1 . 3.7 Implementazione del controllore Viene esaminato il problema relativo all’implementazione in ambiente Simulink e RTAI-Linux dell’osservatore e della retroazione dello stato per il pendolo inverso. 3.7.1 Discretizzazione del controllore e dell’osservatore Una volta determinate le matrici di retroazione dello stato e dell’osservatore, si procede alla discretizzazione del sistema linearizzato tramite il comando matlab sysd=c2d(ss(Al,Bl,Cl,Dl),Tc), dove T c è il tempo di campionamento scelto sulla base dell’autovalore maggiore in modulo del sistema. La struttura sysd contiene quindi le matrici del sistema discretizzato Ad=sysd.a, Bd=sysd.b, Cd=sysd.c e Dd=sysd.d. In particolare le matrici Cl e Dl restano invariate mentre cambiano le matrici Al e Bl : e Al T c Z Tc eAl τ Bl dτ Ad = Bd = Cd = Cl Dd = Dl 0 4 Anche la matrice di retroazione dello stato K resta invariata ma cambia la matrice di retroazione dell’osservatore L, che si modifica allo stesso modo della matrice Bl : Kd = Ld = K Z Tc eAl τ L dτ 0 Per la sintesi della matrice Ld con Matlab può essere utilizzato, anche in questo caso, il comando sysd2=c2d(ss(Al,L,Cl,Dl),Tc). La struttura sysd2 contiene quindi la matrice di retroazione dell’osservatore discretizzata Ld=sysd.b. 3.7.2 Condizionamento dei segnali di ingresso ed uscita Allo scopo di riprodurre il più fedelmente possibile la risposta di un sistema di controllo reale utilizzando attraverso la simulazione in ambiente simulink, è necessario tenere esplicitamente in considerazione, nello schema del controllore, della scalatura, limitazione (saturazione) e discretizzazione sia delle variabili di ingresso che di quelle di uscita. Questi (ed altri) effetti, dovuti alla realizzazione pratica dei sistemi di misura e attuazione, vengono comunemente indicati con il termine “condizionamento” dei segnali di ingresso ed uscita. In figura 3 viene riportato lo schema simulink del sistema di controllo del pendolo inverso. In questa figura, i blocchi DAC, ADC ed Encoder effettano il condizionamento dei segnali, mentre il blocco di simulazione del sistema contiene il modello dinamico non lineare tempo continuo del pendolo inverso. Questi blocchi, racchiusi nel rettangolo tratteggiato in figura 3, rappresentano come il sistema viene “visto” dal controllore real-time. Notare che la variabile di controllo viene saturata prima di essere messa in ingresso al sistema e all’osservatore dello stato. Pendolo Inverso In Out Ps posizione base ADC Ki Setpoint 1/Kin In Out Saturation DAC u y modello non lineare del pendolo inverso In Out Er posizione pendolo Encoder Kin u(k) Kd x(k) azione di controllo y(k) Retroazione dello stato Osservatore dello stato tempo discreto Figure 3: Schema di controllo del pendolo inverso. Il sistema si interfaccia con il calcolatore tramite una scheda di acquisizione dati di tipo PCI modello 626 prodotta dalla Sensoray. In particolare, il blocco DAC è caratterizzato da: • risoluzione: 14 bit; • range variabili di uscita: ±10 [V ]; Il blocco ADC ha le seguenti caratteristiche: • risoluzione: 16 bit; • range variabili di uscita: ±5, ± 10 [V ]; Il blocco Encoder ha le seguenti caratteristiche: 5 • lunghezza di parola: 24 bit; • tipo variabile d’uscita: unsigned int; • valore iniziale di default: 0x000000; Il blocco Encoder rappresenta l’encoder incrementale collegato al giunto posto alla base del pendolo e restituisce in uscita un valore intero corrispondente al numero di passi (steps, ovvero frazioni dell’angolo giro) compiuti a partire dalla posizione iniziale. Il valore della variabile d’uscita dell’encoder viene quindi 2π incrementato di uno ad ogni variazione di 4096 [rad] dell’angolo θ e decrementato di uno se la variazione 2π avviene di − 4096 [rad]. Notare che, partendo dal valore d’uscita 0x000000, una variazione negativa dell’angolo θ porta l’uscita dell’encoder al valore massimo 0xFFFFFF (overflow). Nel sistema in esame, si ha Kin = 1 e Kout [0] = 1/P s, Kout [1] = 1/Er. 3.7.3 Simulazione in ambiente Simulink Allo scopo di verificare l’efficacia del sistema di controllo e la risposta del sistema, si esegua la simulazione del pendolo inverso con retroazione dello stato ed osservatore. Si faccia riferimento alla figura 2 per l’implementazione del modello del pendolo e alla figura 3 per lo schema di controllo. 3.7.4 Implementazione del controllore in ambiente RTAI L’algoritmo di controllo realtime, ad ogni istante di campionamento, dovrà calcolare l’innovazione, l’evoluzione dello stato dell’osservatore e l’azione di controllo. Viene riportato di seguito uno schema per l’implementazione del controllo in retrozione e dell’osservatore per il modello linearizzato del pendolo inverso. Si noti la particolare sequenza di operazioni necessarie per le configurazione e la lettura dell’encoder. ... comedi_insn instr; lsampl_t initvalue=10000; /* open comedi device */ cf=comedi_open("/dev/comedi0"); /* impostazione istruzione di configurazione dell’encoder */ instr.insn=INSN_CONFIG; instr.n=1; instr.data=&initvalue; /* valore iniziale del conteggio per evitare l’overflow */ instr.subdev=5; instr.chanspec=CR_PACK(0,0,AREF_OTHER); /* configurazione dell’encoder */ comedi_do_insn(cf,&instr); /* impostazione istruzione di lettura dell’encoder */ instr.insn=INSN_READ; instr.n=1; instr.data=&ai_data; ... /* discrete time controller output, plant input */ double pendolo_ctrl_input[INPUT_DIM]={0.0}; /* plant output y(k) */ double pendolo_ctrl_output[OUTPUT_DIM]={0.0, 0.0}; /* discrete time observer matrices */ 6 static double Ad[STATE_DIM][STATE_DIM]={...}; static double Bd[STATE_DIM][INPUT_DIM]={...}; static double Cd[OUTPUT_DIM][STATE_DIM]={...}; static double Ld[STATE_DIM][OUTPUT_DIM]={...}; static double Kd[INPUT_DIM][STATE_DIM]={...}; static double Ki[INPUT_DIM][OUTPUT_DIM]={...}; ... /* inizializzazione dello stato e del setpoint */ ... while(isrunning){ /* calcolo dell’azione di controllo, da attuare al ciclo successivo */ // u(k) = Kd*x(k) + ki*r(k) /* attesa dell’istante di campionamento */ rt_task_wait_period(); /*********************************/ /* attuazione del controllo u(k) */ /*********************************/ /* scalatura delle variabili di controllo */ // kin[0]=1; // pendolo_ctrl_input[0] = u[0]/kin[0]; /* conversione da grandezza fisica a registro del DAC */ ao_data=comedi_from_phys(pendolo_ctrl_input[0],ao_rangetype,ao_maxdata); /* scrittura sul registro del DAC */ comedi_data_write(cf,ao_subdev,ao_chan,ao_range,ao_aref,ao_data); /* saturazione e discretizzazione delle variabili di controllo */ pendolo_ctrl_input[0]=comedi_to_phys(ao_data,ao_rangetype,ao_maxdata); /* riscalatura delle variabili di controllo */ // kin[0]=1; // u[0] = pendolo_ctrl_input[0]*kin[0]; /**********************************/ /* lettura dell’output y(0)=alpha */ /**********************************/ /* lettura del registro dell’ADC */ comedi_data_read(cf,ai_subdev,ai_chan,ai_range,ai_aref,&ai_data); /* conversione registro ADC a grandezza fisica (tensione del potenziometro) */ pendolo_ctrl_output[0]=comedi_to_phys(ai_data,ai_rangetype,ai_maxdata); /* scalatura della variabile di uscita alpha */ // y[0] = pendolo_ctrl_output[0]/kout[0]; // kout[0]=1/Ps; 7 /**********************************/ /* lettura dell’output y(1)=theta */ /**********************************/ /* lettura registro dell’encoder, il valore viene salvato in ai_data */ comedi_do_insn(cf,&instr); /* conversione registro encoder a grandezza fisica (angolo theta) */ /* NOTARE IL VALORE INIZIALE DELL’ANGOLO (-M_PI) */ // kout[1]=1/Er; pendolo_ctrl_output[1]= -M_PI + (((double)ai_data)-((double)initvalue))/kout[1]; /* calcolo dell’evoluzione libera */ // x(k+1) = Ad*x(k) /* calcolo dell’errore di inseguimento dello stato */ // e(k) = Cd*x(k) + Dd*u(k) - y(k) /* calcolo dell’innovazione */ // x(k+1) += Ld*e(k) /* calcolo dell’evoluzione forzata */ // x(k+1) += Bd*u(k) /* aggiornamento dello stato */ // x(k) = x(k+1) /* calcolo e aggiornamento dello setpoint */ // r(k+1) = ... // r(k) = r(k+1) } ... 3.7.5 Comparazione dei risultati simulativi e sperimentali Viene di seguito riportato il confronto fra la risposta del sistema simulato e del sistema reale. Nello schema utilizzato, il controllore in grado di portare il sistema dallo stato iniziale di equilibrio stabile x0 = [0 − π2 0 0] allo stato instabile x1 = [α1 − π 0 0] (il valore di α1 non è di interesse), e di stabilizzare il sistema nell’intorno dello stato instabile xd = [αd − π 0 0], con αd definibile dall’utente. 8 Real and Simulated Positions 1 0 Position [rad] −1 Arm (Real) Pendulum (Real) Arm (Simulated) Pendulum (Simulated) −2 −3 −4 −5 −6 −7 0 1 2 3 4 5 Time [s] 6 7 8 9 10 Figure 4: Confronto fra le posizioni del sistema reale e di quello simulato. Difference in position 0.2 Arm Pendulum rad 0.1 0 −0.1 −0.2 0 1 2 3 4 5 Time [s] 6 7 8 9 10 Figure 5: Differenza fra le posizione del sistema reale e di quello simulato. Real and Simulated Velocities Pendulum velocity [rad/s] Arm velocity [rad/s] 10 5 0 −5 −10 0 10 Real velocity Simulated velocity 1 2 3 4 5 6 7 8 9 10 5 0 −5 −10 0 Real velocity Simulated velocity 1 2 3 4 5 Time [s] 6 7 8 9 10 Figure 6: Confronto fra le velocità del sistema reale e di quello simulato. 9