Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO DE ROBOTICA
INTEGRANTE:
VALDIVIA PARICAHUA GIAN PIERRE 20140214
DOCENTE:
PARI PINTO LIZARDO
2020
1. Implementar una función (archivo m) que convierta de la matriz de rotación R a
representación ángulo y eje:
Código de la función para implementar la conversión de la matriz de rotación R (3x3) a
su equivalente par de rotación en MATLAB:
function[]=rot2axis_ang(R11,R12,R13,R21,R22,R23,R31,R32,R33)
R=[R11 R12 R13;R21 R22 R23;R31 R32 R33];
[theta,k]=tr2angvec(R);
fprintf('\nEl vector unitario "k" del eje de rotacion es:\n\n')
disp(k)
fprintf('El angulo de rotacion "theta"(en °) es:\n\n')
disp(theta*180/pi)
end
Para ingresar los elementos de la matriz es importante ver que los 9 números están
ordenados en orden de fila y columna respectivamente en los parámetros de entrada de
la función, además que la matriz R debe tener determinante 1 puesto que es ortonormal.
Para demostrar el funcionamiento de la función ingresaremos la matriz con rotación de
90° alrededor del eje X:
1 0 0
rot ( x,90) R 0 0 1
0 1 0
>> rot2axis_ang(1,0,0,0,0,-1,0,1,0)
1 0 0
90
En este caso debemos ingresar en orden las componentes del vector “r”, el cual engloba
el ángulo de rotación y el vector eje del par de rotación.
Para demostrar el funcionamiento de la función ingresaremos el resultado del ejemplo 9
para llegar al valor de R de su enunciado, entonces tenemos que:
0.2506 0.4104
r k 1.6378 0.6846 1.1212
0.6846 1.1212
>> rodr2rot(0.4104,1.1212,1.1212)
El resultado anterior equivale a la matriz de rotación R con rotación de 90° sobre el eje
Z, luego una rotación de 30° sobre el eje Y y luego una rotación de 60° sobre el eje X:
0 0.5 0.866
R rot ( z ,90) rot ( y,30) rot ( x, 60) 0.866 0.433 0.25
0.5 0.75 0.433
function[]=prod_quat(qs,qv1,qv2,qv3,ts,tv1,tv2,tv3)
theta_q=2*acos(qs);
theta_t=2*acos(ts);
k_q=(1/sin(theta_q/2)).*[qv1 qv2 qv3];
k_t=(1/sin(theta_t/2)).*[tv1 tv2 tv3]
q=Quaternion(theta_q,k_q);
t=Quaternion(theta_t,k_t)
disp(q*t)
end
En este caso ingresamos las 4 componentes del primer cuaternio y luego del segundo
con el orden de ingresar la parte escalar primero seguida de la parte vectorial, es
importante tener en cuenta que para que el cuaternio represente una rotación este debe
tener norma unitaria.
Para demostrar el funcionamiento de la función ingresaremos las componentes de dos
cuaternios “q” y “t” de norma unitaria:
q = 0.5 < 0.5, 0.5, 0.5 >
>> prod_quat(0.5,0.5,0.5,0.5,0.707,0,0.707,0)
s: -1.0677e-04
function[]=rot2quat(R11,R12,R13,R21,R22,R23,R31,R32,R33)
R=[R11 R12 R13 0;R21 R22 R23 0;R31 R32 R33 0;0 0 0 1];
q=Quaternion(R);
disp(q)
end
1 0 0
rot ( x,90) R 0 0 1
0 1 0
>> rot2quat(1,0,0,0,0,-1,0,1,0)
Quaternion with properties:
s: 0.7071
v: [0.7071 0 0]
Entonces como vemos este cuaternio resultante es similar al cuaternio “t” usado en el
problema anterior y del cual sabemos que posee norma unitaria, como este caso el
cuaternio representa una rotación se debe cumplir que posea norma unitaria.
function[]=quat2rot(qs,qv1,qv2,qv3)
theta_q=2*acos(qs);
k_q=(1/sin(theta_q/2)).*[qv1 qv2 qv3];
q=Quaternion(theta_q,k_q);
fprintf('\nLa matriz de rotacion R es:\n\n')
disp(q.R)
end
De nuevo, como tratamos de representar una rotación con un cuaternio, entonces debe
poseer norma unitaria, para ello utilizaremos el cuaternio “q” del problema 3:
q = 0.5 < 0.5, 0.5, 0.5 >
>> quat2rot(0.5,0.5,0.5,0.5)
Y como el resultado de R representa una rotación esta debe tener determinante unitario
puesto que debe ser ortonormal:
>> det([0 0 1;1 0 0;0 1 0])
ans =