Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRACTICA N° 01
2017 - II
PROYECTO DEL CURSO ANALISIS Y CONTROL DE
ROBOTS
1. DISEÑO MECANICO
Para la realización del brazo de 2GDL se ha decidido usar como material de los
links el acrílico de 4cm de espesor. Las razones de la elección de este material
son que este es ligero, presenta un costo relativamente bajo y se adapta a
nuestros requerimientos para el diseño.
Las medidas estimadas para el tamaño del brazo son de 13cm x 4cm el primer
link y de 8cm x 4cm para el segundo link, con esto podemos hacer los cálculos
para ver el torque mínimo requerido para los motores.
El motor usado para la primera junta tiene que ser un motor que posea un torque
alto para que pueda soportar la estructura de todo el brazo, mediante cálculos a
priori que se realizó, se determinó que el torque del motor debía ser mayor o
igual a 4Kg-cm.
Así también se requiere que los motores tengan encoder de 2 canales para que
sea posible poder controlar la posición del brazo de 2GDL en todo momento. Así
mismo se requerirá que las RPM que entregaran las cajas reductoras de los
motores sean bajas (menores a 200RPM).
a) LINK 1
d) MOTOR 1
2. CINEMATICA DIRECTA
2.1 DETERMINACIÓN DE LOS SISTEMAS COORDENADOS
JUNTA Өi di ai αi
1 Ө1 L2 L1 0
2 Ө2 0 L3 0
𝐴𝑖−1
𝑖 (𝑞𝑖 ) = 𝑅𝑜𝑡𝑧,𝜃𝑖 . 𝑇𝑟𝑎𝑛𝑠𝑧,𝑑𝑖 . 𝑇𝑟𝑎𝑛𝑠𝑥,𝑎𝑖 . 𝑅𝑜𝑡𝑥,𝑎𝑖
𝑥 2 + 𝑦 2 − 𝐿1 2 − 𝐿3 2
𝑐𝑜𝑠𝜃2 = =𝐷
2𝐿1 . 𝐿3
±√1 − 𝐷2
𝜃2 = tan−1
𝐷
𝑦 𝐿3 . sin 𝜃2
𝜃1 = tan−1 ( ) − tan−1 ( )
𝑥 𝐿1 + 𝐿3 . cos 𝜃2
4. CODIGOS EN MATLAB
disp('Jwcm2: ')
disp(Jwcm2)
%EFECTOR FINAL
disp('Jvf: ')
pretty(simplify(Jvf))
disp('Jwf: ')
disp(Jwf)
4.3 CLASE ROBOT ROBOTICA 2
%----------------------------
% CLASE ROBOT ROBOTICA 2
%---------------------------
classdef robot_ROBO2<handle
%ROBOT PLANAR
properties
%parametros mecanicos
LL1
LL2
LL3
%Parametros DH
d1
a1
alpha1
d2
a2
alpha2
end
%METODOS DE LA CLASE
methods
%Constructor
function this = robot_ROBO2()
%IniciamosParametros D-H valores fijos
this.d2 = 0;
this.alpha1 = 0;
this.alpha2 = 0;
end
%-------------------------------------------------------------
-
function set_dimensiones(this, L1, L2, L3)
%Metodos para poner dimensiones
this.LL1 = L1;
this.LL2 = L2;
this.LL3 = L3;
% Poner los paremetros DH que faltan
this.d1 = L2 ;
this.a1 = L1 ;
this.a2 = L3 ;
end
%-------------------------------------------------------------
a) CINEMÁTICA INVERSA
num=(xc^2+yc^2-L1^2-L3^2);
den=(2*L1*L3);
D=num/den;
if(D>1 || D<-1)
error('POSICION IMPOSIBLE DE ALCANZAR')
else
%ANGULO "theta2"
q2_star = atan2(+sqrt(1-D^2),D); %dos soluciones codo:
+ arriba,-abajo
%ANGULO "theta1"
num1=L3*sin(q2_star);
den1=L1+L3*cos(q2_star);
q1_star= atan2(yc,xc)- atan2(num1,den1);
%Vector de Angulos
q=[q1_star q2_star];
end
end
%------------------------------------------------------------
function A1=compute_matrix_A1(this,theta1)
% Metodo para hallar A1
A1 = matriz_homogenea_DH(theta1, this.d1, this.a1,this.alpha1);
end
T01 = A1;
T02 = A1*A2;
plot_frame(h1, T01);
plot_frame(h2, T02);
pause(0.3)
end
xc=1.5;
yc=1.5;
zc=L2;
%1.2. Ploteo del entorno
T0=eye(4);
plot_frame(T0,'color','k','view','auto')
axis([-2 4 -2 4 0 3])
hold on
grid on
xlabel('x(m)')
ylabel('y(m)')
%Ploteo del punto a alcanzar
plot3(xc, yc, zc, 'ro','MarkerFaceColor', 'k', 'MarkerSize', 10)
%Creamos un objeto robot
my_robot = robot_ROBO2();
my_robot.set_dimensiones(L1, L2, L3)
% 3. Cinematica Inversa
%3.1. USAMOS EL METODO "Cinematica inversa"
q = my_robot.cinematica_inversa_ROBO2(xc, yc, zc);
q1d = q(1);
q2d = q(2);
%3.2. SALIDAs
disp('angulos')
disp(q)
disp(q*180/pi)
%---------------------------------------------
%4. Configuracion Incial del Robot
%4.1. Eslabon 1
% -> Hallamos A1
theta1=0;
A1 = my_robot.compute_matrix_A1(theta1);
% -> Ploteamos T01
T01 =A1;
h1 = plot_frame(T01, 'frame', '1', 'color', 'b');
disp(T01)
%4.2. Eslabon 2
theta2 = 0;
A2 = my_robot.compute_matrix_A2(theta2);
T02 = T01*A2;
%4.3 Ploteamso T02
h2 = plot_frame(T02, 'frame', '2', 'color', 'r');
disp(T02)
%---------------------------------------------------------------
% 5. Lazo de simulacion
% 5.1. Mensaje
disp('Robot del tipo ROBO2 de 2 GDL')
disp('Presione una tecla para empezar simulacion')
pause