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