0% encontró este documento útil (0 votos)
5 vistas25 páginas

Control de Planta Ball & Beam

El documento describe el diseño y control de un sistema de planta Ball & Beam, donde se modela la dinámica de una bola sobre una viga accionada por un motor. Se utiliza la formulación lagrangiana para establecer las ecuaciones de estado y se implementa un controlador con realimentación de estados y acción integral, seguido de simulaciones para evaluar el rendimiento del sistema. Además, se aborda el diseño de ganancias programadas y ajustes polinómicos para optimizar el control en diferentes condiciones operativas.

Cargado por

Laura Hernandez
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas25 páginas

Control de Planta Ball & Beam

El documento describe el diseño y control de un sistema de planta Ball & Beam, donde se modela la dinámica de una bola sobre una viga accionada por un motor. Se utiliza la formulación lagrangiana para establecer las ecuaciones de estado y se implementa un controlador con realimentación de estados y acción integral, seguido de simulaciones para evaluar el rendimiento del sistema. Además, se aborda el diseño de ganancias programadas y ajustes polinómicos para optimizar el control en diferentes condiciones operativas.

Cargado por

Laura Hernandez
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Planta Ball & Beam de Acción Central

Estudiantes:

Laura Hernandez 220160023

Gabriela Guerrero 221160006

Jannier Escobar 221160069

clear; close all; clc

Modelo
En el esquema de la planta se muestra que la viga es accionada por un motor en su parte central, con el torque
del actuador como la entrada al sistema.

Partiendo de la formulación lagrangiana, el modelo del sistema se describe a partir de las variables de estado
, , y , con entrada , de la siguiente manera

donde m, R e son la masa, el radio y el momento de inercia de la bola, respectivamente.

es el momento de inercia de una viga con masa y longitud L, sobre su centro de masa.

Es claro que para obtener el punto de equilibrio que dependa de la posición deseada de la bola, ya no se
requiere que la entrada sea cero. Luego

1
Parametros

Mv=1; % masa de la viga o riel [kg]


L=1; % longitud del riel [m]
m=0.1; % masa de la bola [kg]
R=0.034; % radio de la bola [m]
Iv=(Mv*(L)^2)/12 % momento de inercia de una barra [kg m^2];

Iv =
0.0833

Ib=2/5*m*R^2 % momento de inercia de la bola [kg m^2]

Ib =
4.6240e-05

g=9.8; % gravedad [m/s^2]

Diseño de un control con aproximación lineal con realimentacion de estados y accion integral

Linealización
Alrededor del punto , .

A=[0 0 1 0;0 0 0 1;0 -(g*m)/(m+(Ib/R^2)) 0 0;-(g*m)/Iv 0 0 0]

A = 4×4
0 0 1.0000 0
0 0 0 1.0000
0 -7.0000 0 0
-11.7600 0 0 0

B=[0 0 0 1/Iv]'

B = 4×1
0
0
0
12

C=[1 0 0 0]

C = 1×4
1 0 0 0

D=0;

Diseño de control b

ásico
% Matrices Aumentadas con integrador

2
Aa=[A zeros(4,1);-C zeros(1,1)];
Ba=[B;zeros(1,1)];

tsdes=7;
% K1=place(Aa,Ba,polos/tsdes); % ganancia con ubicación de polos
% Aproximación a sistema de segundo orden
zeta=0.9;
wn=4/(zeta*tsdes);
polos1=roots([1 2*zeta*wn wn^2]);
polos=[polos1' 5*polos1' 10*real(polos1(1))];
%polos=[polos1' -5.927+3.081*i, -5.927-3.081*i, -6.448];
K2=acker(Aa,Ba,polos);
K1=K2;

Simulación
%% control bola viga en simulación
Tsim=40; % Tiempo total de la simulación
Ts=0.1; % Periodo de muestreo
x_0=[0 0 0 0]'; % Estado incial
Ns=round(Tsim/Ts); % Número de periodos de muestreo que tendrá la simulación.
u=0; % Señal de control para el primer instante de muestreo.
int_err=0; % Integral del error incial.
e_ant=0; % Error anterior
xsim=zeros(Ns,4); usim=zeros(Ns,1); % Tamaño de vectores definido

ref1 = -0.45*ones(1,Ns/4);
ref2 = 0.1*ones(1,Ns/4);
ref3 = 0*ones(1,Ns/4);
ref4 = 0.5*ones(1,Ns/4);

ref = [ref1,ref2,ref3,ref4]; % Referencia

for i=1:Ns
[t,xd]=ode45('plantabb',Ts,x_0,[],u); % Simular la planta para un Ts.
xmed=xd(end,:)';

e=ref(i)-xmed(1);
% Aproximación trapezoidal de integral del error
int_err=int_err+(e+e_ant)*Ts/2;
u=-(dot(K1(1:4),xmed)+K1(5)*int_err); % Cálculo del control.
% Actualización de memorias
x_0=xmed; xsim(i,:)=xmed'; usim(i,:)=u; e_ant=e;

end

%% Cálculo del error medio en todo el tiempo de simulación


error_total = ref - xsim(:,1)'; % Error entre referencia y posición de la bola

3
ess_total = mean(abs(error_total)); % Error medio absoluto

fprintf('Error medio absoluto en todo el tiempo (ess_total): %.5f\n', ess_total);

Error medio absoluto en todo el tiempo (ess_total): 0.14268

Gráficas
tdisc = 0:Ts:Ns*Ts - Ts;

figure;
plot(tdisc,usim);
title('Señal de Control'); %ylim([-50 90]); xlim([0,Tsim]);
xlabel('Tiempo (s)'); ylabel('Torque');

% Estado 1: Posición de la bola


subplot(3,2,1);
plot(tdisc, xsim(:,1), 'b', 'LineWidth', 1.5); hold on;
plot(tdisc, ref, 'r--', 'LineWidth', 1.5);
title('Estado 1: Posición de la bola');
xlabel('Tiempo (s)'); ylabel('Pos. bola');
legend('Pos bola', 'Referencia');

4
grid on;

% Estado 2: Ángulo del motor


subplot(3,2,2);
plot(tdisc, xsim(:,2)*180/pi, 'g', 'LineWidth', 1.5);
title('Estado 2: Ángulo del motor');
xlabel('Tiempo (s)'); ylabel('Ángulo');
legend('Áng. motor');
grid on;

% Estado 3: Velocidad de la bola


subplot(3,2,3);
plot(tdisc, xsim(:,3), 'm', 'LineWidth', 1.5);
title('Estado 3: Velocidad de la bola');
xlabel('Tiempo (s)'); ylabel('Vel. bola');
legend('Vel bola');
grid on;

% Estado 4: Velocidad del motor


subplot(3,2,4);
plot(tdisc, xsim(:,4)*180/pi, 'k', 'LineWidth', 1.5);
title('Estado 4: Velocidad del motor');
xlabel('Tiempo (s)'); ylabel('Vel. motor');
legend('Vel motor');
grid on;
sgtitle('Evolución temporal de los estados del sistema');

5
ITAE Y ENERGIA DE CONTROL

error_abs1 = abs(ref - xsim(:,1)'); % Error absoluto


ITA1 = sum(error_abs1) * Ts; % Índice de Tiempo Absoluto del error

energia1= sum(usim.^2) * Ts; % Energía del control

fprintf('ITA: %.4f\n', ITA1);

ITA: 5.7072

fprintf('Energía de control: %.4f\n', energia1);

Energía de control: 2.8507

Graficas CoppeliaSim

6
Diseño con ganancias programadas

%Estados y entradas simbolicas


syms x1 x2 x3 x4 u

f1=x3;
f2=x4;
f3=((m*x1*x4^2) - (m*g*sin(x2)))/(m + (Ib)/R^2);
f4=(u - (m*g*x1*cos(x2))- (2*m*x1*x3*x4))/(Iv + m*x1^2);

F=[f1;f2;f3;f4] % Campo vectorial

F =

7
x=[x1;x2;x3;x4]; % Vector de estados

Puntos de equilibrio

Definimos como variable a controlar, el cual es la posicion de la bola, por lo cual entonces ahora el sistema
tiene los siguientes puntos de equilibrio:

Linealizacion y Aumento del sistema


As = jacobian(F,x);
Bs = jacobian(F,u);

Cs = [1 0 0 0];

% Matrices aumentadas
Aa=[As zeros(4,1);
-Cs zeros(1,1)];
Ba=[Bs;zeros(1,1)];

Diseño del polinomio segundo orden

ts = 3; % Tiempo de establecimiento
zeta = 0.9; % Factor de amortiguamiento
wn = 4/(ts*zeta); % Frecuencia oscilación
sys = tf(1,[1 2*zeta*wn wn^2]); % Sistema
P = [pole(sys)' -1.5 -2 -2.5]; % Polos deseados

Diseño para LQR

Q = diag([3 0 0 0 1]);
R_lqr = 1;

Ganancias programadas

8
%% Ciclo para Gain Scheduling variando alfa
alfa=-0.5:0.01:0.5; % Rango de variable de Scheduling

Ns = length(alfa);

Ka = zeros(Ns,5);
Kb = zeros(Ns,5);

for i=1:Ns
x1ss = alfa(i);
x2ss = 0;
x3ss = 0;
x4ss = 0;
uss = m*g*x1ss;

%Evaluar las matrices aumentadas en equilibrio


A=double(subs(Aa,{x1,x2,x3,x4,u},{x1ss,x2ss,x3ss,x4ss,uss}));
B=double(subs(Ba,{x1,x2,x3,x4,u},{x1ss,x2ss,x3ss,x4ss,uss}));
% polos=[-5 -6 -10 -50 -30]; % Polos deseados
% Se calcula y almacena Ka para cada paso de alfa
Ka(i,:)=place(A,B,P);
Kb(i,:) = lqr(A,B,Q,R_lqr);
end

Ajuste de curva

Se realizara un ajuste de curva que permite interpolar las ganancias del controlador para puntos de operacion
no calculados directamente,

k1=Ka(:,1); k2=Ka(:,2); k3=Ka(:,3); k4=Ka(:,4); k5=Ka(:,5);


k1L=Kb(:,1); k2L=Kb(:,2); k3L=Kb(:,3); k4L=Kb(:,4); k5L=Kb(:,5);

% 1. Ajustes polinomiales para ganancias con polinomio


Fun1 = polyfit(alfa', k1, 2);
Fun2 = polyfit(alfa', k2, 2);
Fun3 = polyfit(alfa', k3, 2);
Fun4 = polyfit(alfa', k4, 2);
Fun5 = polyfit(alfa', k5, 2);

% 1. Ajustes polinomiales para LQR


Fun1LQR = polyfit(alfa', k1L, 2);
Fun2LQR = polyfit(alfa', k2L, 2);
Fun3LQR = polyfit(alfa', k3L, 2);
Fun4LQR = polyfit(alfa', k4L, 2);
Fun5LQR = polyfit(alfa', k5L, 2);

% 2. Puntos densos para graficar las curvas


alfa_fit = linspace(min(alfa), max(alfa), 100);

9
% 3. Crear la figura con subplots
figure;

% Subplot 1: k1 vs alfa
subplot(3,2,1);
plot(alfa, k1, 'ro', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun1, alfa_fit), 'b-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_1');
title('Ajuste: k_1 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 2: k2 vs alfa
subplot(3,2,2);
plot(alfa, k2, 'bo', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun2, alfa_fit), 'r-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_2');
title('Ajuste: k_2 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 3: k3 vs alfa
subplot(3,2,3);
plot(alfa, k3, 'go', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun3, alfa_fit), 'm-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_3');
title('Ajuste: k_3 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 4: k4 vs alfa
subplot(3,2,4);
plot(alfa, k4, 'mo', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun4, alfa_fit), 'k-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_4');
title('Ajuste: k_4 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 5: k5 vs alfa
subplot(3,2,[5 6]); % Usa espacio doble para que se vea mejor
plot(alfa, k5, 'co', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun5, alfa_fit), 'g-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');

10
ylabel('k_5');
title('Ajuste: k_5 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% %PARA LQR
% sgtitle('Ajuste polinomial para polinomio'); % Título general
% 4. Dibujar con subplots
figure;

% Subplot 1: k1L vs alfa


subplot(3,2,1);
plot(alfa, k1L, 'ro', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun1LQR, alfa_fit), 'b-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_1');
title('Ajuste: k_1 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 2: k2L vs alfa


subplot(3,2,2);
plot(alfa, k2L, 'bo', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun2LQR, alfa_fit), 'r-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');

11
ylabel('k_2');
title('Ajuste: k_2 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 3: k3 vs alfa
subplot(3,2,3);
plot(alfa, k3L, 'go', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun3LQR, alfa_fit), 'm-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_3');
title('Ajuste: k_3 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 4: k4L vs alfa


subplot(3,2,4);
plot(alfa, k4L, 'mo', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun4LQR, alfa_fit), 'k-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_4');
title('Ajuste: k_4 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

% Subplot 5: k5L vs alfa


subplot(3,2,[5 6]); % Usa espacio doble para que se vea mejor
plot(alfa, k5L, 'co', 'MarkerSize', 6, 'LineWidth', 1.5); hold on;
plot(alfa_fit, polyval(Fun5LQR, alfa_fit), 'g-', 'LineWidth', 1.5); hold off;
xlabel('\alpha (rad)');
ylabel('k_5');
title('Ajuste: k_5 vs \alpha');
legend('Datos', 'Ajuste', 'Location', 'best');
grid on;

sgtitle('Ajustes Polinomiales LQR');

12
% sgtitle('Ajuste polinomial para LQR'); % Título general

Control del sistema con Ganancias programadas

Al hacer el ajuste de curvar se esta encontrando una funcion matematica, que mejor aproxime a un conjunto de
datos discretos conocidos con el objetico de modelas la tendencia subyacnte de los datos, incluso en valores
intermedios no medidos

Tspan=40; % Tiempo final de simulación


Ts=0.1; % Tiempo de muestreo
Ns=round(Tspan/Ts); % Número de iteraciones
% Condiciones iniciales

x0=[0 0 0 0]; % Condiciones iniciales

t = linspace(0,Tspan,Ns);

u = 0; % Señal de control para el primer instante de muestreo.


I = 0; % Integral del error incial.
e_ant = 0; % Error Anterior
x_acc1 = zeros(4,Ns); % Tamaño de vectores
u_acc1 = zeros(1,Ns);

13
%Referencias
ref1 = -0.45 * ones(1, Ns/4);
ref2 = 0.1 * ones(1, Ns/4);
ref3 = 0 * ones(1, Ns/4);
ref4 = 0.5 * ones(1, Ns/4);

ref= [ref1, ref2, ref3, ref4]; % Vector final de referencia

for i = 1:Ns
% Solución ED's
[tmed,xmed] = ode45(@(t,x) plantabb(t,x,u), [0 Ts], x0);
x0 = xmed(end,:)';

% Cálculo de las ganancias en base a las funciones de las ganancias


% programadas para LQR

k1_fit = polyval(Fun1, x0(1));


k2_fit = polyval(Fun2, x0(1));
k3_fit = polyval(Fun3, x0(1));
k4_fit = polyval(Fun4, x0(1));
k5_fit = polyval(Fun5, x0(1));

K=[k1_fit k2_fit k3_fit k4_fit k5_fit];

% Cálculos de control
e = ref(i)-x0(1);
I = I+((e+e_ant)*Ts)/2;
u = -K*[x0;I]; % Control con LQR

% Actualización
x_acc1(:,i) = x0;
u_acc1(i) = u;
e_ant = e;
end

Grafica CoppeliaSim

14
15
%Para LQR
x0_2 = [0 0 0 0]; % Estado incial
u_2 = 0; % Señal de control para el primer instante de muestreo.
int_err = 0; % Integral del error incial.
e_ant2 = 0; % Error Anterior

x_acc2=zeros(4,Ns);
u_acc2=zeros(1,Ns);

% Ciclo de simulación
for i=1:Ns

[t, x] = ode45(@(t, x) plantabb(t, x, u_2), [0 Ts], x0_2);

x0_2=x(end,:)'; % Medición de estados

16
% Evaluar cada polinomio ajustado
k1_fit = polyval(Fun1LQR, x0(1));
k2_fit = polyval(Fun2LQR, x0(1));
k3_fit = polyval(Fun3LQR, x0(1));
k4_fit = polyval(Fun4LQR, x0(1));
k5_fit = polyval(Fun5LQR, x0(1));

K=[k1_fit k2_fit k3_fit k4_fit k5_fit];

e_2=ref(i)-x0_2(1); % Cálculo del Error


int_err=int_err+((e_2+e_ant2)*Ts)/2; % Aproximación de la integral
u_2=-K*[x0_2;int_err]; % Realimentación de estados aumentados

x_acc2(:,i)=x0_2; % Almacenamiento para graficar


u_acc2(i)=u_2;
e_ant2=e_2;

end

Graficas simulacion Coopelia

17
t_acc=0:Ts:Tspan-Ts;
figure;
plot(t_acc, u_acc1, 'k', 'LineWidth', 1.5);
xlabel('Tiempo [s]');
ylabel('Torque [N.m]');
title('Señal de control')
legend('Señal de Control')
grid on;

18
% Subplot 1: Posición de la bola
subplot(2,2,1);
hold on;
plot(t_acc, x_acc1(1,:), 'b', 'LineWidth', 1.5); % Posición de la
plot(t_acc, ref, 'k--', 'LineWidth', 2); % Referencia
xlabel('Tiempo: [s]');
ylabel('Distancia [cm]');
title('Posición de la bola (x_1)')
legend('Bola', 'Referencia');
grid on;
hold off;

% Subplot 2: Angulo motor


subplot(2,2,2);
hold on
plot(t_acc, x_acc1(2,:)*180/pi, 'r', 'LineWidth', 1.5);
xlabel('Tiempo [s]');
ylabel('Ángulo [grados]');
title('Ángulo Motor (x_2)');
grid on;
hold off;

% Subplot 3: Velocidad de la bola


subplot(2,2,3);

19
hold on
plot(t_acc, x_acc1(3,:), 'r', 'LineWidth', 1.5);
xlabel('Tiempo: [s]');
ylabel('Velocidad [cm/s]');
title('Velocidad de la Bola (x_3)')
grid on;
hold off;

% Subplot 4: Velocidad angular del motor


subplot(2,2,4);
hold on
plot(t_acc, x_acc1(4,:)*180/pi, 'r', 'LineWidth', 1.5);
xlabel('Tiempo: [s]');
ylabel('Velocidad [grados/s]');
title('Velocidad Angular Motor (x_4)')
grid on;
hold off;

sgtitle('Análisis del sistema con ganancias programadas'); % Título general de la


figura

%ITAE APROXIMACION LINEAL SIN GANANCIAS PROGRAMADAS


% Cálculo de métricas de desempeño
error_abs2 = abs(ref - x_acc1(1,:)); % Error absoluto
ITA2 = sum(error_abs2) * Ts; % Índice del tiempo absoluto del error

20
energia2 = sum(u_acc1.^2) * Ts; % Energía de la señal de control

fprintf('ITA: %.4f\n', ITA2);

ITA: 4.4373

fprintf('Energía de control: %.4f\n', energia2);

Energía de control: 3.2857

%%GRAFICAS LQR

figure;
plot(t_acc, u_acc2, 'k', 'LineWidth', 1.5);
xlabel('Tiempo [s]');
ylabel('Torque [N.m]');
title('Señal de control')
legend('Señal de Control')
grid on;

% Subplot 1: Posición de la bola


subplot(2,2,1);
hold on;
plot(t_acc, x_acc2(1,:), 'b', 'LineWidth', 1.5); % Posición de la

21
plot(t_acc, ref, 'k--', 'LineWidth', 2); % Referencia
xlabel('Tiempo: [s]');
ylabel('Distancia [cm]');
title('Posición de la bola (x_1)')
legend('Bola', 'Referencia');
grid on;
hold off;

% Subplot 2: Angulo motor


subplot(2,2,2);
hold on
plot(t_acc, x_acc2(2,:)*180/pi, 'r', 'LineWidth', 1.5);
xlabel('Tiempo [s]');
ylabel('Ángulo [grados]');
title('Ángulo Motor (x_2)');
grid on;
hold off;

% Subplot 3: Velocidad de la bola


subplot(2,2,3);
hold on
plot(t_acc, x_acc2(3,:), 'r', 'LineWidth', 1.5);
xlabel('Tiempo: [s]');
ylabel('Velocidad [cm/s]');
title('Velocidad de la Bola (x_3)')
grid on;
hold off;

% Subplot 4: Velocidad angular del motor


subplot(2,2,4);
hold on
plot(t_acc, x_acc2(4,:)*180/pi, 'r', 'LineWidth', 1.5);
xlabel('Tiempo: [s]');
ylabel('Velocidad [grados/s]');
title('Velocidad Angular Motor (x_4)')
grid on;
hold off;

sgtitle('Análisis del sistema con ganancias programadas'); % Título general de la


figura

22
ITAE Y ENERGIA DE CONTROL

%ITAE APROXIMACION LINEAL SIN GANANCIAS PROGRAMADAS


% Cálculo de métricas de desempeño
error_abs3 = abs(ref - x_acc2(1,:)); % Error absoluto
ITA3 = sum(error_abs3) * Ts; % Índice del tiempo absoluto del error

energia3 = sum(u_acc2.^2) * Ts; % Energía de la señal de control

fprintf('ITA: %.4f\n', ITA3);

ITA: 4.2969

fprintf('Energía de control: %.4f\n', energia3);

Energía de control: 3.0837

Comparacion
% Tiempo de simulación

23
t_acc = 0:Ts:Tspan-Ts;

% Figura única para comparar los tres controladores


figure;
plot(t_acc, xsim(:,1), 'b', 'LineWidth', 1.5); % Línea punteada celeste
hold on;
plot(t_acc, x_acc1(1,:), 'r', 'LineWidth', 1.5);
plot(t_acc, x_acc2(1,:), 'g', 'LineWidth', 1.5);
plot(t_acc, ref, 'k--', 'LineWidth', 2); % Línea punteada negra

xlabel('Tiempo [s]');
ylabel('Posición de la bola [cm]');
title('Comparación de la posición de la bola (x_1)');
legend('Controlador 1', 'Controlador 2', 'Controlador 3', 'Referencia');
grid on;
hold off;

Comparacion

fprintf('Controlador 1 → ITAE: %.4f, Energía: %.4f\n', ITA1, energia1);

Controlador 1 → ITAE: 5.7072, Energía: 2.8507

fprintf('Controlador 2 → ITAE: %.4f, Energía: %.4f\n', ITA2, energia2)

Controlador 2 → ITAE: 4.4373, Energía: 3.2857

24
fprintf('Controlador 3 → ITAE: %.4f, Energía: %.4f\n', ITA3, energia3);

Controlador 3 → ITAE: 4.2969, Energía: 3.0837

function dx = plantabb(t,x,u)
% Parámetros
Mv = 1; % masa de la viga o riel [kg]
L = 1; % longitud del riel [m]
m = 0.1; % masa de la bola [kg]
R = 0.034; % radio de la bola [m]
Iv = (Mv*(L)^2)/12; % momento de inercia de una barra [kg m^2];
Ib = 2/5*m*R^2; % momento de inercia de la bola [kg m^2]
g = 9.81; % gravedad [m/s^2]

% ED planta
dx = [x(3);
x(4);
(m*x(1)*x(4)^2-m*g*sin(x(2)))/(m+(Ib/R^2));
(u-m*g*x(1)*cos(x(2))-2*m*x(1)*x(3)*x(4))/(Iv+m*x(1)^2)];
end

Conclusiones
En el diseño de los controladores fue necesario tener en cuenta la ubicación de los polos al utilizar el polinomio
de segundo orden. Aunque las simulaciones realizadas en MATLAB el desempeño del sistema era adecuado,
al implementar el control en CoppeliaSim se evidenció inestabilidad en el sistema lo que resaltó.

De acuerdo con los valores obtenidos del índice ITAE, el controlador por ganancias programadas y LQR tuvo
el mejor desempeño en terminos de rapidez. precisión y energia, puesto que tiene menor ITAE y utiliza menor
energía en el control.

Con respecto a la simulación realizada en CoppeliaSim, el mejor controlador tambien fue el de ganancias
programadas con LQR, destacando su estabilidad y respuesta mas suave en comparación con los otros
controladores.

25

También podría gustarte