Laboratorio 01
Laboratorio 01
Laboratorio 01
Curso:
Mecanismos y Robótica
Grupo: B
Docente:
Ing. Edwin Javier Villalba Cabrera
Integrantes:
Mamani Aqquepucho, Rodrigo Alvaro
Palo Soto, Nair Edson
LINK DEL VIDEO.
https://drive.google.com/file/d/1_67WlDPDl_qv5I_-PiZFUv4WjqBUIa0v/view?usp=sharing
Tema: LAB Nº1
Arequipa - Perú
2022-A
1
PRÁCTICA Nº 1 de ROBÓTICA
TRANSFORMACIONES ESPACIALES y
MATRIZ DE ROTACIÓN
Autor: Lizardo Pari.
I .- OBJETIVOS:
• Visualizar en 3D sistemas de coordenadas con diferentes posiciones y
orientaciones.
• Comprobación matemática de la nueva posición de un punto al someterlo a
una transformación.
• Verificar las propiedades de la matriz de rotación
• Comprobar las transformaciones de la matriz de rotación a par de rotación,
fórmula de Rodríguez, ángulos de Euler y cuaternios.
2
• ¿Qué es un cuaternios?
Son una generalización de los números complejos de R2 a R4, además, es un
sistema multiplicativo no conmutativo
III.- PROCEDIMIENTO
1.- Introducción
La base matemática de la robótica la constituye la matemática del movimiento del cuerpo rígido. Aquí
se estudia las diversas formas de representar la orientación y posición de un cuerpo (que está
asociado a su propio sistema de referencia) en el espacio tridimensional. Básicamente la orientación y
posición de un cuerpo rígido está determinado por la matriz de rotación y el vector de traslación, éstos
se pueden representar conjuntamente por medio de una matriz homogénea. Una matriz de rotación
es una matriz ortogonal con propiedades particulares que la hacen especial, ésta a la vez posee
diversas representaciones descritas en la literatura que van desde el par de rotación, la fórmula de
Rodríguez, los ángulos de Euler y la representación por cuaternios. En la presente práctica se
ejercitará con todos ellos, utilizando el soporte de Matlab y el toolbox de robótica escrito por Peter
Corke.
R =
1 0 0
0 1 0
0 0 1
t =
3
0
0
0
>>
>> trplot(T0,'frame','T0','color','b')
>> T1=roty(pi/2*180/pi)
T1 =
0 0 1
0 1 0
-1 0 0
>> hold on
>> trplot(T1,'frame','T1','color','r');
4
c). Representar una rotación de -90 grados en el eje Z
T2=rotz(-pi/2) ó T2=trotz(-pi/2)
trplot(T2,’frame’,’T2’,’color’,’g’);
>> T2=rotz(-pi/2*180/pi)
T2 =
0 0 -1
0 1 0
1 0 0
>> hold on
>> trplot(T2,'frame','T2','color','g');
5
d). Representar una traslación de 0.5 en el eje X
T3=transl(0.5,0,0);
trplot(T3,’frame’,’T3’,’color’,’m’);
>> T3=transl(0.5,0,0)
T3 =
1.0000 0 0 0.5000
0 1.0000 0 0
0 0 1.0000 0
0 0 0 1.0000
>> T3=transl(0.5,0,0)
trplot(T3,’frame’,’T3’,’color’,’m’);
6
e). Representa una traslación de 0.5 en el eje X, luego una rotación de -90
grados en el eje Z (en el sistema resultante).
T4=T3*T2
trplot(T4,’frame’,’T4’,
’color’,’c’);
>>
T2=trotz(-pi/2*180/pi)
T2 =
0 1 0
0
-1 0 0
0
0 0 1
0
0 0 0
1
>> T4=T3*T2
T4 =
0 1.0000
0 0.5000
-1.0000 0
0 0
0 0
1.0000 0
0 0
0 1.0000
7
>>
trplot(T4,'frame','T4',
'color','c');
f). Representa una traslación de 0.5 en el eje X, luego una rotación de -90
grados en el eje Z, y posteriormente una rotación de 90 en el eje Y (todos en el
sistema resultante).
T5=T4*T1
trplot(T5,’frame’,’T5’,’color’,’y’);
>> T1=troty(pi/2*180/pi)
T1 =
0 0 1 0
0 1 0 0
-1 0 0 0
0 0 0 1
>> T5=T4*T1
T5 =
0 1.0000 0 0.5000
0 0 -1.0000 0
-1.0000 0 0 0
0 0 0 1.0000
>> trplot(T5,'frame','T5','color','y');
8
g) Representar dos matrices homogéneas que describan:
1.- traslación de (0.5,0.5,0) luego rotación en el eje X en 30 grados (sist.
resultante).
2.- traslación de (-0.5,0.5,-0.5) luego rotación en el eje Z en 45 grados (sist.
result.).
T6 =
1.0000 0 0 0.5000
0 0.8660 -0.5000 0.5000
0 0.5000 0.8660 0
0 0 0 1.0000
>> T7=transl(-0.5,0.5,-0.5)*trotz(pi/4*180/pi)
T7 =
9
>> figure
>> T=eye(4)
T=
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> trplot(T,'frame','T0','color','b')
hold on
>> trplot(T6,'frame','T6','color','r')
>> trplot(T7,'frame','T7','color','g')
p1 =
2
1
3
>> R=roty(pi/2*180/pi)
R =
0 0 1
0 1 0
-1 0 0
t =
0
0
10
0
>> p1p=R*p1+t
p1p =
3
1
-2
>> I=eye(3)
I =
1 0 0
0 1 0
0 0 1
t =
2
0
0
>> p2p=I*p1+t
p2p =
4
1
3
p3p =
5
1
-2
>> T1=transl(2,0,0)
T1 =
1 0 0 2
0 1 0 0
0 0 1 0
0 0 0 1
>> T2=troty(pi/2*180/pi)
T2 =
0 0 1 0
0 1 0 0
-1 0 0 0
11
0 0 0 1
>> T=T1*T2
T =
0 0 1 2
0 1 0 0
-1 0 0 0
0 0 0 1
>> p3p_=T*[p1;1]
p3p_ =
5
1
-2
1
p2 =
10
7
6
>> T1=transl(10,5,0)
T1 =
1 0 0 10
0 1 0 5
0 0 1 0
0 0 0 1
>> T2=troty(-pi/2*180/pi)
T2 =
0 0 -1 0
0 1 0 0
1 0 0 0
0 0 0 1
>> T3=trotx(pi/2*180/pi)
T3 =
1 0 0 0
0 0 -1 0
0 1 0 0
0 0 0 1
>> T=T1*T2*T3
T =
0 -1 0 10
0 0 -1 5
1 0 0 0
0 0 0 1
12
4.- Propiedades de la matriz de rotación.
a). Consecuencia del movimiento de un robot de 3gdl se consiguió las siguientes
matrices de rotación:
R1 =
ans =
1.0000
#COMPROBAR LA INVERSA CON LA MATRIZ TRANSPUESTA
>> inv(R1)
13
ans =
>> R1'
ans =
>> r1=R1(:,1)
r1 =
0.8091
-0.0010
-0.5876
>> r2=R1(:,2)
r2 =
-0.1010
0.9849
-0.1407
>> r3=R1(:,3)
r3 =
0.5789
0.1732
0.7968
>> R1
R1 =
>> r1'*r1
ans =
1.0000
>> r2'*r2
ans =
1.0000
>> r3'*r3
14
ans =
1.0000
>> r1'*r2
ans =
-2.4061e-07
>> r1'*r3
ans =
6.3082e-07
>> r2'*r3
ans =
-8.1052e-07
>> S1=skew(r1)
S1 =
0 0.5876 -0.0010
-0.5876 0 -0.8091
0.0010 0.8091 0
>> S2=skew(r2)
S2 =
0 0.1407 0.9849
-0.1407 0 0.1010
-0.9849 -0.1010 0
>> S3=skew(r3)
S3 =
0 -0.7968 0.1732
0.7968 0 -0.5789
-0.1732 0.5789 0
>> S1*r2
ans =
0.5789
0.1732
0.7968
>> r3
r3 =
0.5789
0.1732
0.7968
>> S2*r3
15
ans =
0.8091
-0.0010
-0.5876
>> r1
r1 =
0.8091
-0.0010
-0.5876
>> S3*r1
ans =
-0.1010
0.9849
-0.1407
>> r2
r2 =
-0.1010
0.9849
-0.1407
>> r1=R1(1,:)
r1 =
>> r2=R1(2,:)
r2 =
>> r3=R1(3,:)
r3 =
>> R1
R1 =
>> r1*r1'
ans =
1.0000
>> r2*r2'
16
ans =
1.0000
>> r3*r3'
ans =
1.0000
>> r1*r2'
ans =
-4.0577e-07
>> r1*r3'
ans =
1.0427e-06
>> r2*r3'
ans =
-3.4113e-07
>> S1=skew(r1)
S1 =
0 -0.5789 -0.1010
0.5789 0 -0.8091
0.1010 0.8091 0
>> S2=skew(r2)
S2 =
0 -0.1732 0.9849
0.1732 0 0.0010
-0.9849 -0.0010 0
>> S3=skew(r3)
S3 =
0 -0.7968 -0.1407
0.7968 0 0.5876
0.1407 -0.5876 0
>> S1*r2'
ans =
-0.5876
-0.1407
0.7968
>> r3
r3 =
17
-0.5876 -0.1407 0.7968
>> S2*r3'
ans =
0.8091
-0.1010
0.5789
>> r1
r1 =
>> S3*r1'
ans =
-0.0010
0.9849
0.1732
>> r2
r2 =
*PARA R2
>> R2=rotz(pi/3*180/pi)*roty(pi/6*180/pi)*rotx(pi/4*180/pi)
R2 =
#DETERMINANTE DE R2
>> det(R2)
ans =
1.0000
ans =
>> R2'
ans =
18
0.7891 -0.0474 0.6124
#Si se considera sus columnas (o filas) de R como r1, r2, y r3, verifique
que r r1 1T =r r2 2T =r r3 3T =1 r r1 T1 =r r2 T2 =r r3 T3 =1 (1) r r1 2T
=r r1 3T =r r2 3T =0 r r1 T2 =r r1 T3 =r r2 T3 =0
>> r1=R2(:,1)
r1 =
0.4330
0.7500
-0.5000
>> r2=R2(:,2)
r2 =
-0.4356
0.6597
0.6124
>> r3=R2(:,3)
r3 =
0.7891
-0.0474
0.6124
>> R2
R2 =
>> r1'*r1
ans =
>> r2'*r2
ans =
1.0000
>> r3'*r3
ans =
>> r1'*r2
ans =
-2.7756e-17
>> r1'*r3
19
ans =
5.5511e-17
>> r2'*r3
ans =
-5.5511e-17
>> S1=skew(r1)
S1 =
0 0.5000 0.7500
-0.5000 0 -0.4330
-0.7500 0.4330 0
>> S2=skew(r2)
S2 =
0 -0.6124 0.6597
0.6124 0 0.4356
-0.6597 -0.4356 0
>> S3=skew(r3)
S3 =
0 -0.6124 -0.0474
0.6124 0 -0.7891
0.0474 0.7891 0
>> S1*r2
ans =
0.7891
-0.0474
0.6124
>> r3
r3 =
0.7891
-0.0474
0.6124
>> S2*r3
ans =
0.4330
0.7500
-0.5000
>> r1
r1 =
0.4330
0.7500
20
-0.5000
>> S3*r1
ans =
-0.4356
0.6597
0.6124
>> r2
r2 =
-0.4356
0.6597
0.6124
>> r1=R2(1,:)
r1 =
>> r2=R2(2,:)
r2 =
>> r3=R2(3,:)
r3 =
>> R2
R2 =
>> r1*r1'
ans =
1.0000
>> r2*r2'
ans =
>> r3*r3'
ans =
>> r1*r2'
21
ans =
>> r1*r3'
ans =
-5.5511e-17
>> r2*r3'
ans =
5.5511e-17
>> S1=skew(r1)
S1 =
0 -0.7891 -0.4356
0.7891 0 -0.4330
0.4356 0.4330 0
>> S2=skew(r2)
S2 =
0 0.0474 0.6597
-0.0474 0 -0.7500
-0.6597 0.7500 0
>> S3=skew(r3)
S3 =
0 -0.6124 0.6124
0.6124 0 0.5000
-0.6124 -0.5000 0
>> S1*r2'
ans =
-0.5000
0.6124
0.6124
>> r3
r3 =
>> S2*r3'
ans =
0.4330
-0.4356
0.7891
>> r1
22
r1 =
>> S3*r1'
ans =
0.7500
0.6597
-0.0474
>> r2
r2 =
ans =
[cos(phy)*sin(xhy) + cos(th)*cos(xhy)*sin(phy),cos(phy)*cos(xhy) -
cos(th)*sin(phy)*sin(xhy), sin(phy)*sin(th)]
[ -cos(xhy)*sin(th),sin(th)*sin(xhy),os(th)]
ans =
[cos(th)*sin(phy),cos(phy)*cos(xhy)+sin(phy)*sin(th)*sin(xhy),
cos(xhy)*sin(phy)*sin(th) - cos(phy)*sin(xhy)]
[-sin(th),cos(th)*sin(xhy), cos(th)*cos(xhy)]
b) Para la matriz de rotación del apartado 4, halle los ángulos de Euler ZYZ y RPY (en
grados). NOTA: use tr2eul() y tr2rpy(). Además: rpy2tr() y eul2tr().
PARA R2
>> R2=rotz(pi/3*180/pi)*roty(pi/6*180/pi)*rotx(pi/4*180/pi)
R2 =
23
0.4330 -0.4356 0.7891
0.7500 0.6597 -0.0474
-0.5000 0.6124 0.6124
>> tr2eul(R2)*180/pi
ans =
ans =
c) Para las matrices de rotación del apartado 4 halle el ángulo y eje según las expresiones
de la teoría y compruebe el resultado con la instrucción [ang vec] = tr2angvec(R).
>> theta2 = acos((trace(R2)-1)/2)
theta2 =
1.2105
>> k2 = (1/(2*sin(theta2)))*[R2(3,2)-R2(2,3);R2(1,3)-R2(3,1);R2(2,1)-R2(1,2)]
k2 =
0.3525
0.6888
0.6335
ang =
1.2105
vec =
d) Suponer que R2 es generado por una rotación de 90 grados en Z, luego una rotación de
30º en Y, luego una rotación de 60º en X (todos en el sistema móvil), hallar su ángulo y
eje, luego pruebe con tr2rpy(R2,’zyx’,’deg’) e interpretar.
>> R3=rotz(pi/2*180/pi)*roty(pi/6*180/pi)*rotx(pi/3*180/pi)
R3 =
0 -0.5000 0.8660
24
0.8660 0.4330 0.2500
-0.5000 0.7500 0.4330
theta3 =
1.6378
>> k3 = (1/(2*sin(theta3)))*[R3(3,2)-R3(2,3);R3(1,3)-R3(3,1);R3(2,1)-R3(1,2)]
k3 =
0.2506
0.6846
0.6846
ans =
>> R2=rotz(pi/4*180/pi)*roty(pi/3*180/pi)*rotx(pi/6*180/pi)
R2 =
theta2 =
1.2105
>> k2 =
(1/(2*sin(theta2)))*[R2(3,2)-R2(2,3);R2(1,3)-R2(3,1);R2(2,1)-R2(1,2)]
k2 =
0.0391
0.9350
0.3525
>> R3=rotz(pi/2*180/pi)*roty(pi/6*180/pi)*rotx(pi/3*180/pi)
R3 =
0 -0.5000 0.8660
0.8660 0.4330 0.2500
-0.5000 0.7500 0.4330
theta3 =
25
1.6378
>> k3 =
(1/(2*sin(theta3)))*[R3(3,2)-R3(2,3);R3(1,3)-R3(3,1);R3(2,1)-R3(1,2)]
k3 =
0.2506
0.6846
0.6846
rod2 =
0.0474
1.1318
0.4267
rod3 =
0.4104
1.1212
1.1212
>> R2=rotz(pi/4*180/pi)*roty(pi/3*180/pi)*rotx(pi/6*180/pi)
R2 =
theta2 =
1.2105
>> k2 = (1/(2*sin(theta2)))*[R2(3,2)-R2(2,3);R2(1,3)-R2(3,1);R2(2,1)-R2(1,2)]
k2 =
0.0391
0.9350
0.3525
theta2 =
1.2105
>> k2 = (1/(2*sin(theta2)))*[R2(3,2)-R2(2,3);R2(1,3)-R2(3,1);R2(2,1)-R2(1,2)]
26
k2 =
0.0391
0.9350
0.3525
>> R3=rotz(pi/2)*roty(pi/6)*rotx(pi/3)
R3 =
theta3 =
0.0341
>> k3 = (1/(2*sin(theta3)))*[R3(3,2)-R3(2,3);R3(1,3)-R3(3,1);R3(2,1)-R3(1,2)]
k3 =
0.5319
0.2751
0.8009
rod2 =
0.0474
1.1318
0.4267
rod3 =
0.0182
0.0094
0.0273
R2 =
>> [V D]=eig(R2)
V =
27
0.6617 + 0.0000i 0.6617 + 0.0000i 0.3525 + 0.0000i
-0.1835 - 0.4787i -0.1835 + 0.4787i 0.6888 + 0.0000i
-0.1687 + 0.5205i -0.1687 - 0.5205i 0.6335 + 0.0000i
D =
k_ =
0.3525
0.6888
0.6335
th_ =
1.2105
t =
2
1
-1
>> R=rotz(pi/3*180/pi)*roty(pi/6*180/pi)*rotx(pi/4*180/pi)
R =
>> t_=transl(t)
t_ =
1 0 0 2
28
0 1 0 1
0 0 1 -1
0 0 0 1
>> R_=r2t(R)
R_ =
>> R_*t_
ans =
>> t_*R_
ans =
>> t2r(ans)
ans =
>> H=rt2tr(R,t)
H =
29
0.4330 -0.4356 0.7891
2.0000
0.7500 0.6597 -0.0474
1.0000
-0.5000 0.6124 0.6124
-1.0000
0 0 0
1.0000
>> [a b]=tr2rt(H)
a =
b =
2
1
-1
ans =
ans =
30
a) Para las matrices de rotación del apartado 4, halle su representación en
cuaternios usando:
1.- fórmula de la teoría.
>> R
R =
>> th=acos((trace(R)-1)/2)
th =
1.2105
>>
k=(1/(2*sin(th)))*[R(3,2)-R(2,3);R(1,3)-R(3,1);R(2,1)-R(1,2)]
k =
0.3525
0.6888
0.6335
q =
>> UnitQuaternion(q)
ans =
3.- Quaternion(ang,vec).
>> UnitQuaternion(th,k)
ans =
4.- Quaternion(R).
31
>> UnitQuaternion(R)
ans =
p1 =
1
1
0
>> R=roty(pi/2*180/pi)
R =
0 0 1
0 1 0
-1 0 0
>> p1p=R*p1
p1p =
0
1
-1
p1 =
1
1
0
Qp =
0 << 1, 1, 0 >>
>> R
R =
32
0 0 1
0 1 0
-1 0 0
2.- usando cuaternios. NOTA: usar la función Quaternion(). Ver manual para
usar álgebra de cuaternios.
>> Q=UnitQuaternion(R)
Q =
>> Qconj=inv(Q)
Qconj =
>> Qpp=Q*Qp*Qconj
Qpp =
>> Qpp.v
ans =
>> p1p
p1p =
0
1
-1
c) Si q es un cuaternio, probar:
1.- q.s
2.- q.v
3.- q.T
4.- q.R 5.- plot(q).
>> Qpp
33
Qpp =
>> Qpp.s
ans =
>> Qpp.v
ans =
>> Q.R
ans =
0.0000 0 1.0000
0 1.0000 0
-1.0000 0 0.0000
>> plot(Q)
>> R1=rotx(pi/6*180/pi)
R1 =
1.0000 0 0
0 0.8660 -0.5000
0 0.5000 0.8660
>> R2=roty(pi/3*180/pi)
R2 =
0.5000 0 0.8660
0 1.0000 0
-0.8660 0 0.5000
>> R=R1*R2
R =
34
0.5000 0 0.8660
0.4330 0.8660 -0.2500
-0.7500 0.5000 0.4330
>> Q1=UnitQuaternion(R1)
Q1 =
>> Q2=UnitQuaternion(R2)
Q2 =
>> Q=Q1*Q2
Q =
>> UnitQuaternion(R)
ans =
>> Qinv=inv(Q)
Qinv =
>> Q*Qinv
ans =
1 < 0, 0, 0 >
f) Hallar el cuaternio de I3 (rotación nula) NOTA: I3: matriz identidad de orden 3 (en Matlab:
“eye(3)”).
>> I3=eye(3)
35
I3 =
1 0 0
0 1 0
0 0 1
>> UnitQuaternion(I3)
ans =
1 < 0, 0, 0 >
IV INFORME.
a) Implementar una función (archivo m) que convierta de la matriz de rotación R
a representación ángulo y eje.
function [ang,eje] = rot2angeje(R,varargin)
opt.deg = false;
opt = tb_optparse(opt, varargin);
function R = rodrig2R(Rr)
%Verificamos el orden y tamaño del vector fr Rodriguez
if numel(Rr) ~= 3
error('El vector de Rodriguez debe ser de orden 3x1 ó 1x3');
end
theta = sqrt(dot(Rr,Rr));
k = Rr./theta;
skew = [0 -k(3) k(2);k(3) 0 -k(1);-k(2) k(1) 0];
36
c) Implementar una función que multiplique dos cuaternios q1 y q2.
function M = mulcuat(q1,q2)
if ~all([numel(q1) numel(q2)] == 4)
error('Los cuaternios se componen de 4 elementos');
end
d1 = size(q1);
d2 = size(q2);
if d1(1) == 4
q1 = q1';
end
if d2(1) == 4
q2 = q2';
end
M = [s1*s2-dot(v1,v2) cross(v1,v2)+s1*v2+s2*v1];
end
function Q = rot2cuat(R)
d = size(R);
if (d(1) ~= d(2) || d(1) ~= 3)
error('La matriz debe ser de orden 3x3');
end
theta = acos((trace(R)-1)/2);
k = (1/(2*sin(theta)))*[R(3,2)-R(2,3);R(1,3)-R(3,1);R(2,1)-R(1,2)];
Q = [cos(theta/2) sin(theta/2)*k'];
end
37
q = 0.5 < 0.5, 0.5, 0.5 >
>> quat2rot (0.5,0.5,0.5,0.5)
La matriz de rotación R es:
0.0000 0.0000 1.0000
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
CONCLUSIONES :
● Se puede comprobar las rotaciones de planos .
● Se comprobó que la inversas de matriz y la multiplicación de vectores
● Se pudo comprender los distintos comandos que existen para rotar y trasladar
matrices de cualquier orden
● Se entendió los códigos para trabajar con ángulos de Euler, cuaterniones.
38