Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Control de un péndulo invertido en un carro

Este ejemplo utiliza systune para controlar un péndulo invertido en un carro.

Ensamblaje péndulo-carro

La Figura 1 representa el ensamblaje péndulo-carro, que se modela en Simulink® con Simscape™ Multibody™.

Figura 1: Péndulo invertido en un carro

Figura 2: Modelo de Simscape Multibody

Este sistema se controla ejerciendo una fuerza variable $F$ sobre el carro. El controlador debe mantener el péndulo en posición vertical mientras mueve el carro a una nueva posición o cuando el péndulo se empuja hacia delante (perturbación de impulso $dF$).

Estructura de control

Cuando está en posición vertical, el péndulo invertido se encuentra en un equilibrio inestable. El carácter inestable de la planta hace que la tarea de control resulte más difícil. Para este ejemplo, se utiliza la siguiente estructura de control de doble lazo:

open_system('rct_pendulum.slx')
set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','off');

El lazo interior utiliza un controlador de espacio de estados de segundo orden para estabilizar el péndulo en posición vertical (control $\theta$), mientras que el lazo exterior utiliza un controlador proporcional-derivativo (PD) para controlar la posición del carro. Puede utilizar un PD en lugar de un controlador PID porque la planta ya proporciona acción integral.

Requisitos de diseño

Utilice requisitos TuningGoal para especificar el comportamiento de lazo cerrado deseado. Especifique un tiempo de respuesta de 3 segundos para el seguimiento de un cambio en el punto de referencia en la posición del carro $x$.

% Tracking of x command
req1 = TuningGoal.Tracking('xref','x',3);

Para anular adecuadamente las perturbaciones de impulsos $dF$ en la punta del péndulo, utilice una penalización LQR con el formato

$$ \int_0^\infty (16 \theta^2(t) + x^2(t) + 0.01 F^2(t)) dt $$

que enfatice una pequeña desviación angular $\theta$ y limite el esfuerzo de control $F$.

% Rejection of impulse disturbance dF
Qxu = diag([16 1 0.01]);
req2 = TuningGoal.LQG('dF',{'Theta','x','F'},1,Qxu);

Para mayor robustez, establezca un margen de ganancia de 6 dB, como mínimo, y un margen de fase de 40 grados en la entrada de la planta.

% Stability margins
req3 = TuningGoal.Margins('F',6,40);

Por último, limite el amortiguamiento y la frecuencia natural de los polos de lazo cerrado para evitar transitorios bruscos o subamortiguados.

% Pole locations
MinDamping = 0.5;
MaxFrequency = 45;
req4 = TuningGoal.Poles(0,MinDamping,MaxFrequency);

Ajuste de sistemas de control

El sistema de lazo cerrado es inestable para los valores iniciales de los controladores PD y del espacio de estados (1 y $2/s$, respectivamente). Puede usar systune para ajustar los dos controladores a la vez. Utilice la interfaz slTuner para especificar los bloques ajustables y registrar la entrada de la planta F como punto de análisis para medir los márgenes de estabilidad.

ST0 = slTuner('rct_pendulum',{'Position Controller','Angle Controller'});
addPoint(ST0,'F');

A continuación, utilice systune para ajustar los controladores PD y de espacio de estados en función de los requisitos de rendimiento especificados anteriormente. Optimice el rendimiento de seguimiento y anulación de perturbaciones (requisitos generales) en función de los márgenes de estabilidad y las restricciones de ubicación de polos (requisitos específicos).

rng(0)
Options = systuneOptions('RandomStart',5);
[ST, fSoft] = systune(ST0,[req1,req2],[req3,req4],Options);
Final: Soft = 1.37, Hard = 0.99334, Iterations = 268
Final: Soft = 1.44, Hard = 0.99885, Iterations = 248
Final: Soft = 1.27, Hard = 0.99756, Iterations = 305
Final: Soft = 1.37, Hard = 0.99924, Iterations = 320
Final: Soft = 1.26, Hard = 0.9999, Iterations = 282
Final: Soft = 1.36, Hard = 0.99897, Iterations = 259

El mejor diseño alcanza un valor cercano a 1 para los requisitos generales y satisface, al mismo tiempo, los requisitos específicos (Hard<1). Esto significa que el sistema de control ajustado casi alcanza el rendimiento objetivo para el seguimiento y la anulación de perturbaciones, al tiempo que satisface los márgenes de estabilidad y las restricciones de ubicación de polos.

Validación

Utilice viewGoal para analizar con más detalle cómo se comporta el mejor diseño con respecto a cada requisito.

figure('Position',[100   100   575   660])
viewGoal([req1,req3,req4],ST)

Estas gráficas confirman que los dos primeros requisitos se cumplen casi en su totalidad, mientras que los dos últimos se aplican estrictamente. A continuación, represente las respuestas a un cambio de escalón en la posición y a un impulso de fuerza sobre el carro.

T = getIOTransfer(ST,{'xref','dF'},{'x','Theta'});
figure('Position',[100   100   650   420]);
subplot(121), step(T(:,1),10)
title('Tracking of set point change in position')
subplot(122), impulse(T(:,2),10)
title('Rejection of impulse disturbance')

Las respuestas son suaves con los tiempos de estabilización deseados. Revise los valores ajustados de los controladores.

C1 = getBlockValue(ST,'Position Controller')
C1 =
 
               s    
  Kp + Kd * --------
             Tf*s+1 

  with Kp = 5.84, Kd = 1.88, Tf = 0.0506
 
Name: Position_Controller
Continuous-time PDF controller in parallel form.
C2 = zpk(getBlockValue(ST,'Angle Controller'))
C2 =
 
  -1602.2 (s+12.92) (s+4.266)
  ---------------------------
      (s+134.8) (s-14.16)
 
Name: Angle_Controller
Continuous-time zero/pole/gain model.

Observe que el controlador del ángulo tiene un polo inestable que se empareja con el polo inestable de la planta para estabilizar el péndulo invertido. Para ver esto, obtenga la transferencia de lazo abierto en la entrada de la planta y represente el lugar de la raíz.

L = getLoopTransfer(ST,'F',-1);
figure
rlocus(L)
set(gca,'XLim',[-25 20],'YLim',[-20 20])

Para completar la validación, cargue los valores ajustados en Simulink y simule la respuesta no lineal del ensamblaje carro-péndulo. A continuación, se muestra un vídeo de la simulación resultante.

writeBlockValue(ST)

Figura 3: Simulación de carro-péndulo con controladores ajustados.

Cierre el modelo después de realizar la simulación.

set_param('rct_pendulum','SimMechanicsOpenEditorOnUpdate','on');
close_system('rct_pendulum',0);

Consulte también

(Simulink Control Design) | (Simulink Control Design)

Temas relacionados