Algoritmo Denavit-Hartenberg en Robótica
Algoritmo Denavit-Hartenberg en Robótica
ROBOTICA
GRUPO 190400
MECATRONICA
REPORTE
ALGORITMO DE DAVNIT-HATENBERG
PRESENTA:
PROFESOR:
Introducción
Objetivos de la practica
Material utilizado:
• Computadora
• Software Solidworks
• Software CoppeliaSim Edu
• Software Code::Blocks
• Software SageMathCell
Desarrollo:
1. El primer paso fue el diseño de cada uno de los eslabones del robot de 6 grados de
libertad de acuerdo con el plano proporcionado con ayuda de Solidworks o algún otro
software de diseño:
ROBOTICA
Eslabón 0 (base):
ROBOTICA
Eslabón 1
Eslabón 2
ROBOTICA
Eslabón 3
Eslabón 4
ROBOTICA
Eslabón 5
3. Con base a esa imagen (vista isométrica), identificamos las articulaciones del robot,
siendo todas de tipo rotativas:
ROBOTICA
4. Aplicación del algoritmo de Denavit Hartenberg: Se estableció un sistema de referencias
para cada eslabón tomando en cuenta los siguientes criterios:
• Cada eslabón debe cumplir con el sistema de la mano derecha.
• Se toma como primera relación la base del robot que se establece de manera arbitraria.
• El método de Denavit-Hartenberg dice que la orientación del eje “𝑘𝑛” se dará
acomodando la orientación del eje apuntando al siguiente eslabón.
Para ello, colocamos una vista explosionada de nuestro robot, colocamos los sistemas de
referencias con colores:
ROBOTICA
5. Para poder entender mejor la dirección de los ejes de cada sistema se adjuntan algunas
vistas adicionales del robot, además, acotando las distancias entre las articulaciones para
después poder realizar la tabla de parámetros de Devanit-Hatenberg:
Vista lateral izquierda
ROBOTICA
Vista frontal
Vista superior
ROBOTICA
6. Realizamos nuestra tabla de parámetros con base a la configuración de los sistemas de
referencias de nuestro robot, quedado de la siguiente forma:
ESLABON 𝑋𝐼 𝑍𝐼 𝜃𝐼 𝛼𝐼
[m] [m] [rad] [rad]
1 0 1.02 0 −𝜋⁄
2
2 0.5 0 0 0
3 0 0 0 −𝜋⁄
2
4 0 0.485 0 −𝜋⁄
2
5 0 0 𝜋⁄ −𝜋⁄
2 2
6 0 0 0 0
7. Importamos nuestras piezas. STL en el software CoppeliaSim, y damos los movimientos
de rotación y traslación de acuerdo con la tabla anterior, dando como resultado el
siguiente ensamble:
Para comprobar que se hayan realizado correctamente hacemos uso de nuestro programa
realizado en CodeBlocks en que añadiremos nuestra tabla de la siguiente manera:
ROBOTICA
Por último, tendremos la matriz que nos indica la posición del eslabón final:
Como se puede observar, los datos en los tres casos coinciden indicándonos que el ensamble es
correcto.
10. Se realizo una prueba más añadiendo un movimiento angular al segundo eslabón de -
45°:
ROBOTICA
Agregamos las siguientes líneas al código de nuestra calculadora:
Nuevamente nos arrojara la matriz de transformación del último eslabón respecto a origen
Para el caso del estudio de este robot se seguirán conservando los valores de 𝑥1 , 𝑥2 , 𝑥3 , 𝑥4 , 𝑥5 y
𝑥6 iguales a cero, mientras que a 𝑧1, 𝑧2 , 𝑧3 , 𝑧4 , 𝑧5 y 𝑧6 se les considera como apoyo para observar
su generalización.
𝑥6
𝑦6
Si se conoce una posición en el punto 𝑟07 , entonces: 𝑟𝑂6 = [𝑧 ]
6
1
Sean
𝑞1
𝑞̅ = (𝑞2 )
𝑞3
𝑓1
𝐹̅ = (𝑓2 )
𝑓3
Y
𝑟̅𝑂6 = 𝑟𝑂6 (𝑞1 , 𝑞2 , 𝑞3 )
ROBOTICA
𝑓1 (𝑞1 , 𝑞2 , 𝑞3 )
𝑟̅𝑂6 = (𝑓2 (𝑞1 , 𝑞2 , 𝑞3 )) es conocido
𝑓3 (𝑞1 , 𝑞2 , 𝑞3 )
𝑓1 − 𝑥𝑂6 = 0
⟹ 𝑓2 − 𝑦𝑂6 = 0
𝑓3 − 𝑧𝑂6 = 0
Donde
Y tenemos que
Ahora dentro de SageMathCell, crearemos un código para poder sacar las Jacobianas de cada una
de las transformaciones de acuerdo con nuestra tabla D-H.
ROBOTICA
Primeramente, inicializamos e importamos las librerías necesarias y también realizamos la
declaración de variables:
reset()
import sage.all
from sympy.utilities.codegen import codegen
from sage.ext.fast_eval import fast_float
var ('t1v t2v t3v t4v t1a t2a t3a t4a alp1 alp2
alp3');
var('t1', latex_name=r'\theta_1');
var('t2', latex_name=r'\theta_2');
var('t3', latex_name=r'\theta_3');
var('t4', latex_name=r'\theta_4');
var('t5', latex_name=r'\theta_5');
var('t6', latex_name=r'\theta_6');
var('z1', latex_name='z_1');
var('z2', latex_name='z_2');
var('z3', latex_name='z_3');
var('z4', latex_name='z_4');
var('z5', latex_name='z_5');
var('z6', latex_name='z_6');
var('x1', latex_name='x_1');
var('x2', latex_name='x_2');
var('x3', latex_name='x_3');
var('x4', latex_name='x_4');
var('x5', latex_name='x_5');
var('x6', latex_name='x_6');
var('q1', latex_name='q_1');
var('q2', latex_name='q_2');
var('q3', latex_name='q_3');
var('q4', latex_name='q_4');
var('q5', latex_name='q_5');
var('q6', latex_name='q_6');
ROBOTICA
Creamos nuestra tabla de D-H:
t1=0; alp1=-pi/2; z1=1.02; x1=0;
t2=0; alp2=0; z2=0; x2=0.5;
t3=0; alp3=-pi/2; z3=0; x3=0;
t4=0; alp4=-pi/2; z4=0.485; x4=0;
t5=pi/2; alp5=-pi/2; z5=0; x5=0;
t6=0; alp6=0; z6=0; x6=0;
Tz2= Matrix([[cos(t2+q2),-sin(t2+q2), 0,
0],[sin(t2+q2),cos(t2+q2),0,0],[0,0,1, z2],[0 ,0,0,1]]);
Tx2= Matrix([[1,0, 0, x2],[0,cos(alp2),-
sin(alp2),0],[0,sin(alp2),cos(alp2), 0],[0 ,0,0,1]]);
T12 = Tz2*Tx2;
T02=T01*T12;
Tz3= Matrix([[cos(t3+q3),-sin(t3+q3), 0,
0],[sin(t3+q3),cos(t3+q3),0,0],[0,0,1, z3],[0 ,0,0,1]]);
Tx3= Matrix([[1,0, 0, x3],[0,cos(alp3),-
sin(alp3),0],[0,sin(alp3),cos(alp3), 0],[0 ,0,0,1]]);
T23 = Tz3*Tx3;
T03=T02*T23;
Tz4= Matrix([[cos(t4+q4),-sin(t4+q4), 0,
0],[sin(t4+q4),cos(t4+q4),0,0],[0,0,1, z4],[0 ,0,0,1]]);
Tx4= Matrix([[1,0, 0, x4],[0,cos(alp4),-
sin(alp4),0],[0,sin(alp4),cos(alp4), 0],[0 ,0,0,1]]);
T34 = Tz4*Tx4;
T04=T03*T34;
Tz5= Matrix([[cos(t5+q5),-sin(t5+q5), 0,
0],[sin(t5+q5),cos(t5+q5),0,0],[0,0,1, z5],[0 ,0,0,1]]);
Tx5= Matrix([[1,0, 0, x5],[0,cos(alp5),-
sin(alp5),0],[0,sin(alp5),cos(alp5), 0],[0 ,0,0,1]]);
T45 = Tz5*Tx5;
T05=T04*T45;
Tz6= Matrix([[cos(t6+q6),-sin(t6+q6), 0,
0],[sin(t6+q6),cos(t6+q6),0,0],[0,0,1, z6],[0 ,0,0,1]]);
Tx6= Matrix([[1,0, 0, x6],[0,cos(alp6),-
sin(alp6),0],[0,sin(alp6),cos(alp6), 0],[0 ,0,0,1]]);
T56 = Tz6*Tx6;
T06=(T05*T56).simplify_full()
ROBOTICA
Imprimimos cada una de las transformadas con las siguientes líneas del código:
show('T[01]= ', T01)
show('T[02]= ', T02)
show('T[03]= ', T03)
show('T[04]= ', T04)
show('T[05]= ', T05)
show('T[06]= ', T06)
Dándonos como resultado:
co s(𝑞1 ) 0 −si n(𝑞1 ) 0
) 0 co s(𝑞1 )
T[01]= ( si n(𝑞1 0 )
0 −1 0 1.02000000000000
0 0 0 1
1.0000co s(𝑞1 ) co s(𝑞2 ) −1.000co s(𝑞1 ) si n(𝑞2 ) −1.0000si n(𝑞1 ) 0.500co s(𝑞1 ) co s(𝑞2 )
10000co s(𝑞2 ) si n(𝑞1 ) −1.000si n(𝑞1 ) si n(𝑞2 ) 1.0000co s(𝑞1 ) 0.5000co s(𝑞2 ) si n(𝑞1 )
T[02]= ( )
−1.0000si n(𝑞2 ) −1.000co s(𝑞2 ) 0 −0.5000si n(𝑞2 ) + 1.0200
0 0 0 1
co s(𝑞1) co s(𝑞2) co s(𝑞3) − co s(𝑞1) si n(𝑞2) si n(𝑞3) si n(𝑞1) −co s(𝑞1) co s(𝑞3) si n(𝑞2) − co s(𝑞1) co s(𝑞2) si n(𝑞3) 0.5co s(𝑞1) co s(𝑞2)
co s(𝑞2) co s(𝑞3) si n(𝑞1) − si n(𝑞1) si n(𝑞2) si n(𝑞3) −co s(𝑞1) −co s(𝑞3) si n(𝑞1) si n(𝑞2) − co s(𝑞2) si n(𝑞1) si n(𝑞3) 0.5co s(𝑞2) si n(𝑞1)
T[03]= ( )
−co s(𝑞3) si n(𝑞2) − co s(𝑞2) 𝑠𝑖 n(𝑞3) 0 −co s(𝑞2) co s(𝑞3) + si n(𝑞2) si n(𝑞3) −0.5si n(𝑞2) + 1.020
0 0 0 1
for i in range(4):
cm5=T05[0:3,i]
show(f'T[05c{i+1}]= ', cm5)
for i in range(4):
cm6=T06[0:3,i]
show(f'T[06c{i+1}]= ', cm6)
𝑆
Columnas de la matriz 𝑆04𝑇
(co s(𝑞1 ) co s(𝑞2 ) co s(𝑞3 ) − co s(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) + si n(𝑞1 ) si n(𝑞4 )
T[04c1]= ( (co s(𝑞2 ) co s(𝑞3 ) si n(𝑞1 ) − si n(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) − co s(𝑞1 ) si n(𝑞4 ) )
(−co s(𝑞3 ) si n(𝑞2 ) − co s(𝑞2 ) si n(𝑞3 ))co s(𝑞4 )
−0.485co s(𝑞1 ) co s(𝑞3 ) si n(𝑞2 ) − 0.485co s(𝑞1 ) co s(𝑞2 ) si n(𝑞3 ) + 0.5co s(𝑞1 ) co s(𝑞2 )
T[04c4]= ( −0.485co s(𝑞3 ) si n(𝑞1 ) si n(𝑞2 ) − 0.485co s(𝑞2 ) si n(𝑞1 ) si n(𝑞3 ) + 0.5co s(𝑞2 ) si n(𝑞1 ) )
−0.485co s(𝑞2 ) co s(𝑞3 ) + 0.485si n(𝑞2 ) si n(𝑞3 ) − 0.5si n(𝑞2 ) + 1.02
𝑆
Columnas de la matriz 𝑆05𝑇
1 1
((co s(𝑞1 ) co s(𝑞2 ) co s(𝑞3 ) − co s(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) + si n(𝑞1 ) si n(𝑞4 ))co s ( 𝜋 + 𝑞5 ) + (co s(𝑞1 ) co s(𝑞3 ) si n(𝑞2 ) + co s(𝑞1 ) co s(𝑞2 ) si n(𝑞3 ))si n ( 𝜋 + 𝑞5 )
2 2
1 1
T[05c1]= ((co s(𝑞2 ) co s(𝑞3 ) si n(𝑞1 ) − si n(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) − co s(𝑞1 ) si n(𝑞4 ))co s ( 𝜋 + 𝑞5 ) + (co s(𝑞3 ) si n(𝑞1 ) si n(𝑞2 ) + co s(𝑞2 ) si n(𝑞1 ) si n(𝑞3 ))si n ( 𝜋 + 𝑞5 )
2 2
1 1
(−co s(𝑞3 ) si n(𝑞2 ) − co s(𝑞2 ) si n(𝑞3 ))co s ( 𝜋 + 𝑞5 ) co s(𝑞4 ) + (co s(𝑞2 ) co s(𝑞3 ) − si n(𝑞2 ) si n(𝑞3 ))si n ( 𝜋 + 𝑞5 )
( 2 2 )
−co s(𝑞4 ) si n(𝑞1 ) + (co s(𝑞1 ) co s(𝑞2 ) co s(𝑞3 ) − co s(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))si n(𝑞4 )
T[05c2]= ( co s(𝑞1 ) co s(𝑞4 ) + (co s(𝑞2 ) co s(𝑞3 ) si n(𝑞1 ) − si n(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))si n(𝑞4 ) )
(−co s(𝑞3 ) si n(𝑞2 ) − co s(𝑞2 ) si n(𝑞3 ))si n(𝑞4 )
1 1
(co s(𝑞1 ) co s(𝑞3 ) si n(𝑞2 ) + co s(𝑞1 ) co s(𝑞2 ) si n(𝑞3 ))co s ( 𝜋 + 𝑞5 ) − ((co s(𝑞1 ) co s(𝑞2 ) co s(𝑞3 ) − co s(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) + si n(𝑞1 ) si n(𝑞4 ))si n ( 𝜋 + 𝑞5 )
2 2
1 1
T[05c3]= (co s(𝑞3 ) si n(𝑞1 ) si n(𝑞2 ) + co s(𝑞2 ) si n(𝑞1 ) si n(𝑞3 ))co s ( 𝜋 + 𝑞5 ) − ((co s(𝑞2 ) co s(𝑞3 ) si n(𝑞1 ) − si n(𝑞1 ) si n(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) − co s(𝑞1 ) si n(𝑞4 ))si n ( 𝜋 + 𝑞5 )
2 2
1 1
−(−co s(𝑞3 ) si n(𝑞2 ) − co s(𝑞2 ) si n(𝑞3 ))co s(𝑞4 ) si n ( 𝜋 + 𝑞5 ) + (co s(𝑞2 ) co s(𝑞3 ) − si n(𝑞2 ) si n(𝑞3 ))co s ( 𝜋 + 𝑞5 )
( 2 2 )
−0.485co s(𝑞1 ) co s(𝑞3 ) si n(𝑞2 ) − 0.485co s(𝑞1 ) co s(𝑞2 ) si n(𝑞3 ) + 0.5co s(𝑞1 ) co s(𝑞2 )
T[05c4]= ( −0.485co s(𝑞3 ) si n(𝑞1 ) si n(𝑞2 ) − 0.485co s(𝑞2 ) si n(𝑞1 ) si n(𝑞3 ) + 0.5co s(𝑞2 ) si n(𝑞1 ) )
−0.485co s(𝑞2 ) co s(𝑞3 ) + 0.485si n(𝑞2 ) si n(𝑞3 ) − 0.5si n(𝑞2 ) + 1.02
𝑆
Columnas de la matriz 𝑆06𝑇 : en este caso pondremos atención en cada columna ya que
seleccionaremos aquella que dependa de q1, q2 y q3 para después obtener su matriz Jacobiana
y proceder al cálculo de estos parámetros:
Descartamos la primera columna ya que es una expresión muy grande y además depende de q5
y q6:
((𝑐𝑜 𝑠(𝑞1)𝑐𝑜 𝑠(𝑞3)𝑠𝑖 𝑛(𝑞2) + 𝑐𝑜 𝑠(𝑞1)𝑐𝑜 𝑠(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑐𝑜𝑠(𝑞5) + ((𝑐𝑜 𝑠(𝑞1) 𝑐𝑜 𝑠(𝑞2)𝑐𝑜 𝑠(𝑞3) + 𝑐𝑜 𝑠(𝑞1)𝑠𝑖 𝑛(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑐𝑜 𝑠(𝑞4) − 𝑠𝑖 𝑛(𝑞1)𝑠𝑖 𝑛(𝑞4))𝑠𝑖 𝑛(𝑞5)) 𝑐𝑜 𝑠(𝑞6) + (−𝑐𝑜 𝑠(𝑞4)𝑠𝑖 𝑛(𝑞1) + (𝑐𝑜 𝑠(𝑞1)𝑐𝑜 𝑠(𝑞2) 𝑐𝑜 𝑠(𝑞3 ) − 𝑐𝑜 𝑠(𝑞1)𝑠𝑖 𝑛(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑠𝑖 𝑛(𝑞4))𝑠𝑖 𝑛(𝑞6)
T[06c1]= ((𝑐𝑜 𝑠(𝑞3)𝑠𝑖 𝑛(𝑞1)𝑠𝑖 𝑛(𝑞2) + 𝑐𝑜 𝑠(𝑞2)𝑠𝑖 𝑛(𝑞1)𝑠𝑖 𝑛(𝑞3))𝑐𝑜𝑠(𝑞5) + ((−𝑐𝑜 𝑠(𝑞2)𝑐𝑜 𝑠(𝑞3) 𝑠𝑖 𝑛(𝑞1) + 𝑠𝑖 𝑛(𝑞1) 𝑠𝑖 𝑛(𝑞2) 𝑠𝑖 𝑛(𝑞3))𝑐𝑜 𝑠(𝑞4) + 𝑐𝑜 𝑠(𝑞1) 𝑠𝑖 𝑛(𝑞4))𝑠𝑖 𝑛(𝑞5)) 𝑐𝑜 𝑠(𝑞6) + (𝑐𝑜 𝑠(𝑞1)𝑐𝑜 𝑠(𝑞4) + (𝑐𝑜 𝑠(𝑞2)𝑐𝑜 𝑠(𝑞3)𝑠𝑖 𝑛(𝑞1 ) − 𝑠𝑖 𝑛(𝑞1)𝑠𝑖 𝑛(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑠𝑖 𝑛(𝑞4))𝑠𝑖 𝑛(𝑞6)
(−𝑐𝑜 𝑠(𝑞3)𝑠𝑖 𝑛(𝑞2) − 𝑐𝑜 𝑠(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑠𝑖 𝑛(𝑞4)𝑠𝑖 𝑛(𝑞6) + ((1.0𝑐𝑜 𝑠(𝑞3)𝑠𝑖 𝑛(𝑞2) + 𝑐𝑜 𝑠(𝑞2)𝑠𝑖 𝑛(𝑞3))𝑐𝑜𝑠(𝑞4)𝑠𝑖 𝑛(𝑞5) + (𝑐𝑜 𝑠(𝑞2)𝑐𝑜 𝑠(𝑞3) − 𝑠𝑖 𝑛(𝑞2) 𝑠𝑖 𝑛(𝑞3))𝑐𝑜𝑠(𝑞5))𝑐𝑜 𝑠(𝑞6 )
( )
Hasta la cuarta columna tendremos la columna adecuada, ya que solo depende de los tres
parámetros antes mencionado:
−0.485co s(𝑞1 ) co s(𝑞3 ) si n(𝑞2 ) − 0.485co s(𝑞1 ) co s(𝑞2 ) si n(𝑞3 ) + 0.5co s(𝑞1 ) co s(𝑞2 )
T[06c4]= ( −0.485co s(𝑞3 ) si n(𝑞1 ) si n(𝑞2 ) − 0.485co s(𝑞2 ) si n(𝑞1 ) si n(𝑞3 ) + 0.5co s(𝑞2 ) si n(𝑞1 ) )
−0.485co s(𝑞2 ) co s(𝑞3 ) + 0.485si n(𝑞2 ) si n(𝑞3 ) − 0.5si n(𝑞2 ) + 1.02
ROBOTICA
Planteamos nuestra función F y obtenemos su matriz Jacobiana de la siguiente forma dentro de
SageMathCell:
F=T06[0:3,3:4]
J=(jacobian(F,[[q1],[q2],[q3]]))
show('F= ', F)
show('____________________________________________________________')
show('J= ', J)
−0.485co s(𝑞1) co s(𝑞3 ) si n(𝑞2 ) − 0.485co s(𝑞1) co s(𝑞2 ) si n(𝑞3 ) + 0.5co s(𝑞1 ) co s(𝑞2 )
F= ( −0.485co s(𝑞3) si n(𝑞1 ) si n(𝑞2) − 0.485co s(𝑞2 ) si n(𝑞1) si n(𝑞3 ) + 0.5co s(𝑞2 ) si n(𝑞1 ) )
−0.485co s(𝑞2 ) co s(𝑞3 ) + 0.485si n(𝑞2 ) si n(𝑞3 ) − 0.5si n(𝑞2 ) + 1.02
0.485co s(𝑞3 ) si n(𝑞1 )si n(𝑞2 ) + 0.485co s(𝑞2) si n(𝑞1)si n(𝑞3 ) − 0.5co s(𝑞2) si n(𝑞1) −0.485co s(𝑞1 )co s(𝑞2) co s(𝑞3) + 0.485co s(𝑞1) si n(𝑞2) si n(𝑞3) − 0.5co s(𝑞1) si n(𝑞2) −0.485co s(𝑞1)co s(𝑞2) co s(𝑞3) + 0.485co s(𝑞1) si n(𝑞2) si n(𝑞3 )
J= (−0.485co s(𝑞1) co s(𝑞3) si n(𝑞2) − 0.485co s(𝑞1)co s(𝑞2) si n(𝑞3) + 0.5co s(𝑞1) co s(𝑞2) −0.485co s(𝑞2) co s(𝑞3 )si n(𝑞1) + 0.485si n(𝑞1) si n(𝑞2 ) si n(𝑞3 ) − 0.5si n(𝑞1) si n(𝑞2) −0.485co s(𝑞2 )co s(𝑞3 )si n(𝑞1) + 0.485si n(𝑞1)si n(𝑞2 )si n(𝑞3 ) )
0 0.485co s(𝑞3) si n(𝑞2) + 0.485co s(𝑞2 )si n(𝑞3 ) − 0.5co s(𝑞2) 0.485co s(𝑞3) si n(𝑞2) + 0.485co s(𝑞2 )si n(𝑞3 )
Para los parámetros q4, q5, y q6, crearemos una matriz F2 con la diagonal de la T06 y también
obtenemos su Jacobiana para poder calcular los parámetros:
F2=Matrix([[T06[0][0]],[T06[1][1]],[T06[2][2]]])
J2=jacobian(F2,[[q4],[q5],[q6]])
Ahora obtendremos el código C de cada componente de las 4 matrices para poder hacer el cálculo
en Code::Block, escribiendo las siguientes líneas:
Para F1 y J1:
for i in range (3):
[(c_name, c_code), (h_name,
c_header)]=codegen(("F"+str(i)+str(0),F[i][0]),'C','test')
print(c_code)
Para F2 y J2:
for i in range (3):
[(c_name, c_code), (h_name, c_header)]=codegen(("F2-
"+str(i)+"0",F2[i][0]),'C','test')
print(c_code)
}while(ep>0.001);
float q1=qi.entrada(0,0);
float q2=qi.entrada(1,0);
float q3=qi.entrada(2,0);
Matrix Rdiag(3,1);
Rdiag.entrada(0,0)=-0.377534699926054;
Rdiag.entrada(1,0)=0.4130596162053405;
Rdiag.entrada(2,0)=-0.5326812364391368;
Matrix dF2(3,1);
do
{
dF2=F2(q1,q2,q3,qi2.entrada(0,0),qi2.entrada(1,0),qi2.entrada(2,0))-Rdiag;
qi2=qi2-
J2(q1,q2,q3,qi2.entrada(0,0),qi2.entrada(1,0),qi2.entrada(2,0)).inversa()*dF2;
ep=dF2.magnitud();
cout<<"qi2 (q4,q5,q6) = "<<endl;
qi2.mostrar();
}while(ep>0.001);
return 0;
ROBOTICA
Creamos las funciones F y Jacobianas e introducimos los valores obtenidos en SageMathCell:
Matrix J(float q1, float q2, float q3){
Matrix j(3,3);
j.entrada(0,0)=0.48499999999999999*sin(q1)*sin(q2)*cos(q3) +
0.48499999999999999*sin(q1)*sin(q3)*cos(q2) - 0.5*sin(q1)*cos(q2);
j.entrada(0,1)=0.48499999999999999*sin(q2)*sin(q3)*cos(q1) - 0.5*sin(q2)*cos(q1) -
0.48499999999999999*cos(q1)*cos(q2)*cos(q3);
j.entrada(0,2)=0.48499999999999999*sin(q2)*sin(q3)*cos(q1) -
0.48499999999999999*cos(q1)*cos(q2)*cos(q3);
j.entrada(1,0)=-0.48499999999999999*sin(q2)*cos(q1)*cos(q3) -
0.48499999999999999*sin(q3)*cos(q1)*cos(q2) + 0.5*cos(q1)*cos(q2);
j.entrada(1,1)=0.48499999999999999*sin(q1)*sin(q2)*sin(q3) - 0.5*sin(q1)*sin(q2) -
0.48499999999999999*sin(q1)*cos(q2)*cos(q3);
j.entrada(1,2)=0.48499999999999999*sin(q1)*sin(q2)*sin(q3) -
0.48499999999999999*sin(q1)*cos(q2)*cos(q3);
j.entrada(2,0)=0;
j.entrada(2,1)=0.48499999999999999*sin(q2)*cos(q3) + 0.48499999999999999*sin(q3)*cos(q2)
- 0.5*cos(q2);
j.entrada(2,2)=0.48499999999999999*sin(q2)*cos(q3) + 0.48499999999999999*sin(q3)*cos(q2);
return j;}
Matrix F(float q1, float q2, float q3){
Matrix f(3,1);
f.entrada(0,0)=-0.48499999999999999*sin(q2)*cos(q1)*cos(q3) -
0.48499999999999999*sin(q3)*cos(q1)*cos(q2) + 0.5*cos(q1)*cos(q2);
f.entrada(1,0)=-0.48499999999999999*sin(q1)*sin(q2)*cos(q3) -
0.48499999999999999*sin(q1)*sin(q3)*cos(q2) + 0.5*sin(q1)*cos(q2);
f.entrada(2,0)=0.48499999999999999*sin(q2)*sin(q3) - 0.5*sin(q2) -
0.48499999999999999*cos(q2)*cos(q3) + 1.02;
return f;}
Matrix F2(float q1, float q2, float q3, float q4, float q5, float q6){
Matrix f(3,1);
f.entrada(0,0)=(((1.0*sin(q2)*sin(q3)*cos(q1) - 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q1)*sin(q4))*sin(q5) + (1.0*sin(q2)*cos(q1)*cos(q3) +
1.0*sin(q3)*cos(q1)*cos(q2))*cos(q5))*cos(q6) + ((-1.0*sin(q2)*sin(q3)*cos(q1) +
1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) - 1.0*sin(q1)*cos(q4))*sin(q6);
f.entrada(1,0)=(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*sin(q5) + (-1.0*sin(q1)*sin(q2)*cos(q3) -
1.0*sin(q1)*sin(q3)*cos(q2))*cos(q5))*sin(q6) + ((-1.0*sin(q1)*sin(q2)*sin(q3) +
1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) + 1.0*cos(q1)*cos(q4))*cos(q6);
f.entrada(2,0)=(1.0*sin(q2)*sin(q3) - 1.0*cos(q2)*cos(q3))*sin(q5) + (1.0*sin(q2)*cos(q3)
+ 1.0*sin(q3)*cos(q2))*cos(q4)*cos(q5);
return f;}
Matrix J2(float q1, float q2, float q3, float q4, float q5, float q6){
Matrix j(3,3);
j.entrada(0,0)=((-1.0*sin(q2)*sin(q3)*cos(q1) + 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) +
1.0*sin(q1)*sin(q4))*sin(q6) + (-(1.0*sin(q2)*sin(q3)*cos(q1) -
1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) - 1.0*sin(q1)*cos(q4))*sin(q5)*cos(q6);
j.entrada(0,1)=(((1.0*sin(q2)*sin(q3)*cos(q1) - 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q1)*sin(q4))*cos(q5) - (1.0*sin(q2)*cos(q1)*cos(q3) +
1.0*sin(q3)*cos(q1)*cos(q2))*sin(q5))*cos(q6);
j.entrada(0,2)=-(((1.0*sin(q2)*sin(q3)*cos(q1) - 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q1)*sin(q4))*sin(q5) + (1.0*sin(q2)*cos(q1)*cos(q3) +
1.0*sin(q3)*cos(q1)*cos(q2))*cos(q5))*sin(q6) + ((-1.0*sin(q2)*sin(q3)*cos(q1) +
1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) - 1.0*sin(q1)*cos(q4))*cos(q6);
j.entrada(1,0)=(-(-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*cos(q1)*cos(q4))*sin(q5)*sin(q6) + ((-1.0*sin(q1)*sin(q2)*sin(q3) +
1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) - 1.0*sin(q4)*cos(q1))*cos(q6);
j.entrada(1,1)=(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*cos(q5) - (-1.0*sin(q1)*sin(q2)*cos(q3) -
1.0*sin(q1)*sin(q3)*cos(q2))*sin(q5))*sin(q6);
j.entrada(1,2)=(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*sin(q5) + (-1.0*sin(q1)*sin(q2)*cos(q3) -
1.0*sin(q1)*sin(q3)*cos(q2))*cos(q5))*cos(q6) - ((-1.0*sin(q1)*sin(q2)*sin(q3) +
1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) + 1.0*cos(q1)*cos(q4))*sin(q6);
posición E6 1
ROBOTICA
Ahora haremos los mismo dentro de un scrip en CoppeliaSimu. Ya que conocemos la pocion a la
que queremos llevar al eslabón 6, añadimos lo siguiente a nuestro Sript:
function sysCall_init()
sim = require('sim')
E6=sim.getObject('../E6')
t=0
dt=0.000001
O6={rotationMatrix[4],rotationMatrix[8],rotationMatrix[12]}
Dentro de esta función principal se incluye la declaración de la posición del eslabón 6, que
corresponde a las obtenidas en code::Blocks:
ROBOTICA
Añadimos esto a las articulaciones de nuestro robot en el orden en el que se muestran en las
imágenes anteriores, de arriba hacia abajo y de izquierda a derecha:
Articulación 1
Articulación 2
Articulación 3
Articulación 4
ROBOTICA
Articulación 5
Articulación 6
Ahora iniciamos nuestro ciclo de Newton-Raspshon dentro del script, como se muestra a
continuación:
ROBOTICA
function sysCall_actuation()
sin = math.sin
cos = math.cos
sqrt = math.sqrt
t=t+dt
O=sumVectors3x1(O6,{0,-t,0})
sim.addDrawingObjectItem(curveHandle,
{O6[1],O6[2],O6[3],O[1],O[2],O[3]})
O6=O
-0.48499999999999999*sin(q2)*cos(q1)*cos(q3) -
0.48499999999999999*sin(q3)*cos(q1)*cos(q2) +
0.5*cos(q1)*cos(q2),
0.48499999999999999*sin(q1)*sin(q2)*sin(q3) -
0.5*sin(q1)*sin(q2) -
0.48499999999999999*sin(q1)*cos(q2)*cos(q3),
0.48499999999999999*sin(q1)*sin(q2)*sin(q3) -
0.48499999999999999*sin(q1)*cos(q2)*cos(q3),
0,
0.48499999999999999*sin(q2)*cos(q3) +
0.48499999999999999*sin(q3)*cos(q2) - 0.5*cos(q2),
0.48499999999999999*sin(q2)*cos(q3) +
0.48499999999999999*sin(q3)*cos(q2)
}
ROBOTICA
J2={
((-1.0*sin(q2)*sin(q3)*cos(q1) + 1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*sin(q1)*cos(q4))*sin(q5)*cos(q6) + ((-1.0*sin(q2)*sin(q3)*cos(q1) +
1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) + 1.0*sin(q1)*sin(q4))*sin(q6),
(((1.0*sin(q2)*sin(q3)*cos(q1) - 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q1)*sin(q4))*cos(q5) + (-1.0*sin(q2)*cos(q1)*cos(q3) -
1.0*sin(q3)*cos(q1)*cos(q2))*sin(q5))*cos(q6),
(((-1.0*sin(q2)*sin(q3)*cos(q1) + 1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) +
1.0*sin(q1)*sin(q4))*sin(q5) + (-1.0*sin(q2)*cos(q1)*cos(q3) -
1.0*sin(q3)*cos(q1)*cos(q2))*cos(q5))*sin(q6) + ((-
1.0*sin(q2)*sin(q3)*cos(q1) + 1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*sin(q1)*cos(q4))*cos(q6),
((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*cos(q6) + ((1.0*sin(q1)*sin(q2)*sin(q3) -
1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*cos(q1)*cos(q4))*sin(q5)*sin(q6),
(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*cos(q5) + (1.0*sin(q1)*sin(q2)*cos(q3) +
1.0*sin(q1)*sin(q3)*cos(q2))*sin(q5))*sin(q6),
(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4) -
1.0*sin(q4)*cos(q1))*sin(q5) + (-1.0*sin(q1)*sin(q2)*cos(q3) -
1.0*sin(q1)*sin(q3)*cos(q2))*cos(q5))*cos(q6) +
((1.0*sin(q1)*sin(q2)*sin(q3) - 1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*cos(q1)*cos(q4))*sin(q6),
(-1.0*sin(q2)*cos(q3) - 1.0*sin(q3)*cos(q2))*sin(q4)*cos(q5),
(1.0*sin(q2)*sin(q3) - 1.0*cos(q2)*cos(q3))*cos(q5) + (-
1.0*sin(q2)*cos(q3) - 1.0*sin(q3)*cos(q2))*sin(q5)*cos(q4),
0,
}
-- CALCULAR LA INVERSA
local Jinv, errorMessage = inverse3x3(J)
local J2inv, errorMessage = inverse3x3(J2)
if Jinv then
--print("Matriz inversa:")
--printMatrix3x3(Jinv)
else
print(errorMessage)
print("inversa no existe")
break
end
if J2inv then
--print("Matriz inversa:")
--printMatrix3x3(Jinv)
else
print(errorMessage)
print("inversa no existe")
break
end
local O6i=F(qi)
local dT=restaVectors3x1(O6i,O6)
ROBOTICA
-- Simulaci?n de alg?n procesamiento que diminuye el vlor de a
local v1= restaVectors3x1 (qi, multiplyMatrixVector3x3(Jinv, dT))
qi=v1
k=k+1
if(k>200) then
sim.stopSimulation()
print(" fin simulacion ")
break;
end
O6i=F(qi)
dT=restaVectors3x1(O6,O6i)
local d= sqrt(dT[1]^2+dT[2]^2+dT[3]^2)
--verifica si a es menor que 0.001
if d < 0.001 then
break
end
O6i=F2(qi2)
dT=restaVectors3x1(O6,O6i)
local d2= sqrt(dT[1]^2+dT[2]^2+dT[3]^2)
--verifica si a es menor que 0.001
if d2 < 0.001 then
break
end
local q1=qi[1]
local q2=qi[2]
local q3=qi[3]
local q4=qi2[1]
local q5=qi2[2]
--local q6=qi2[3]
sim.setJointTargetPosition(j1,q1)
sim.setJointTargetPosition(j2,q2)
sim.setJointTargetPosition(j3,q3)
sim.setJointTargetPosition(j4,q4)
sim.setJointTargetPosition(j5,q5)
--sim.setJointTargetPosition(j6,q6)
end
ROBOTICA
Las siguientes son funciones de operaciones matriciales:
q1= a[1];q2=a[2];q3=a[3];
f_[1]=-0.48499999999999999*sin(q2)*cos(q1)*cos(q3) -
0.48499999999999999*sin(q3)*cos(q1)*cos(q2) + 0.5*cos(q1)*cos(q2);
f_[2]=-0.48499999999999999*sin(q1)*sin(q2)*cos(q3) -
0.48499999999999999*sin(q1)*sin(q3)*cos(q2) + 0.5*sin(q1)*cos(q2);
f_[3]=0.48499999999999999*sin(q2)*sin(q3) - 0.5*sin(q2) -
0.48499999999999999*cos(q2)*cos(q3) + 1.02;
--aqui van las funciones F obtenidas desde sagemath, siempre separados por una
coma
return f_
end
function F2(a)
local f2_ = {0,0,0}
q4= a[1];q5=a[2];q6=a[3];
f2_[1]=(((1.0*sin(q2)*sin(q3)*cos(q1) -
1.0*cos(q1)*cos(q2)*cos(q3))*cos(q4) - 1.0*sin(q1)*sin(q4))*sin(q5) +
(1.0*sin(q2)*cos(q1)*cos(q3) + 1.0*sin(q3)*cos(q1)*cos(q2))*cos(q5))*cos(q6) +
((-1.0*sin(q2)*sin(q3)*cos(q1) + 1.0*cos(q1)*cos(q2)*cos(q3))*sin(q4) -
1.0*sin(q1)*cos(q4))*sin(q6);
f2_[2]=(((-1.0*sin(q1)*sin(q2)*sin(q3) + 1.0*sin(q1)*cos(q2)*cos(q3))*cos(q4)
- 1.0*sin(q4)*cos(q1))*sin(q5) + (-1.0*sin(q1)*sin(q2)*cos(q3) -
1.0*sin(q1)*sin(q3)*cos(q2))*cos(q5))*sin(q6) + ((-1.0*sin(q1)*sin(q2)*sin(q3) +
1.0*sin(q1)*cos(q2)*cos(q3))*sin(q4) + 1.0*cos(q1)*cos(q4))*cos(q6);
f2_[3]=(1.0*sin(q2)*sin(q3) - 1.0*cos(q2)*cos(q3))*sin(q5) +
(1.0*sin(q2)*cos(q3) + 1.0*sin(q3)*cos(q2))*cos(q4)*cos(q5);
--aqui van las funciones F obtenidas desde sagemath, siempre separados por una
coma
return f2_
end
Calcular la velocidad angular del efector final respecto del sistema de referencia global.
1. Procedemos con el diseño de cada uno de los eslabones como lo hicimos con el robot
anterior, así como con la colocación de cada uno de sus sistemas de referencia que en
este caso ya fueron proporcionados por el mismo problema, quedando de la siguiente
manera
Eslabón 0(base)
ROBOTICA
Eslabón 1
Eslabón 2
ROBOTICA
Eslabón 3
ROBOTICA
Eslabón 4
ROBOTICA
Eslabón 5
Eslabón 6
ROBOTICA
2. Para realizar este ejercicio lo primero que realizamos fue nuestra tabla de parámetros de
Denavit-Hatenberg, quedando de la siguiente manera:
D-H Robot 2
E x z θ α
1 0 0.65 0 -π/2
2 0.45 0.35 -π/6 0
3 0.31 0 -2π/9 0
4 0 0 0 -π/2
5 0 0.51 0 0
6 0 0.13 0 0
E x z θ α
1 0 0.65 0 -π/2
2 0.45 0.35 0 0
3 0.31 0 0 0
4 0 0 0 -π/2
5 0 0.51 0 0
6 0 0.13 0 0
ROBOTICA
4. Añadimos un script dentro de coppelia donde obtendremos la velocidad angular de cada
uno de los eslabones a través del tiempo, y con ellos poder calcular la velocidad del
efector final:
Para el momento exacto en el que se desea saber la velocidad del efector final, agregaremos los
grados que se nos muestra en el ejercicio sobre las articulaciones revolutas correspondientes en
CoppeliaSimu, quedándonos de la siguiente manera:
ROBOTICA
Daremos play en la simulación y enseguida la pausamos para poder visualizar en la consola las
coordenadas generalizadas que debemos añadir en el código de SageMath. Para ese momento,
se nos muestran estos resultados:
1.86
𝜔6 = [ 1.81 ] 𝑟𝑎𝑑/𝑠
−0.52
1.863
𝜔6 = [ 1.803 ] 𝑟𝑎𝑑/𝑠
−0.5176
Para verificar de otra forma, reemplazamos los valores de q a como lo teníamos en la primera
tabla:
E x z θ α
1 0 0.65 0 -π/2
2 0.45 0.35 -π/6 0
3 0.31 0 -2π/9 0
4 0 0 0 -π/2
5 0 0.51 0 0
6 0 0.13 0 0
ROBOTICA
1.87938524157182
1.80000000000000
Ejecutamos y nos vuelve a quedar el siguiente vector: ( )
−0.484040286651338
0.000000000000000
CINEMATICA INVERSA
Ahora a partir de esto podemos aplicar cinemática inversa obteniendo primero la matriz T06 que
también ya está programada, cada punto con referencia al origen 0:
Este no es el origen que estamos buscando, sino el O3, y de acuerdo con el diagrama del robot
podemos inferir lo siguiente:
̂6
𝑂3 = 𝑂6 − (0.64) ∙ 𝑘
Y en SageMath las líneas que nos ayudan a extraer O3 son las siguientes:
−1.00000000000000sin (𝑞1 )
T03[2] = ( 1.00000000000000cos (𝑞1 ) )
0
0
0.310000000000000cos (𝑞1 )cos (𝑞2 )cos (𝑞3 ) − 0.310000000000000cos (𝑞1 )sin (𝑞2 )sin (𝑞3 ) + 0.450000000000000cos (𝑞1 )cos (𝑞2 ) − 0.350000000000000sin (𝑞1 )
0.310000000000000cos (𝑞2 )cos (𝑞3 )sin (𝑞1 ) − 0.310000000000000sin (𝑞1 )sin (𝑞2 )sin (𝑞3 ) + 0.450000000000000cos (𝑞2 )sin (𝑞1 ) + 0.350000000000000cos (𝑞1 )
T03[3] = ( )
−0.310000000000000cos (𝑞3 )sin (𝑞2 ) − 0.310000000000000cos (𝑞2 )sin (𝑞3 ) − 0.450000000000000sin (𝑞2 ) + 0.650000000000000
1.00000000000000
0.342020143325669co s(𝑞1 ) 0.939692620785908co s(𝑞1 ) 1.0si n(𝑞1 ) 0.4957376761339589co s(𝑞1 ) + 0.35si n(𝑞1 )
A =( −0.939692620785908 0.342020143325669 0 −0.5163047124436321 )
−0.342020143325669si n(𝑞1 ) −0.939692620785908si n(𝑞1 ) 1.0co s(𝑞1 ) 0.35co s(𝑞1 ) − 0.4957376761339589si n(𝑞1 )
0 0 0 1.0
1.0cos (𝑞2 )cos (𝑞3 ) − 1.0sin (𝑞2 )sin (𝑞3 ) −1.0cos (𝑞3 )sin (𝑞2 ) − 1.0cos (𝑞2 )sin (𝑞3 ) 0 0.31cos (𝑞2 )cos (𝑞3 ) − 0.31sin (𝑞2 )sin (𝑞3 ) + 0.45cos (𝑞2 )
1.0cos (𝑞3 )sin (𝑞2 ) + 1.0cos (𝑞2 )sin (𝑞3 ) 1.0cos (𝑞2 )cos (𝑞3 ) − 1.0sin (𝑞2 )sin (𝑞3 ) 0 0.31cos (𝑞3 )sin (𝑞2 ) + 0.31cos (𝑞2 )sin (𝑞3 ) + 0.45sin (𝑞2 )
T13 = ( )
0 0 1.0 0.35
0 0 0 1.0
Igualamos los términos de la matriz A con los términos que son constantes en la matriz T13:
−0.342020143325669𝑠𝑖 𝑛(𝑞1 ) = 0
⇒ 𝑞1 = 0
Sustituimos en A:
Lo siguiente es realizar
Cómo se puede observar, en este caso ninguna de las ecuaciones queda en términos de una sola
incógnita por lo que procederemos a plantear un sistema de ecuaciones de 2x2 quedado de la
siguiente manera:
44668708 8449857
𝑒𝑞1 = 𝑐𝑜𝑠(𝑞2 ) − 𝑠𝑖𝑛(𝑞2 ) = 𝑐𝑜𝑠(𝑞3 )
130602565 8992150
8449857 44668708
𝑒𝑞2 = − 𝑐𝑜𝑠(𝑞2 ) − 𝑠𝑖𝑛(𝑞2 ) = 𝑠𝑖𝑛(𝑞3 )
8992150 130602565
44668708 8449857
𝑎= ; 𝑏=
130602565 8992150
𝑎 = 𝑐𝑜𝑠(𝑞3 + 𝑞2 )
⟹ 𝑎𝑟𝑐𝑐𝑜𝑠(𝑎) = 𝑞3 + 𝑞2
𝑐 = 𝑎𝑟𝑐𝑐𝑜𝑠(𝑎)
⟹ 𝑞3 = −𝑞2 + 𝑐
Sustituimos en eq1:
(−𝑏 − sin(𝑐))
− cot(𝑞2 ) =
(𝑎 − cos(𝑐))
(−𝑏 − sin(𝑐))
cot(𝑞2 ) = −
(𝑎 − cos(𝑐))
(−𝑏 − sin(𝑐))
𝑞2 = 𝑎𝑟𝑐𝑐𝑜𝑡 (− )
(𝑎 − cos(𝑐))
Sustituyendo a y b, tenemos:
8449857 44668708
(− − sin (𝑎𝑟𝑐𝑐𝑜𝑠 ( )))
8992150 130602565
𝑞2 = 𝑎𝑟𝑐𝑐𝑜𝑡 −
44668708 44668708
( − cos (𝑎𝑟𝑐𝑐𝑜𝑠 ( )))
130602565 130602565
( )
𝑞2 = 0
⟹ 𝑞3 = −𝑞2 + 𝑐
𝑞3 = 𝑐
44668708
𝑞3 = 𝑎𝑟𝑐𝑐𝑜𝑠 ( ) = 1.22173047639602872833716791801144
130602565
⟹ 𝑞3 = 1.22173047639602872833716791801144
Conclusiones
En esta práctica, hemos explorado el uso del algoritmo de Denavit-Hartenberg para modelar la
estructura de un brazo robótico. A través de la identificación y aplicación de los parámetros D-H,
logramos describir de manera sistemática las relaciones espaciales entre los eslabones y juntas
del robot. Esta metodología ha demostrado ser una herramienta valiosa para simplificar la
representación de configuraciones complejas en robótica, proporcionando una base sólida para
futuros análisis cinemáticos y dinámicos. La comprensión y manejo adecuado del algoritmo D-H
es esencial para el diseño y control eficiente de robots manipuladores.