Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Informe Práctica06 QuispeGutierrez
Informe Práctica06 QuispeGutierrez
CURSO:
CONTROL MECATRÓNICO III
GRUPO : 02
AREQUIPA-PERÚ
2020
Ejercicio N° 01:
Se tiene un robot tipo carro con tracción delantera. Se desea que estacione de forma
horizontal con un control LQR y se muestre una simulación de la evolución de la posición,
así como un diagrama de la señal de control u (timón del carro)
Consideraciones:
- el robot va hacia atrás.
- la coordenada será ubicada en la parte delantera.
Tenemos:
b) Haciendo variar el ángulo inicial phi desde -180° hasta 180°, y la posición inicial
“y” de -30 a 30, con los valores invariantes de q1=0.1 y q2=0.1 xini=10 y*=0,
llenar la siguiente tabla:
yini
-30 -25 -15 -10 -5 0 5 10 15 25 30
-180
-150
fi_ini
-120
-90
-60
0
60
90
120
150
180
Ejercicio N° 02:
Se tiene un robot tipo carro con tracción delantera. Se desea que estacione de forma
horizontal con un control LQR y se muestre una simulación de la evolución de la posición,
así como un diagrama de la señal de control u (timón del carro).
Simplificación del Simplificación del modelo
La dirección y tracción es
modelo
delantera
𝑥1̇ = 𝑣.𝑥2
Modificar el código anterior y probar el siguiente programa con los siguientes valores:
Ejercicio N° 03:
Se tiene un robot manipulador de 2 GDL. Se desea controlar los torques para tener una
trayectoria lineal con un control LQR y se muestre una simulación de la evolución de la
posición, así como un diagrama de la señal de control u.
𝑀𝜃̈ = 𝑆𝑇
𝜃1̇ 0 0 1 0 𝜃1
𝜃2̇ 0 0 0 1 𝜃2 𝑍𝑒𝑟𝑜𝑠(2,2) 𝜏1
=[ ] ̇ +[ ] [𝜏 ]
𝜃1̈ 0 0 0 0 𝜃1 𝑀−1 𝑆 2
[𝜃2̈ ] 0 0 0 0 [𝜃2̇ ]
Donde:
𝑀11 = 𝐼1 + 𝑚1 ∗ 𝑙1 ∗ 𝑙1 + 𝑚2 ∗ 𝐿1 ∗ 𝐿1 + 𝑚2 ∗ 𝐿1 ∗ 𝑙2
𝑀12 = 𝑚2 ∗ 𝐿1 ∗ 𝑙2
𝑀21 = 𝐼2 + 𝑚2 ∗ 𝑙2 ∗ 𝑙2 + 𝑚2 ∗ 𝐿1 ∗ 𝑙2
𝑀22 = 𝐼2 + 𝑚2 ∗ 𝑙2 ∗ 𝑙2
1 −1
𝑆=[ ]
0 1
Ejecutar el siguiente código y analizar cada una de sus partes:
% Control de brazo robot de dos
grados de libertad.
% Linealización por aproximación
alrededor del punto
% de operación fi1=0, fi2=0.
clear; Limpieza de las variables
close all;
clc; Cerramos todas las ventanas abiertas
Limpiamos ventana de comandos
m1 = 2.5;
L1 = 0.35;
l1 = 0.16; % Longitud
I1 = 1.1; % Inercia
m2 = 1.8; Valores de las variables del brazo
L2 = 0.30;
l2 = 0.12; % Longitud
I2 = 0.8; % Inercia
M11 = I1 + m1*l1*l1 + m2*L1*L1 + Para su simplificación en el código se
m2*L1*l2;
M12 = m2*L1*l2;
trabajan individualmente y se agregan a
M21 = I2 + m2*l2*l2 + m2*L1*l2; la matriz después.
M22 = I2 + m2*l2*l2;
M = [ M11 M12
M21 M22 ];
S = [ 1 -1 Valor de S
0 1 ]; Tanto ceros como iden vienen a
ceros = zeros(2,2); simplificar la construcción de la matriz
iden = eye(2);
A = [ ceros iden siguiente
ceros ceros ];
B = [ ceros Definimos la matriz A y B
inv(M)*S ];
q1 = input('Peso q1 [100 - 5e5]: Definimos los pesos de la matriz Q y
');
q2 = input('Peso q2 [100 - 5e5]:
usamos el comando diag para obtener
'); matrices diagonales rápidamente.
q3 = input('Peso q3 [5]: ');
q4 = input('Peso q4 [5]: ');
% El peso q3 y q4 reduce la mala
respuesta inicial.
Q = diag([ q1 q2 q3 q4 ]);
R = [1 0;0 1]; Aplicamos control óptimo cuadrático lqr
[K,P] = lqr(A,B,Q,R);
%ti = 0; tf = 4; dt = 0.001;
%t = ti:dt:tf;
%t = t';
Condiciones iniciales comentadas
%r1 = 80*pi/180; % Angulo deseado
r1
%r2 = 80*pi/180; % Angulo deseado
r2
% Trayectoria triangular. Inicio
(0.65,0)
% Triangulo vertices: Trayectoria deseada comentada
(0.40,0.00)(0.525,0.10)(0.65,0)
v = 2*0.01; % Velocidad de
desplazamiento en X
ti = 0; dt = 0.001;
t1 = 0.125/v;
t2 = 0.250/v;
tt1 = ti:dt:t1; tt1 = tt1';
tt2 = (t1+dt):dt:t2; tt2 = tt2';
tf = t2; Ecuaciones para el eje x, limitando los
x1 = -0.125/t1*tt1 + 0.65;
x2 = 0.125/(t1-t2)*(tt2-t2) + puntos a trabajar
0.40;
xr = [ x1; x2 ];
y1 = 0.10/t1*tt1;
y2 = 0.10/(t1-t2)*(tt2-t2);
yr = [ y1; y2]; Ecuaciones para el eje y, triángulo
x2y2 = xr.*xr + yr.*yr; tomamos 2 rectas
AA = xr./sqrt(x2y2);
BB = (x2y2+L1*L1-
L2*L2)./(2*L1*sqrt(x2y2));
r1A = acos(AA);
r1B = acos(BB);
r1 = r1A - r1B;
ZZ = (x2y2-
(L1*L1+L2*L2))./(2*L1*L2);
r2 = acos(ZZ);
% r1 = r1A + r1B; % Calculo de r1
- Posicion simetrica
% r2 = -r2; % Calculo de r2 -
Posicion simetrica Trabajamos con la parte real del ángulo
r1 = real(r1);
r2 = real(r2);
nr12 = length(r1);
% r1 = pi/4*ones(nr12,1);
% r2 = -pi/6*ones(nr12,1); Obtenemos nuestras funciones listas para
xx = L1*cos(r1) + L2*cos(r1+r2);
plotear la trayectoria deseada
yy = L1*sin(r1) + L2*sin(r1+r2);
fi1 = 0; fi2 = 0;
fi1p = 0; fi2p = 0; Condiciones iniciales del brazo, posición
ang = [ fi1 fi2 ]'; angular y velocidad igual a cero.
vel = [ fi1p fi2p ]';
k = 1;
for tt = ti:dt:tf
ang1(k,1) = fi1;
Ciclo for para la obtención de vectores de
ang2(k,1) = fi2; ángulo de posición y torque.
t(k,1) = tt;
x = [fi1-r1(k,1); fi2-r2(k,1);
fi1p; fi2p ];
T = -K*x; Calcular el torque de entrada
T1(k,1) = T(1,1); Torque servomotor 1
T2(k,1) = T(2,1); Torque servomotor 2
M11a = I1 + m1*l1*l1 + m2*L1*L1
+ m2*L1*l2 * cos(fi2);
M12a = m2*L1*l2*cos(fi2);
M21a = I2 + m2*l2*l2 +
m2*L1*l2*cos(fi2);
Definimos matriz M considerando
M22a = I2 + m2*l2*l2;
M = [ M11a M12a ángulos
M21a M22a ];
C1 =
m2*L1*l2*(fi1p+fi2p)^2*sin(fi2);
C2 = -
Nuestra matriz G
m2*L1*l2*fi1p*fi1p*sin(fi2);
C = [ C1
C2 ]; Ecuaciones diferenciales
accel = inv(M)*(C + S*T);
ang = ang + vel*dt;
vel = vel + accel*dt; Obtenemos valores
fi1 = ang(1,1);
fi2 = ang(2,1);
fi1p = vel(1,1);
fi2p = vel(2,1);
k = k + 1;
end
%ang1 = ang1*180/pi;
%ang2 = ang2*180/pi;
%figure(1);
%plot(t,ang1);
%figure(2);
%plot(t,ang2);
xra = L1*cos(ang1) +
L2*cos(ang1+ang2); Obtenemos nuestras funciones listas para
yra = L1*sin(ang1) + plotear la trayectoria realizada a partir del
L2*sin(ang1+ang2); control
figure(1);
plot(t,ang1*180/pi,t,r1*180/pi); Graficamos la función de ángulo teta 1
title('Angle Fi1 [deg]');
figure(2);
plot(t,ang2*180/pi,t,r2*180/pi);
title('Angle Fi2 [deg]');
Graficamos la función de ángulo teta 2
figure(3);
plot(xra,yra,xx,yy); Graficamos la trayectoria dibujada
title('Trayectoria X - Y');
figure(4);
plot(t,T1,'-r',t,T2,'b'); Graficamos el torque de los servomotores
title('Torques T1 (rojo) y T2
(azul)');
disp('Pause');
Le avisa al usuario que hay una pausa
pause; Hace la pausa
figure(5);
grid;
Se grafica una última ventana
axis([ 0 0.8 -0.4 0.4]); Definimos sus ejes x y y
hold on;
nk = length(ang1);
dk = 15; % Saltos para la
animación
xra = [ xra
xra(nr12,1)*ones(dk,1) ];
yra = [ yra
yra(nr12,1)*ones(dk,1) ];
% xra(nr12+1:nr12+dk-1,1) =
xra(nr12,1)*ones(dk,1);
% yra(nr12+1:nr12+dk-1,1) =
yra(nr12,1)*ones(dk,1);
for k = 1:dk:nk Ciclo for para obtener vectores para
x1A = 0; graficar en la animación
y1A = 0;
x1B = x1A + L1*cos(ang1(k,1));
y1B = y1A + L1*sin(ang1(k,1)); Obtenemos el vector de coordenadas
x2A = x1B; para la animación del brazo en la figura
y2A = y1B;
ang12 = ang1(k,1) + ang2(k,1);
x2B = x2A + L2*cos(ang12);
y2B = y2A + L2*sin(ang12);
xxx = [ x1A x2A x2B ]; Valores que toma el eje x
yyy = [ y1A y2A y2B ]; Valores que toma el eje y
plot(xxx,yyy,'-
b','Linewidth',2); Graficamos la función de color azul con la
trayectoria que dibuja
pause(0.001); Tiempo para el siguiente plot
plot(xxx,yyy,'-
w','Linewidth',2); Pintamos de blanco todo lo que no es
necesario mostrando solo un brazo para
la animación finalmente
Obtenemos: