Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4 - NE - Antropomorfico
Docente:
M.F. RAFAEL ANGEL NARCIO LAVEAGA
clear
close all
clc
1
%1.2.- Definimos las masas de las articulaciones como variables simbólicas
syms m_1 m_2 m_3 real positive;
%1.3.- Definimos las coordenadas generalizadas como funciones simbólicas
syms q_1(t) q_2(t) q_3(t);
%1.4.- Armamos un vector que contenga la información de la configuración
%del robot, colocando un 1 para representar una junta prismática, y un 0
%para representar una junta de revoluta
RP=[0;0;0];
%1.5.- A fin de después poder utilizar un ciclo for en el cálculo de las
%fuerzas, debemos tener un método para indexar las masas, por lo que
%declaramos un vector para contener las masas de las articulaciones
m = formula([m_1;m_2;m_3]);
%1.6.- Armamos el vector de coordenadas generalizadas
q = formula([q_1;q_2;q_3]);
%1.7.- Obtenemos el vector de velocidades generalizadas al derivar respecto
%al tiempo al vector de coordenadas generalizadas
qp = formula(diff(q,t));
%1.8.- Revisamos si el número de masas de las articulaciones que se ha
%declarado es igual al número de elementos del vector de coordenadas
%generalizadas, y si el número de elementos de ambos es igual a la cantidad
%de elementos del vector de la configuración del robot. Si todos estos
%vectores tienen la misma cantidad de elementos, definimos el número de
%grados de libertad del robot, en caso contrario, el codigo marcará error.
if and(and(size(q,1)==size(RP,1),size(q,1)==size(m,1)),size(RP,1)==size(m,1))
GDL = size(q,1);
disp("Número de grados de grados de libertad del robot: ")
disp(GDL)
else
error("Número de grados de libertad no congruente")
end
Después, definimos cuál es el eje vertical en el marco de referencia inercial, mismo que será el eje sobre
el cuál actué la gravedad, a la cuál colocaremos en dirección opuesta con respecto hacia dónde actua (por
ejemplo, si la gravedad está en eje Yy actuá hacia el negativo, la pondremos con signo positivo en el eje Y.
Quedando de la siguiente forma según el caso:
Para este caso en particular, definimos el eje vertical como el eje Y, siendo la dirección hacia arriba y
hacia abajo, por lo que la gravedad en este caso actúa sobre , quedando por lo tanto el vector de
aceleración de gravedad en este caso como:
2
syms g real;
%1.10.- Definimos el vector de aceleración de la gravedad
G = [0;g;0];
Después de esto, procedemos a obtener las matrices de transformación locales correspondientes al robot a
partir de su tabla de parámetros de Denavit - Hartenberg (DH), para esto utilizamos la función que habíamos
desarrollado previamente para este próposito:
function [A] = DH_kine(theta, d, a, alpha)
%A partir de los parámetros de DH para una articulación, construye
%su matriz local "A".
%1.- Declaramos las matrices de rotacion que usaremos para crear las
%transformadas homogéneas dependientes de un solo parámetros que se han de
%multiplicar para la obteción de la local
R_t = Rot_z(sym(theta));
R_0 = eye(3);
R_a = Rot_x(sym(alpha));
%2.- De la misma forma que declaramos las matrices de rotación a utilizar,
%ahora declaramos los vectores de posición que usaremos.
P0 = zeros(3,1);
Pd = [0;0;sym(d)];
Pa = [sym(a);0;0];
%3.- Una vez teniendo tanto las matrices de rotación con los vectores de
%posición, procedemos a armas las transformadas homogéneas dependientes de
%un solo parámetro:
T_t = TH(R_t, P0);
Td = TH(R_0, Pd);
Ta = TH(R_0, Pa);
T_a = TH(R_a,P0);
%4.- Finalmente, procedemos a multiplicar las transformadas homogéneas
%dependientes de una sola variable.
A = simplify(T_t*Td*Ta*T_a);
end
3
3.- Para armar una matriz de transformación, o transformada homógenea a partir de una matriz de rotación y
un vector de posición.
function [T] = TH(R, P)
vec0 = zeros(1,3);
T = [R P; vec0 1];
end
A modo de ejemplo, podemos sustituir los elementos directamente en la matriz de una local para DH en su
forma general:
DH_M = DH_kine(theta_i,d_i,a_i,alpha_i);
disp(DH_M)
Una vez haciendo esto, para obtener las matrices locales, ya solo es cuestión de ingresar los valores
apropiados para el robot del cuál queramos obtener el modelo dinámico. Quedando para este caso:
%1.11.- Declaramos como variables simbólicas las longitudes constantes de las articulaciones.
syms l_1 l_2 l_3 real positive;
%Como este robot no tiene longitudes constantes, nos saltamos este paso.
%1.12.- Obtenemos las matrices de transformación locales a partir de la
%tabla de parámetros de DH
A(:,:,1) = DH_kine(q_1,l_1,0,pi/2);
disp("A1=")
A1=
disp(A(:,:,1))
A(:,:,2) = DH_kine(q_2,0,l_2,0);
disp("A2=")
A2=
disp(A(:,:,2))
4
A(:,:,3) = DH_kine(q_3+pi/2,0,l_3,pi/2);
disp("A3=")
A3=
disp(A(:,:,3))
Una vez teniendo las matrices locales, volvemos a proceder a verificar que no haya inconsistencias en cuánto
al número de grados de libertad del robot, ya que si se declara un número de matrices locales diferente al
número de grados de libertad del robot el cálculo sería incorrecto, incompleto, o marcaría error.
Ac_1=
disp(Ac(:,:,1))
Ac(:,:,2) = DH_kine(q_2,0,lc_2,0);
disp("Ac_2=")
5
Ac_2=
disp(Ac(:,:,2))
Ac(:,:,3) = DH_kine(q_3,0,lc_3,0);
disp("Ac_3=")
Ac_3=
disp(Ac(:,:,3))
Una vez hecho esto, dado que concideraremos cada articulación del robot como un cuerpo rígido, debemos de
definir el tensor de inercia visto desde el centro de masas de cada articulación. Como esto generalmente nos lo
da el fabricante, utilizamos en este caso tensores de inercia genéricos:
%1.17.- Declaramos los datos que necesitaremos para los tensores de inercia
%genéricos vistos desde el centro de masa de la articulación
syms Ixx_1 Iyy_1 Izz_1 Ixx_2 Iyy_2 Izz_2 Ixx_3 Iyy_3 Izz_3 real positive;
%1.18.- Declaramos los tensores de inercia genéricos vistos desde el centro de masa de la artic
I_c(:,:,1) = formula([Ixx_1,0,0;0,Iyy_1,0;0,0,Izz_1]);
I_c(:,:,2) = formula([Ixx_2,0,0;0,Iyy_2,0;0,0,Izz_2]);
I_c(:,:,3) = formula([Ixx_3,0,0;0,Iyy_3,0;0,0,Izz_3]);
%1.19.- Verificamos que no haya inconsistencias en cuánto al número de
%tensores de inercia con respecto al número de articulaciones
if size(I_c,3)~=GDL
error("No coincide el número de articulaciones con el número de tensores de inercia")
end
%2.1.- Declaramos el vector Z0, que tiene el mismo valor para todos los
%robots que tienen un marco de referencia inercial fijo
Z0 = [0;0;1];
6
%2.2.- Iniciamos el ciclo for que utilizaremos para calcular la cinemática
%directa del robot y extraer los elementos que nos interesan
for i=0:(GDL-1)
i_str = num2str(i);
i1_str = num2str(i+1);
%2.3.- Calculamos las globales
try
H(:,:,i+1)= simplify(H(:,:,i)*A(:,:,i+1));
Hc(:,:,i+1)= simplify(H(:,:,i)*Ac(:,:,i+1));
catch
H(:,:,i+1)= A(:,:,i+1); %Para A1, ya que no se declaró H0
Hc(:,:,i+1)= Ac(:,:,i+1);
end
disp(strcat("H^",i_str,"_",i1_str))
disp(H(:,:,i+1))
disp(strcat("Hc^",i_str,"_",i1_str))
disp(Hc(:,:,i+1))
%2.4.- Extraemos los vectores Z vistos desde el marco de referencia
%inercial
try
Z(:,i+1) = Hc(:,3,i)
catch
Z(:,i+1) = Z0;
end
disp(strcat("Z^0_",i_str))
disp(Z(:,i+1))
%2.5.- Jacobiano angular
if (RP(i+1)==0)
%Si la junta es de revoluta
Jw(:,i+1)= Z(:,i+1);
else
%Si la junta es prismática
Jw(:,i+1)= [0;0;0];
end
%2.6.- Obtenemos los vectores de posición de los centros de masa vistos
%desde el marco de referencia inercial
disp(strcat("Oc_",i1_str))
Oc(:,i+1)=simplify(Hc(1:3,4,i+1));
disp(Oc(:,i+1))
end
H^0_1
Hc^0_1
7
Z^0_0
0
0
1
Oc_1
H^1_2
Hc^1_2
Z^0_1
0
0
1
Oc_2
H^2_3
Hc^2_3
8
Z^0_2
0
0
1
Oc_3
disp("Jw")
Jw
disp(Jw)
0 0 0
0 0 0
1 1 1
9
%3.6.- Energía potencial
disp(strcat("P_",i_str))
P(i) = m(i)*G.'*Oc(:,i);
disp(P(i))
end
w_1
V_1
Tl_1
Tw_1
P_1
w_2
V_2
Tl_2
Tw_2
10
P_2
w_3
V_3
Tl_3
Tw_3
P_3
11
P_t = sum(P);
%3.9.- Obtenemos la energía total del robot
E = T_t+P_t;
%3.10.- Obtenemos el Lagrangiano
L = T_t-P_t;
for i=1:GDL
i_str=num2str(i);
disp(strcat("Tau_",i_str))
Tau(i) = -functionalDerivative(L,q(i));
disp(Tau(i))
end
Tau_1
Tau_2
12
Tau_3
13