scieee AI-readable full text Open interactive document viewer

Simulación de un péndulo invertido

Beltrán Alonso, José Luis

Full text

Simulaci´on de un p´endulo invertido Proyecto fin de carrera Titulaci´on: Ingeniero T´ecnico en Inform´atica de Sistemas Autor: Jose Luis Beltr´an Alonso Director: Pascual P´erez Blasco 6 de Diciembre de 2010 2 ´ Indice general 1. Introducci´on 7 1.1. Descripci´on del p´endulo invertido . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. Objetivos ........................................ 8 2. Modelado Matem´atico del P´endulo 9 2.1. An´alisis de las fuerzas y sistema de ecuaciones . . . . . . . . . . . . . . . . . . . . 9 2.2. Funci´on de transferencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3. Ecuaci´ondeestado................................... 13 2.4. Respuestaalazoabierto................................ 16 2.4.1. Soluci´on: Mediante funci´on de transferencia . . . . . . . . . . . . . . . . . 16 2.4.2. Soluci´on: Mediante espacio de estados . . . . . . . . . . . . . . . . . . . . 18 3. Estabilizaci´on del p´endulo 21 3.1. ControladorPID .................................... 21 3.1.1. Estructura ................................... 21 3.1.2. Dise˜noPID................................... 23 3.1.3. Ejemplo p´endulo invertido. . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2. ReguladorLQR..................................... 32 3.2.1. Basete´orica................................... 32 3.2.2. Dise˜no en espacio de estados . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3. Observadores ...................................... 38 3.3.1. Observador a lazo abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3.2. Observador de orden reducido . . . . . . . . . . . . . . . . . . . . . . . . . 39 3 4. Implementaci´on 41 4.1. P´endulo invertido en Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.2. Conversi´on ’Matlab to Java’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2.1. Funci´onc2d................................... 45 4.2.2. Funci´onexpm.................................. 46 4.2.3. Funci´ondlqr .................................. 46 4.3. Aplicaci´onJava..................................... 47 4.3.1. Dise˜no...................................... 47 4.3.2. C´odigo...................................... 51 5. Librer´ıas 53 5.1. Librer´ıaJama...................................... 53 5.2. Librer´ıaEjml ...................................... 54 5.3. Librer´ıaJMathLib ................................... 55 Ap´endices 58 A. Pendulo.m 61 B. Simulaci´on alternativa.m 67 C. C´odigo fuente applet 73 D. Regulador 87 4 ´ Indice de figuras 1.1. Esquema p´endulo invertido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1. Diagramas de cuerpo libre del sistema. . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2. Respuesta F.D.T en lazo abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3. Respuesta mediante espacio de estados . . . . . . . . . . . . . . . . . . . . . . . . 20 3.1. Diagramaenbloques.................................. 22 3.2. ReguladorP....................................... 23 3.3. PID: Respuesta ante impulso de entrada . . . . . . . . . . . . . . . . . . . . . . . 29 3.4. PID: Respuesta ante incremento proporcional . . . . . . . . . . . . . . . . . . . . 29 3.5. PID: Respuesta ante incremento derivativo . . . . . . . . . . . . . . . . . . . . . 30 3.6. PID: Respuesta carrito ante impulso . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.7. ReguladorLQR..................................... 32 3.8. Respuesta controlador LQR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.9. Respuesta controlador LQR ante incremento de x,y . . . . . . . . . . . . . . . . . 37 3.10. Observador a lazo abierto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.1. Representaci´on p´endulo invertido en Matlab . . . . . . . . . . . . . . . . . . . . . 42 4.2. Representaci´on alternativa en Matlab . . . . . . . . . . . . . . . . . . . . . . . . 43 4.3. Fuerzaaplicadaalcarro ................................ 43 4.4. ´ Angulo y posici´on del carro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.5. Par´ametrosp´endulo .................................. 47 4.6. Panelarranquep´endulo ................................ 48 4.7. Panel control Autom´atico/Manual . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.8. Posici´on y ´angulo del p´endulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5 4.9. Paneldedibujo..................................... 49 4.10. Interfaz applet ..................................... 50 6 Cap´ıtulo 1 Introducci´on El p´endulo invertido es conocido por ser uno de los problemas m´as importantes y cl´asicos de la teor´ıa de control. Se trata de un control inestable y no lineal. A menudo, es utilizado como ejemplo acad´emico, principalmente por ser un sistema de control m´as accesible, y por otro lado, permite mostrar las principales diferencias de control de bucle abierto y de su estabilizaci´on a bucle cerrado. Pese a existir diferentes t´ecnicas a la hora de dise˜nar el regulador ´optimo capaz de estabilizar el p´endulo, no todas representan la mejor opci´on. En la presente memoria se analizar´an alguno de los m´etodos m´as conocidos. 1.1. Descripci´on del p´endulo invertido El p´endulo invertido es un servo mecanismo que consta de un carro en el cual est´a montado un p´endulo que puede girar libremente. El carro est´a controlado por un servomotor y su principal funci´on es la de aplicar fuerzas al p´endulo. Como la finalidad de este proyecto es dar la posibilidad de ejecutar el algoritmo de control en un sistema real (como, por ejemplo, un Segway), implica que el carro puede desplazarse sin limitaci´on alguna, es decir, que si estuviese montado sobre un riel, ´este no tendr´ıa topes. Si se considera al p´endulo separado del carro, ´este tiene dos puntos de equilibrio: uno estable, abajo; y otro inestable, arriba. El objetivo del control es cambiar la din´amica del sistema para que en la posici´on vertical, arriba, se tenga un punto de equilibrio estable. En otras palabras, la idea es encontrar la fuerza que ha de aplicarse al carro para que el p´endulo no se caiga, incluso 7 si se le perturba con un empuj´on tipo escalera o impulso. Figura 1.1: Esquema p´endulo invertido 1.2. Objetivos El proyecto que se presenta a continuaci´on permite la simulaci´on del comportamiento f´ısico de un sistema din´amico que evoluciona con el tiempo. El objetivo es dise˜nar un sistema de control ´optimo que permita estabilizar un p´endulo invertido asi como el desarrollo de una aplicaci´on capaz de simularlo. Los sistemas de control requieren del hardware adecuado para obtener los datos de forma precisa. Normalmente, se consigue con un microcontrolador o un DSP, pero en este caso, se har´a mediante una simulaci´on. La aplicaci´on ha sido realizada en un Applet de Java lo que facilita su ejecuci´on desde cualquier navegador web. Sin embargo, para el dise˜no del regulador se ha utilizado la herramienta Matlab, principalmente, por su f´acil manejo en el c´aculo de matrices. Respecto al algoritmo de control, el objetivo es estabilizar el p´endulo partiendo ´este inicialmente en la parte superior, por lo que no se contempla el algoritmo encargado de levantar el p´endulo y lograr estabilizarlo en su posici´on vertical. 8 Cap´ıtulo 2 Modelado Matem´atico del P´endulo El objetivo de la fase de modelado, es encontrar una expresi´on matem´atica que represente el comportamiento f´ısico del sistema. Para modelar el sistema existen dos estrategias. La primera es tratar al sistema como un “caja negra” y realizar sobre ´el un conjunto de acciones (se˜nales de entrada) observando c´omo se comporta (estudiar las salidas) deduciendo un modelo matem´atico para ´este. Un ejemplo ser´ıa la t´ecnica de Ziegler-Nichols. La segunda consiste en estudiar los procesos f´ısicos que tienen lugar en el sistema para deducir su ley de comportamiento. El resultado que se pretende es la identificaci´on del sistema a trav´es de su funci´on de transferencia. 2.1. An´alisis de las fuerzas y sistema de ecuaciones La mayor parte del ´exito a la hora de dise˜nar un buen regulador pasa por tener un modelo del sistema correcto. Hallarlo es una tarea complicada, y por ello, a menudo es necesario recurrir a la sencillez. En el caso del p´endulo, se consigue con el an´alisis por separado de cada uno de los cuerpos. 9 2.4. Respuesta a lazo abierto Una vez obtenidos los modelos matem´aticos y antes de comenzar con el dise˜no de un regulador, es necesario comprobar si el sistema es estable a lazo abierto. Para ello, se har´a una simulaci´on con Matlab donde se asumir´an los siguientes valores que se mantendr´an durante todos los ejercicios pr´acticos: M: Masa del carro = 0.5 Kg m: Masa del p´endulo = 0.5 Kg b: Fricci´on del carro = 0.1 N/m/seg l: Longitud p´endulo = 0.3 m I: Inercia del p´endulo = 0.006 Kg*m2 F: Fuerza aplicada al carro x: Coordenadas de posici´on del carro Θ: ´ Angulo del p´endulo Dado que se han obtenido dos modelos matem´aticos diferentes por m´etodos distintos, el siguiente paso ser´a hacer una simulaci´on para cada uno de ellos. Cada simulaci´on har´a uso de unos requerimientos de dise˜no diferentes debido al tipo de variables con el que trabaja. 2.4.1. Soluci´on: Mediante funci´on de transferencia En el caso de la funci´on de transferencia solo se va a tratar con una sistema de ´unica salida (el ´angulo del p´endulo), y por lo tanto, los requerimientos de dise˜no son: - Tiempo de establecimiento menor a 5 segundos. -´ Angulo del p´endulo siempre menor que 0.05 radianes de la vertical. El numerador y denominador de la funci´on de transferencia se almacenaran en vectores de tal forma que el c´odigo quedar´ıa as´ı: 1M = 0.5; 2m = 0.2; 3b = 0.1; 4i = 0.006; 16 5g = 9.8; 6l = 0.3; 7q = (M+m)*(i+m*l^2) -(m*l)^2; 8num = [m*l/q 0] 9den = [1 b*(i+m*l^2)/q -(M+m)*m*g*l/q -b*m*g*l/q] Donde su salida deber´ıa ser: num = 4.5455 0 den = 1.0000 0.1818 -31.1818 -4.4545 Para observar la respuesta del sistema a una fuerza impulsiva de 1N aplicada al carro, se introducir´a un impulso a la entrada mediante la funci´on impulse. Para ello es necesario a˜nadir el siguiente c´odigo: 11 t =0:0.01:5; 12 impulse (num ,den ,t) 13 axis ([0 1 0 60]) La funci´on axis se encarga de dibujar los ejes que aparecer´an en la gr´afica. En este caso, el eje X representa el tiempo en segundos y el vector Y la amplitud. Como resultado de la simulaci´on se obtiene la gr´afica donde puede observarse como la respuesta es totalmente insatisfactoria. Como era de esperar no es estable a lazo abierto y por lo tanto ser´a necesario dise˜nar un regulador capaz de estabilizar el p´endulo (ver cap´ıtulo 3). 17 Figura 2.2: Respuesta F.D.T en lazo abierto 2.4.2. Soluci´on: Mediante espacio de estados En este caso los requerimientos de dise˜no son distintos pues se trata de un sistema multisalida y el objetivo ya no es solo controlar el ´angulo del p´endulo sino tambi´en la posici´on del carro. Por lo tanto, los requerimientos de dise˜no a tener en cuenta son: - Tiempo de establecimiento de x y θmenor a 5 segundos. - Tiempo de subida para x menor que 0.5 segundos. - Sobrepico de θmenor que 20 grados. En primer lugar hay que calcular las matrices A,B,C y D a partir de la expresi´on obtenida en 2.31 1M = 0.5; 2m = 0.2; 3b = 0.1; 4i = 0.006; 5g = 9.8; 6l = 0.3; 7 8p = i*(M+m)+M*m*l^2; %denominador para las matrices A y B 18 9A = [0 1 0 0; 10 0 -(i+m*l ^2)*b/p (m^2* g*l^2) /p 0; 11 0 0 0 1; 12 0 -(m*l*b)/p m*g*l*(M+m)/p 0] 13 B = [0; 14 (i+m*l^2)/p; 15 0; 16 m*l/p] 17 C = [1 0 0 0; 18 0 0 1 0] 19 D = [0; 0] Como resultado se obtiene: A = 0 1.0000 0 0 0 -0.1818 2.6727 0 0 0 0 1.0000 0 -0.4545 31.1818 0 B = 0 1.8182 0 4.5455 C = 1 0 0 0 0 0 1 0 D = 0 0 Al igual que en el caso anterior hay que introducir una entrada que en este caso ser´a un escal´on de 0,2 metros. A˜nadiendo el siguiente c´odigo: 21 T=0:0.05:10; 22 U =0.2* ones ( size (T)); 23 [Y,X]= lsim(A ,B,C,D,U ,T); 24 plot(T,Y) 25 axis ([0 2 0 100]) 19 Se observa la salida donde la l´ınea azul representa la posici´on del carro y la l´ınea verde el ´angulo del p´endulo. Al igual que en la figura anterior, para mejorar la din´amica del sistema es necesario incluir alguna clase de control. Este regulador se dise˜nar´a en el apartado 3.2. Figura 2.3: Respuesta mediante espacio de estados 20 Cap´ıtulo 3 Estabilizaci´on del p´endulo Llegados a este punto se ha comprobado que la din´amica del sistema por si sola no es capaz de mantener el p´endulo estable. Aqu´ı nace la necesidad de incluir un regulador capaz de “decidir” en cada momento cu´al es la acci´on a realizar sobre el carro para que el p´endulo no se desestabilice. Existen distintos m´etodos para dise˜nar un regulador. En este cap´ıtulo se abordar´a concretamente el dise˜no en espacio de estados mediante la creaci´on de un regulador LQR. Tambi´en se mostrar´a otras tres posibles soluciones al problema del p´endulo invertido, mediante el m´etodo del Lugar de las Ra´ıces, haciendo uso de un control PID, y con el m´etodo de respuesta en frecuencia. 3.1. Controlador PID Los controladores PID han logrado colocarse en un sector importante en la industria pues han demostrado ser muy robusto para muchas de sus aplicaciones. El objetivo de este apartado es lograr dise˜nar un PID capaz de estabilizar el p´endulo invertido y analizar posteriormente si el controlador dise˜nado ser´a el m´as adecuado para el sistema. 3.1.1. Estructura La estructura de un controlador PID es simple pero en ocasiones su sencillez puede ser tambi´en su debilidad. Considerando un lazo de control de una entrada y una salida (SISO) de un grado de libertado obtenemos el siguiente diagrama: 21 Figura 3.1: Diagrama en bloques A diferencia del cap´ıtulo anterior, ahora se est´a trabajando con sistemas a lazo cerrado, es decir, con realimentaci´on. Donde restando el valor de la referencia a la salida anterior se obtiene el error que el PID ir´a tratando hasta que sea nulo. Los miembros de la familia de controladores PID, incluyen tres acciones: proporcional (P), integral (I) y derivativa (D). Estos controladores son los denominados P, I, PI, PD y PID. P: Acci´on de control proporcional da una salida del controlador que es proporcional al error, es decir: u(t) = KP e(t). Un controlador proporcional puede controlar cualquier planta estable, pero posee desempe˜no limitado y error en r´egimen permanente. I: Acci´on de control integral da una salida del controlador que es proporcional al error acumulado, lo que implica que es un modo de controlar lento. u(t) = KiZt 0 e(τ)dτ La se˜nal de control u(t) tiene un valor diferente de cero cuando la se˜nal de error e(t) es cero. Por lo que se concluye que dada una referencia constante, o perturbaciones, el error en r´egimen permanente es cero. I: Acci´on de control proporcional-integral se define mediante u(t) = Kpe(t) + Kp TiZt 0 e(τ)dτ donde Ti se denomina tiempo integral y es quien ajusta la acci´on integral. Con un control proporcional, es necesario que exista error para tener una acci´on de control distinta de cero. Con acci´on integral, un error peque˜no positivo siempre nos dar´a una acci´on de control creciente, y si fuera negativo la se˜nal de control ser´a decreciente. Este razonamiento sencillo muestra que el error en r´egimen permanente ser´a siempre cero. 22 I: Acci´on de control proporcional-derivativa se define mediante: u(t) = Kpe(t) + KpTd de(t) dt donde Td es una constante denominada tiempo derivativo. Esta acci´on tiene car´acter de previsi´on, lo que hace m´as r´apida la acci´on de control, aunque tiene la desventaja importante que amplifica las se˜nales de ruido y puede provocar saturaci´on en el actuador. La acci´on de control derivativa nunca se utiliza por s´ı sola, debido a que s´olo es eficaz durante per´ıodos transitorios. PID: Acci´on de control proporcional-integral-derivativa, esta acci´on combinada re´une las ventajas de cada una de las tres acciones de control individuales. La ecuaci´on de un controlador con esta acci´on combinada se obtiene mediante: u(t) = Kpe(t) + Kp TdZt 0 e(τ)d(τ) + KpTd de(t) dt CP ID(s) = kp1 + 1 Tis+Tds 3.1.2. Dise˜no PID El objetivo de este apartado es calcular manualmente la funci´on de transferencia que represente el regulador ´optimo. Normalmente, el procedimiento v´alido a la hora de dise˜nar un PID es comenzar utilizando s´olo el control proporcional. De forma que el diagrama de bloques ser´ıa: Figura 3.2: Regulador P 23 La ecuaci´on caracter´ıstica del bucle cerrado viene dada por: M(z) = KuG(z) 1 + KuG(z)(3.1) El denominador aparece sumado ya que la realimentaci´on es negativa, en caso de ser positiva habr´ıa que sustituirlo por 1 - Ku G(z). Para entender mejor la teor´ıa, a continuaci´on, se detalla un ejemplo manual sencillo. En el caso del p´endulo invertido se har´a uso de la herramienta Matlab tal y como se detalla en el apartado 3.1.3. La forma de dise˜nar este PID es haciendo uso del m´etodo de ajuste de Nichols-Ziegler. B´asicamente consiste en lograr unos valores para la I (integral) y D (derivados) de modo que la ganancia sea cero. La funci´on de transferencia del regulador tiene la siguiente estructura: Gr(z) = a0z2+a1z+a2 z(z−1) (3.2) ao=kc1 + Td T;a1=Kc−1 + T Ti−2Td T;a2=kc Td T(3.3) Para cada tipo de controlador se sigue los siguientes par´ametros: - Controlador P: Kc=0.5Ku - Controlador PI: Kc=0.45KuTi=Tu/1,2 - Controlador PID: Kc=0.6KuTi=Tu/2Td=Tu/8 Donde, Tu=2π Wu Wu=1 Tarctg β α 24 Para este ejemplo, se va a asumir que se tiene la siguiente funci´on de transferencia: G(z) = 1 z2−0,87 (3.4) •Paso 1 Calcular Ku Conociendo la ecuaci´on caracter´ıstica en bucle cerrado se puede igualar a cero el denominador para despejar Ku: 1 + KuG(z) = 0 (3.5) 1 + Ku 1 z2−0,87 = 0 (3.6) El siguiente paso ser´a resolver la ecuaci´on de segundo grado manteniendo la inc´ognita Ku y forzando a que el m´odulo de los polos sea 1. z=0,8±p0,82−4Ku 2(3.7) |z|=1=v u u t0,8 22 + p4Ku −0,82 2!(3.8) 1=0,42+4Ku −0,82 4(3.9) Finalmente, despejando se obtiene que Ku=1 •Paso 2. Obtener polos para Ku Una vez obtenida Ku ya se puede sustituir en la ecuaci´on de segundo grado (3.7): z=0,8±p0,82−4 2=0,8±√0,64 −4 2=0,8±1,83j 2= 0,4±0,916j(3.10) 25 3.2. Regulador LQR La ventaja de tener el sistema representado en el espacio de estados es que el dise˜no de un controlador LQR resulta m´as sencillo. La idea es establecer una retroalimentaci´on completa mediante una combinaci´on lineal de las variables de estado. A pesar de ser lo ideal, la realidad es que el estado que se mide no es completo, por lo que ser´ıa conveniente utilizar un observador de orden reducido para estimar parte del estado. En este caso, se asume que todos los estados son medibles. El resultado final del algoritmo de control ser´ıa el siguiente: Figura 3.7: Regulador LQR 3.2.1. Base te´orica En la figura 3.7 se puede ver un esquema del algoritmo de control. K es la matriz que retroalimenta el estado para obtener la se˜nal de control, es decir: u(k)= -Kx(k). El siguiente paso en el proceso de dise˜no es encontrar el vector K que determina la ley de control para la realimentaci´on. Esto puede hacerse de varias formas. La primera opci´on es asignar arbitrariamente el patr´on de polos que se desee que tenga el sistema en lazo cerrado. Y la otra opci´on es hacer uso de un control ´optimo variable en el tiempo. En este caso la opci´on elegida es un control ´optimo LQR. Se trata de minimizar la funci´on: J= N X k=0 XT n(k)QXn(k) + uT(k)Ru(k)(3.17) 32 J es una funci´on de costo que generalmente est´a asociada con la energ´ıa del sistema. Se trata de un control ´optimo en el sentido de que busca minimizar la energ´ıa. La expresi´on XT n(k)QXn(k) representa la energ´ıa que aporta cada estado, Qes una matriz no negativa definida (una posibilidad es una matriz diagonal, cuyos elementos sean positivos). A trav´es de Qse puede elegir el peso que tiene cada estado en la funci´on J. Se puede conceptualizar XT n(k)QXn(k), como una x2(la energ´ıa normalizada) en un sistema con una sola variable. Como en este caso u(k) contiene un s´olo elemento, R≥0 es un elemento que indica el peso que se le quiere dar a la energ´ıa asociada con la se˜nal de control. La ecuaci´on 3.13 est´a sujeta a la restricci´on impuesta por el sistema (ver funcion 2.31). Xn(k+ 1) = AdXn(k) + Bdu(k) (3.18) Resolver estas ecuaciones requiere de la utilizaci´on de m´etodos num´ericos. Dado que el resultado es dif´ıcil de obtener, solo mencionar que la soluci´on resulta de una ley de control variable en tiempo: u(k) = −K(k)Xn(k) Para sistemas con coeficientes constantes, K(k) permanece fija durante un periodo de tiempo y luego decae a cero. Si se hace N→ ∞ en 3.13 entonces la ganancia del controlador permanece fija todo el tiempo: K(k) = K El valor exacto de J no es relevante, solo se pretende encontrar la K que asegure que sea m´ınimo. Lo importante es el valor relativo que tienen los elementos de Q y R entre s´ı. Dichos par´ametros ser´an los encargados de balancear la importancia relativa de la entrada y los estados en la funci´on de costo que se esta tratando de optimizar. El caso m´as simple es considerar R=1 y proponer Q a partir de ah´ı. 33 3.2.2. Dise˜no en espacio de estados Una vez analizada la parte te´orica ya se puede completar el regulador al que se hac´ıa referencia en el apartado 2.4.2. En dicho apartado se tomaban los siguientes criterios de dise˜no: - Tiempo de establecimiento de x y theta menor que 5 segundos. - Tiempo de Subida para x menor que 0.5 segundos. - Sobrepico de theta menor que 20 grados (0.35 radianes). A los cuales adem´as se incluye un cuarto criterio, un error estacionario entre el 2 %. Las caracter´ısticas del p´endulo siguen siendo las mismas: 1M = 0.5; 2m = 0.2; 3b = 0.1; 4i = 0.006; 5g = 9.8; 6l = 0.3; Echando un vistazo a la simulaci´on se determinaron que las ecuaciones de estado para este problema son:         ˙x ¨x ˙ Φ ¨ Φ         =         0 1 0 0 0−0,1818 2,6727 0 0 0 0 1 0−0,4545 31,1818 0                 ˙x ¨x ˙ Φ ¨ Φ         +         0 1,8182 0 4,5455         (3.19) y=  1 0 0 0 0 0 1 0           ˙x ¨x ˙ Φ ¨ Φ         +  0 0 u 34 Para la obtenci´on del regulador se va a utilizar la funci´on “lqr” que dar´a el controlador ´optimo. Esta funci´on permite elegir dos par´ametros, R y Q, donde, como ya se dijo anteriormente, el caso m´as simple es considerar R=1, y Q, por ejemplo, valdr´a Q=C’*C. El m´etodo LQR, b´asicamente permite el control de ambas salidas. Para obtener una respuesta deseable, el controlador puede sintonizarse cambiando los elementos no nulos en la matriz Q. Para obtener la matriz Q es suficiente con introducir el comando C’*C Q = 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 El elemento en la posici´on 1,1 se usar´a para la posici´on del carro y el elemento en la posici´on 3,3 para el ´angulo del p´endulo. El valor de la entrada R permanecer´a en 1. Ahora que se conoce la matriz Q ya se puede calcular el valor de K y mostrar gr´aficamente el resultado. 1x=1; 2y=1; 3Q=[x 0 0 0; 40 0 0 0; 50 0 y 0; 60 0 0 0]; 7R = 1; 8K = lqr(A,B,Q,R) 9Ac = [(A-B*K)]; 10 Bc = [B]; 11 Cc = [C]; 12 Dc = [D]; 13 14 T =0:0.01:5; 15 U =0.2* ones ( size (T)); 16 [Y,X]= lsim(Ac ,Bc ,Cc ,Dc ,U,T); 17 plot(T,Y) 18 legend (’Carrito ’,’P´endulo ’) 35 K = -1.0000 -1.6567 18.6854 3.4594 Figura 3.8: Respuesta controlador LQR La curva en verde representa el ´angulo del p´endulo, en radianes y la curva azul representa la posici´on del carro en metros. Como se puede ver, este gr´afico no es satisfactorio. Los sobrepicos del p´endulo y del carro parecen estar bien, pero debe mejorarse sus tiempos de asentamiento, y debe bajarse el tiempo de subida del carro. Tambi´en puede observarse que el carrito no se halla cerca de la ubicaci´on deseada sino que de hecho se ha movido en la direcci´on contraria. Este error ser´a tratado en la secci´on siguiente, en este momento hay que resolver los tiempos de subida y de establecimiento. Para ello hay que variar los valores de las variables x e y para modificar as´ı la matriz Q. Por ejemplo, incrementando la variable x, se consigue que los tiempos de establecimiento disminuyan, por otro lado, incrementando ’y’ se reduce el movimiento angular del p´endulo. 36 Para valores x=5000; y=100 se obtiene la siguiente respuesta: K = -70.7107 -37.8345 105.5298 20.9238 Figura 3.9: Respuesta controlador LQR ante incremento de x,y Como se puede ver si se sigue incrementando x e y, se podr´ıa mejorar aun m´as la respuesta pero tambi´en ser´ıan mayores los esfuerzos de control usados. La respuesta del sistema tiene un tiempo de establecimiento por debajo de los 2 segundos. Llegados a este punto se ha cumplido el objetivo de dise˜nar un regulador capaz de estabilizar tanto el ´angulo del p´endulo como la posici´on del carro. 37 3.3. Observadores En el control con realimentaci´on de estados se asum´ıa la disponibilidad de las variables de estado. En la pr´actica este caso no siempre es posible, ya sea porque ciertos estados no son medibles, bien porque es muy dif´ıcil o muy caro medirlos. Para implementar una realimentaci´on completa de estados, entonces, es necesario a˜nadir un dispositivo din´amico, llamado observador o estimador de estados, cuya salida sea una estimaci´on del vector de estados. En esta secci´on se introduce observadores de orden completo, donde el observador tiene el mismo orden que la planta,es decir, se estima todo el vector de estados. Se considera entonces el sistema: ˙x(t) = Ax(t) + Bu(t) y(t) = Cx(t) donde A,B y C son conocidas, y la entrada u(t) y la salida y(t) son medibles, aunque no el estado x(t). El problema es estimar x(t) de esta informaci´on. Para ello hay dos soluciones posibles: - Observador a lazo abierto. - Observador de orden reducido. 3.3.1. Observador a lazo abierto Conociendo A y B, es posible duplicar la ecuaci´on de estados original construyendo el sistema: ˆx(t)=Aˆx(t)+Bu(t) Esta duplicaci´on es un observador a lazo abierto, donde si se tuvieran las mismas condiciones inciales, entonces para toda entrada u(t) se tiene que ˆx(t)=x(t), ∀T≥0. B´asicamente si el sistema es observable se puede utilizar un observador en lazo abierto para estimar el vector de estados. Sin embargo, el observador en lazo abierto tiene la desventaja de tener que calcular el estado inicial cada vez que se utilice el estimador. 38 Figura 3.10: Observador a lazo abierto 3.3.2. Observador de orden reducido Si el par (A,C) es observable, usando la matriz no singular: En estas coordenadas la salida queda como el primer estado, y as´ı, no es necesario construir un observador para estimar todo el estado, sino solamente los n-1 restantes. Este observador es de orden reducido. 39 40 Cap´ıtulo 4 Implementaci´on La aplicaci´on que se presenta en este cap´ıtulo permite la simulaci´on del comportamiento f´ısico de un sistema din´amico, sistema que evoluciona con el tiempo. Dicha aplicaci´on ha sido desarrollada en forma de applet Java utilizando la programaci´on orientada a objetos. Para ello, se han utilizado tanto los entornos de desarollo integrado (IDE) de NetBeans, como Eclipse, ambos proyectos de c´odigo abierto fundado por Sun MicroSystems. Como producto final, el applet tiene el objetivo de permitir estudiar el comportamiento del p´endulo invertido de un modo visual, permitiendo al usuario interactuar sobre ´el en tiempo real. Gracias a la portabilidad que Java ofrece, es posible integrar dicho applet a una p´agina Web y visualizarlo desde cualquier navegador compatible con java (Internet Explorer, Mozilla Firefox, Google Chrome, etc). 4.1. P´endulo invertido en Matlab En los cap´ıtulos anteriores, se ha estudiado como obtener el modelo del p´endulo invertido as´ı como el controlador capaz de estabilizarlo. La herramienta que se utiliz´o entonces para ir realizando las pruebas era Matlab. El motivo de utilizar ´esta herramienta y no otra, es b´asicamente, por las altas prestaciones para el c´alculo num´erico y la facilidad que Matlab ofrece a la hora de trabajar con matrices. Por este motivo, una vez terminado todo el proceso de dise˜no, el resultado obtenido se ha almacenado en un fichero ’m’ al que se le ha llamado “pendulo.m” (v´ease Ap´endice A). 41 Panel Iniciar/Detener Sirve para iniciar o detener la simulaci´on del p´endulo. Para introducir nuevos valores en el panel de “Par´ametros actuales”, es necesario detener la simulaci´on e iniciarla de nuevo para que ´estos tengan efecto. Figura 4.6: Panel arranque p´endulo Panel control autom´atico/manual Formado por dos checkbox donde solo puede estar activo uno al mismo tiempo, su funcionalidad consiste en decidir si el p´endulo se ejecuta en modo autom´atico o manual. En modo autom´atico, el p´endulo se ejecuta con los par´ametros del panel “Par´ametros actuales”, en modo manual, se controla mediante la barra de scroll. Inicialmente el p´endulo aparece estabilizado formando un ´angulo de 90orespecto al carro. Figura 4.7: Panel control Autom´atico/Manual 48 Estado p´endulo Consta de dos JTextField que muestran el valor de la posici´on y ´angulo en cada instante. Figura 4.8: Posici´on y ´angulo del p´endulo Panel de dibujo Fijado en la parte superior del applet es la zona donde aparece representado el p´endulo. Est´a compuesto por un JPanel de fondo blanco. La funci´on “paint(Graphics g)”, dibuja 3 figuras (cuadrado, l´ınea y c´ırculo) con la siguiente uni´on: g.fillRect(xx, 250, 70, 30); g.fillOval((375+Math.sin(radianes)*150),(250-Math.cos(radianes)*150), 20, 20); g.drawLine((385+Math.sin(radianes)*150),100,xx+35,250); Figura 4.9: Panel de dibujo 49 Interaz del applet La vista completa de la interfaz queda de la siguiente forma: Figura 4.10: Interfaz applet 50 4.3.2. C´odigo El applet se ha creado en un fichero de tipo “Visual Class” llamado “simulador.java”que permite el dise˜no de la interfaz de forma visual, generando autom´aticamente el c´odigo de los objetos a˜nadidos. La clase extiende de JApplet e implementa Runnable para el uso de hilos. Como todo applet, ´este cuenta con un m´etodo init() encargado de inicializar los componentes del mismo. Adem´as, se utiliza el m´etodo para establecer un tama˜no fijo de la ventana (800x600). Por otro lado, se crea un hilo independiente llamado “Timer” que se encargar´a de todo el c´aculo num´erico del p´endulo mientras que el hilo principal ser´a el encargado del refresco de imagen. Con el inicio del hilo “Timer.start()” se lanza el m´etodo run() que contiene tanto la discretizaci´on del espacio de estados as´ı como la obtenci´on del regulador ´optimo. Como ´ultima tarea, se ejecuta un bucle “while” encargado de obtener la posici´on y ´angulo del p´endulo en cada instante de tiempo. Tras cada iteraci´on, el hilo se duerme durante un periodo de 2 milisegundos, tiempo suficiente para que el otro hilo pueda refrescar la imagen con los nuevos valores. 51 52 Cap´ıtulo 5 Librer´ıas En este cap´ıtulo se presentan las distintas librer´ıas utilizadas durante el proyecto. En cap´ıtulos anteriores, se mencionaba la necesidad de recurrir a ´estas librer´ıas para solventar las deficiencias de Java respecto al tratamiento con matrices. En secciones siguientes se describe brevemente en que consiste cada una de ellas. Aunque solo Jama ha sido implantada finalmente en el proyecto, las dem´as se incluyen porque en un principio se estudi´o la posibilidad de comunicar el applet con Matlab para que este ´ultimo se encargara del c´alculo num´erico. 5.1. Librer´ıa Jama Se trata de un paquete b´asico de ´algebra lineal que ofrece clases de nivel de usuario para construir y manipular matrices reales. Tiene como objetivo servir como matriz de la clase est´andar para Java. La librer´ıa ha sido desarrollada por The MathWorks y por el Instituto Nacional de Est´andares y Tecnolog´ıa “National Institute of Standards and Technology”, NIST. Jama se compone de seis clases Java: - CholeskyDecomposition. - EigenvalueDecomposition. - LUDecomposition. - Matrix. - QRDecomposition. - SingularValueDecomposition. 53 En este caso, solo han sido necesarias el uso de las clases “Matrix”, utilizada para el tratamiento de matrices, y la clase “EigenvalueDecomposition”, utilizada para el proceso de discretizaci´on del espacio de estados. La clase Matrix proporciona las operaciones fundamentales del ´algebra lineal num´erica. Cuenta con varios constructores para crear matrices de doble precisi´on y coma flotante. Facilita el acceso a submatrices y elementos de la matriz y todas las operaciones aritm´eticas b´asicas incluyen la adici´on y la multiplicaci´on de los elementos de la matriz. En resumen, Jama constituye una buena soluci´on para el tratamiento de matrices. 5.2. Librer´ıa Ejml EJML (Efficient java Matrix) es una librer´ıa de ´algebra lineal para la manipulaci´on de matrices. Sus objetivos de dise˜no son: 1) Ser computacionalmente lo m´as eficiente posible, tanto para matrices peque˜nas como grandes. 2) Ser accesible tanto para novatos como expertos. EJML es libre, escrito en Java 100 % y ha sido publicado bajo la licencia LGPL. Consta de tres carater´ısticas notables que permiten al programador combinar simplicidad y eficiencia. 1) A trav´es de una interfaz simplificada que facilita el desarrollo. 2) EJML selecciona el mejor algoritmo para cada uso. 3) Cuenta con optimizaciones adicionales para operaciones con matrices peque˜nas. 54 5.3. Librer´ıa JMathLib JMathLib tiene como objetivo ser un clon de Matlab pero completamente escrito en java. Cuenta con una biblioteca de funciones matem´aticas dise˜nada para ser usadas en la evaluaci´on de expresiones complejas y mostrar los resultados en forma gr´afica. Se puede utilizar de manera interactiva a trav´es de una ventana tipo terminal o para la interpretaci´on archivos my clases java. Desde la web de la librer´ıa http://www.jmathlib.de/ es posible utilizar un applet que simula de manera exitosa una consola equivalente a la consola de Matlab. La web tambi´en documentaci´on detallada y de f´acil entendimiento para el usuario sobre la utilizaci´on de sus funciones. Pese a ser una librer´ıa con gran abanico de operaciones y algoritmos optimizados, no cuenta con la parte m´as importante que se necesitaba para el proyecto, es decir, la implementaci´on de las funciones de control. No obstante, es un recurso muy recomendado si la intenci´on es trabajar con imagenes y gr´aficos en 3D. Pese a que esta librer´ıa tambi´en trabaja con matrices, se opt´o por Jama ya que ´esta se especializa ´unicamente en matrices. 55 56 Bibliograf´ıa [1] Modelado p´endulo invertido: http://www.ib.cnea.gov.ar/~control2/Links/Tutorial_ Matlab_esp/invpen.html [2] Wilson J. Rugh. Linear System Theory. Prentice Hall, 2nd edition, 1995. [3] Katsuhiko Ogata. Sistemas de control en tiempo discreto, 4nd edici´on, 1996. [4] Realimentaci´on de estados y observadores: http://www.eng.newcastle.edu.au/~jhb519/ teaching/caut2/clases/Cap8.pdf [5] Java GUI Builders: http://www.fullspan.com/articles/java-gui-builders.html [6] Aprenda Java como si estuviera en primero: http://www.tecnun.es/asignaturas/ Informat1/AyudaInf/aprendainf/Java/Java2.pdf [7] Gr´aficos Java: http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap5/grafico.html [8] Programaci´on en L A T EX: http://plagatux.es 57 % La matriz Cnm establece que factor de entrada se debe reeescalar Cnm=[1 0 0 0]; Nbar=rscale(Fm,Gm,Cnm,0,Km) f = figure(1); set(f,’pos’,[200,600,1000 250]); u=0; k = 2; while ((k<20*1/Tm) && (isempty(get(f,´currentchar´ )=[´ 0´ ]))) if ((k>0)&&(Tm*k<1)) Ref=0; else Ref=0; end k = k + 1; % REPRESENTACI ´ ON GR´ AFICA DE LA SIMULACI´ ON % si lo dejamos trabajar no funciona puesto que la linealizaci´on es % para angulos peque˜nos de la inclinaci´on del p´endulo % como funciona la linealizaci´on. % Lo mejor seria obtener linealizar el sistema en varios puntos de % trabajo y aplicar ganancias en distintos puntos. % para verificar el control simular el sistema con las ecuaciones no % lineales, calcular las matrices de ganancia para diferentes puntos de % trabajo y aplicarlas al calculo en bucle cerrado. % Asignamos la entrada % Ecuaci´on de estados no lineal x(1) = x(1) + Tm*x(3); x(2) = x(2) + Tm*x(4); sx2=sin(x(2)); cx2=cos(x(2)); aux=(theta*M-alpha*alpha*cx*cx); x(3) = x(3) + Tm*(alpha*alpha*g*sx2*cx2-Fr*theta*x(3)-alpha*C*cx2*x(4)-alpha*sx2*x(4)*x(4)+theta*u)/aux; x(4) = x(4) + Tm*(alpha*M*g*sx2-alpha*Fr*cx2*x(3)-M*C*x(4)-alpha*alpha*sx2*cx2*x(4)*x(4)+alpha*cx2*u)/aux; 64 % simular una inclinaci´on del pendulo –¿no funciona –¿limitando la u si % funciona OK! % bueno si limitamos mucho la u el sistema no puede controlarse. % x(2)=0.00000002; % control del pendulo realimentando la matriz K % La matriz K se ha calculado sobre el sistema linealizado u=Ref*Nbar-Km*x; % limitar la referencia por mucho que se quiera acelerar no se puede if (u>limitu) u=limitu; end if (u<-limitu) u=-limitu; end u; % Ecuaci´on de salida % x(1)=pos % x(2)=theta x; p1 = x(1); plot(p1,0,’.’); hold on; th = x(2); p2 = (x(1)-ls*sin(th))+j*(ls*cos(th)); line([-0.5+p1,+0.5+p1],[-0.2,-0.2]); line([-0.5+p1,+0.5+p1],[0.0,-0.0]); line([-0.5+p1,-0.5+p1],[0.0,-0.2]); line([0.5+p1,0.5+p1],[0.0,-0.2]); line(real([p1,p2]),imag([p1,p2])); plot(real(p2),imag(p2),’.’,’markersize’,40); hold off; grid on; 65 axis([-5 5 -0.5 2]); drawnow; end close all clear all 66 Ap´endice B Simulaci´on alternativa.m % CONTROL OPTIMAL % ANIMACION DE PENDULO INVERTIDO %——————————– % Copyright (c) Henry Mendiburu %——————————– clear all close all clc % Constantes m = 0.05; M = 1.5; L = 0.35; g = 9.8182; a21 = (M+m)*g/(M*L); a41 = -m*g/M; b21 = -1/(M*L); b41 = 1/M; %Espacio Estado A = [0 1 0 0; a21 0 0 0; 0 0 0 1; a41 0 0 0]; B = [0; b21; 0; b41]; 67 %Control Optimal q1 = 100; q2 = 0; q3 = 100; q4 = 0; Q = diag([q1 q2 q3 q4]); R = [1]; P = are(A,B*inv(R)*B’,Q); K = inv(R)*B’*P; % SIMULACION ti = 0; tf = 3; dt = 0.001; k=1; phi0 = input(’Angulo Inicial (grados) : ’); x(1,1) = phi0*pi/180; x(2,1) = 0; x(3,1) = 0; x(4,1) = 0; for t=ti:dt:tfo phi = x(1,1); phip = x(2,1); F = -K*x; %Modelo del pendulo No Lineal numx2p = F - m*g*sin(phi)*cos(phi) + m*L*phip*phip*sin(phi); 68 denx2p = (M + m*sin(phi)*sin(phi)); x2p = numx2p/denx2p; phi2p = (g*sin(phi)-x2p*cos(phi))/L; %Actualizando valores x(1,1) = x(1,1) + x(2,1)*dt; x(2,1) = x(2,1) + phi2p*dt; x(3,1) = x(3,1) + x(4,1)*dt; x(4,1) = x(4,1) + x2p*dt; %Guardando Matrices ANG(k,1) = x(1,1)*180/pi; ang(k,1) = x(1,1); POS(k,1) = x(3,1); Fuerza(k,1) = F; T(k,1) = t; k = k+1; end figure(1) subplot(211) plot(T,ANG) title(’ANGULO phi’) grid on subplot(212) plot(T,POS) title(’POSICION X’) grid on figure(2) plot(T,Fuerza) title(’FUERZA APLICADA’) grid on % ANIMACION 69 kf = k-1; a = 0.3; b = 0.05; plano = [-1 1 -0.1 0.5]; figure(3) axis(plano) for k=1:10:kf A0X = POS(k,1); A0Y = b; A1X = POS(k,1)+a/2; A1Y = b; A2X = POS(k,1)-a/2; A2Y = b; A3X = POS(k,1)-a/2; A3Y = 0; A4X = POS(k,1)+a/2; A4Y = 0; Xcarro = [A1X A 2X A3X A4X A1X]; Ycarro = [A1Y A2Y A3Y A4Y A1Y]; ApX = POS(k,1) + L*sin(ang(k,1)); ApY = b + L*cos(ang(k,1)); Xpend = [A0X ApX]; Ypend = [A0Y ApY]; As1x = -1; As1y = 0; As2x = 1; As2y = 0; Xsuelo = [As1x As2x]; Ysuelo = [As1y As2y]; %GRAFICA 70 clf; plot(Xsuelo,Ysuelo,’g’,’linewidth’,2) hold on plot(Xpend,Ypend,’r’,’linewidth’,4) hold on plot(Xcarro,Ycarro,’b’,’linewidth’,10) hold on plot(ApX,ApY,’*m’,’linewidth’,20) hold on plot(A3X,A3Y,’*b’,’linewidth’,13) hold on plot(A4X,A4Y,’*b’,’linewidth’,13) axis(plano) grid on pause(1/2000) end disp(’ ’) disp(’.....FIN.....’) 71 72 Ap´endice C C´odigo fuente applet package principal; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.GridBagLayout; import java.awt.Rectangle; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JApplet; import javax.swing.JScrollBar; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import Jama.Matrix; import javax.swing.JButton; import java.awt.GridBagConstraints; import javax.swing.ImageIcon; import java.awt.Dimension; import javax.swing.JTextArea; 73 for (int j=0;j¡a.getColumnDimension();j++) resul[i][j]=a.get(i,j)-b.get(i, j); return resul; private JPanel getJPanelPrincipal() if (jPanelPrincipal == null) labelGravedad = new JLabel(); labelGravedad.setBounds(new Rectangle(43, 143, 62, 16)); labelGravedad.setText(”Gravedad:”); labelFriccion = new JLabel(); labelFriccion.setBounds(new Rectangle(45, 116, 54, 16)); labelFriccion.setText(”Fricci´on:”); labelLongitudPalo = new JLabel(); labelLongitudPalo.setBounds(new Rectangle(43, 88, 83, 16)); labelLongitudPalo.setText(”Longitud palo:”); labelPesoPendulo = new JLabel(); labelPesoPendulo.setBounds(new Rectangle(43, 59, 81, 16)); labelPesoPendulo.setText(”Peso p´endulo:”); labelPesoCarro = new JLabel(); labelPesoCarro.setBounds(new Rectangle(43, 30, 69, 16)); labelPesoCarro.setText(”Peso carro: ”); jPanelPrincipal = new JPanel(); jPanelPrincipal.setLayout(null); jPanelPrincipal.setBounds(new Rectangle(21, 390, 264, 192)); jPanelPrincipal.setBorder(BorderFactory.createTitledBorder(null, ”Par´ametros actuales”, TitledBorder.CENTER, TitledBorder.DEFAULTPOSITION, newF ont(”Dialog”, F ont.BOLD, 12), newColor(51,51,51))); jPanelPrincipal.add(labelPesoCarro, null); jPanelPrincipal.add(labelPesoPendulo, null); jPanelPrincipal.add(labelLongitudPalo, null); jPanelPrincipal.add(labelFriccion, null); jPanelPrincipal.add(labelGravedad, null); jPanelPrincipal.add(getTextPesoCarro(), null); jPanelPrincipal.add(getTextPesoPendulo(), null); 80 jPanelPrincipal.add(getTextLongitudPalo(), null); jPanelPrincipal.add(getTextFriccion(), null); jPanelPrincipal.add(getTextGravedad(), null); return jPanelPrincipal; private JTextField getTextPesoCarro() if (textPesoCarro == null) textPesoCarro = new JTextField(); textPesoCarro.setBounds(new Rectangle(134, 30, 80, 20)); textPesoCarro.setText(”10.5”); textPesoCarro.setHorizontalAlignment(JTextField.CENTER); textPesoCarro.setEditable(true); return textPesoCarro; private JTextField getTextPesoPendulo() if (textPesoPendulo == null) textPesoPendulo = new JTextField(); textPesoPendulo.setBounds(new Rectangle(134, 56, 80, 20)); textPesoPendulo.setText(”0.32”); textPesoPendulo.setHorizontalAlignment(JTextField.CENTER); textPesoPendulo.setEditable(true); return textPesoPendulo; private JTextField getTextLongitudPalo() if (textLongitudPalo == null) textLongitudPalo = new JTextField(); textLongitudPalo.setBounds(new Rectangle(134, 86, 80, 20)); textLongitudPalo.setText(”2”); textLongitudPalo.setHorizontalAlignment(JTextField.CENTER); textLongitudPalo.setEditable(true); return textLongitudPalo; private JTextField getTextFriccion() if (textFriccion == null) textFriccion = new JTextField(); textFriccion.setBounds(new Rectangle(134, 115, 80, 20)); 81 textFriccion.setText(”6.2”); textFriccion.setHorizontalAlignment(JTextField.CENTER); textFriccion.setEditable(true); return textFriccion; private JTextField getTextGravedad() if (textGravedad == null) textGravedad = new JTextField(); textGravedad.setBounds(new Rectangle(134, 146, 80, 20)); textGravedad.setText(”9.8 ”); textGravedad.setHorizontalAlignment(JTextField.CENTER); textGravedad.setEditable(true); return textGravedad; private JPanel getPanelSimulador() if (panelSimulador == null) panelSimulador = new JPanel(); panelSimulador.setLayout(new GridBagLayout()); panelSimulador.setBounds(new Rectangle(15, 31, 767, 331)); panelSimulador.setBackground(Color.white); return panelSimulador; private JScrollBar getScrollPendulo() if (scrollPendulo == null) scrollPendulo = new JScrollBar(); scrollPendulo.setOrientation(JScrollBar.HORIZONTAL); scrollPendulo.setLocation(new Point(15, 362)); scrollPendulo.setValue(45); scrollPendulo.setSize(new Dimension(766, 16)); return scrollPendulo; private JPanel getPanelIniciarDetener() if (panelIniciarDetener == null) panelIniciarDetener = new JPanel(); panelIniciarDetener.setLayout(null); panelIniciarDetener.setBounds(new Rectangle(314, 440, 159, 102)); 82 panelIniciarDetener.setBorder(BorderFactory.createTitledBorder(null, ¨ Iniciar / Detener”, TitledBorder.CENTER, TitledBorder.DEFAULTPOSITION, newF ont(”Dialog”, F ont.BOLD, 12), newColor(51,51,51))); panelIniciarDetener.add(getBtnInicio(), null); panelIniciarDetener.add(getBtnParar(), null); return panelIniciarDetener; private JButton getBtnInicio() if (btnInicio == null) btnInicio = new JButton(); btnInicio.setBounds(new Rectangle(20, 29, 49, 48)); btnInicio.setIcon(new ImageIcon(”D:/home/jose/Desktop/eclipse/workspace/aplicacionPFC/img/iniciar.png”)); return btnInicio; private JButton getBtnParar() if (btnParar == null) btnParar = new JButton(); btnParar.setBounds(new Rectangle(88, 29, 50, 48)); btnParar.setIcon(new ImageIcon(”D:/home/jose/Desktop/eclipse/workspace/aplicacionPFC/img/parar.png”)); btnParar.setPreferredSize(new Dimension(97, 73)); return btnParar; private JPanel getPanelControl() if (panelControl == null) labelManual = new JLabel(); labelManual.setBounds(new Rectangle(106, 24, 56, 16)); labelManual.setText(”Manual”); labelAutomatico = new JLabel(); labelAutomatico.setBounds(new Rectangle(23, 23, 70, 16)); labelAutomatico.setText(.Autom´atico”); panelControl = new JPanel(); panelControl.setLayout(null); panelControl.setBounds(new Rectangle(538, 392, 184, 82)); panelControl.setBorder(BorderFactory.createTitledBorder(null, C¸ontrol P´endulo”, TitledBorder.CENTER, TitledBorder.DEFAULTPOSITION, newF ont(”Dialog”, F ont.BOLD, 12), newColor(51,51,51))); panelControl.add(labelAutomatico, null); 83 panelControl.add(labelManual, null); panelControl.add(getJRadioButtonAutomatico(), null); panelControl.add(getJRadioButtonManual(), null); return panelControl; private JRadioButton getJRadioButtonAutomatico() if (jRadioButtonAutomatico == null) jRadioButtonAutomatico = new JRadioButton(); jRadioButtonAutomatico.setBounds(new Rectangle(51, 46, 21, 21)); jRadioButtonAutomatico.setSelected(true); return jRadioButtonAutomatico; private JRadioButton getJRadioButtonManual() if (jRadioButtonManual == null) jRadioButtonManual = new JRadioButton(); jRadioButtonManual.setBounds(new Rectangle(122, 45, 21, 21)); return jRadioButtonManual; private JPanel getPanelInfo() if (panelInfo == null) labelAngulo = new JLabel(); labelAngulo.setBounds(new Rectangle(109, 28, 50, 16)); labelAngulo.setText(”´ Angulo”); labelPendulo = new JLabel(); labelPendulo.setBounds(new Rectangle(28, 29, 57, 16)); labelPendulo.setText(”Posici´on”); panelInfo = new JPanel(); panelInfo.setLayout(null); panelInfo.setBounds(new Rectangle(539, 486, 182, 96)); panelInfo.setBorder(BorderFactory.createTitledBorder(null, .Estado P´endulo”, TitledBorder.CENTER, TitledBorder.DEFAULTPOSITION, newF ont(”Dialog”, F ont.BOLD, 12), newColor(51,51,51))); panelInfo.add(labelPendulo, null); panelInfo.add(labelAngulo, null); panelInfo.add(getTextPosicion(), null); panelInfo.add(getTextAngulo(), null); 84 return panelInfo; private JTextField getTextPosicion() if (textPosicion == null) textPosicion = new JTextField(); textPosicion.setBounds(new Rectangle(26, 58, 61, 20)); textPosicion.setText(”0.02908”); textPosicion.setHorizontalAlignment(JTextField.CENTER); textPosicion.setEditable(false); return textPosicion; private JTextField getTextAngulo() if (textAngulo == null) textAngulo = new JTextField(); textAngulo.setBounds(new Rectangle(101, 59, 61, 20)); textAngulo.setHorizontalAlignment(JTextField.CENTER); textAngulo.setText(”1.02”); textAngulo.setEditable(false); return textAngulo; private JPanel getPanelTitulo() if (panelTitulo == null) labelTitulo = new JLabel(); labelTitulo.setBounds(new Rectangle(307, 0, 174, 16)); labelTitulo.setText(”Simulador p´endulo invertido”); panelTitulo = new JPanel(); panelTitulo.setLayout(null); panelTitulo.setBounds(new Rectangle(26, 9, 738, 17)); panelTitulo.setBorder(BorderFactory.createTitledBorder(null, , TitledBorder.DEFAULTJUST IFICATION, TitledBorder.DEFAULTPOSITION, newF ont(”Dialog”, F ont.BOLD, 12), newColor(51,51,51))); panelTitulo.add(labelTitulo, null); return panelTitulo; //class 85 86 Ap´endice D Regulador function [K,K1]=regulador(G,H,Peso) C= [ 1 0 0 0]; D=[0]; G1= [ G zeros(4,1); -C* G 1] H1= [H; -C*H]; Q= [Peso(1) 0 0 0 0; 0 Peso(2) 0 0 0 ; 0 0 Peso(3) 0 0 ; 0 0 0 Peso(4) 0; 0 0 0 0 1]; R= [1]; Pact=diag(0,4); var=1; i=0; while ((abs(var)¿0.0001) && (i¡6000 )) Pant=Pact; Pact=Q+G1’*Pant*G1-G1’*Pant*H1*inv(R+H1’*Pant*H1)*H1’*Pant*G1; Pact-Pant; var=sum(sum(Pact-Pant)); i=i+1; end P=Pact; KK=inv(R+H1’*P*H1)*H1’*P*G1 K=[KK(1) KK(2) KK(3) KK(4)]; K1=-KK(5); 87