Robótica

Pose em 3 dimensões

Matriz Ortonormal de Rotação
R é a matriz que rotaciona θ graus em torno do eixo especificado.
R = rotx(pi/2)
R =
1.0000 0 0 0 0.0000 -1.0000 0 1.0000 0.0000
roty e rotz realizam as rotações em torno de y e z, respectivamente. Para plotar, temos:
trplot(R)
Podemos animar a rotação desta forma:
tranimate(R)
Observe que as colunas das matrizes de rotação nos dá a direção do frame atual com relação ao frame antigo. Por exemplo, (1,0,0) mostra que o eixo x está invariante, (0,0,1) mostra que o atual eixo y coincide com o antigo eixo z e (0,-1,0) mostra que o atual eixo z corresponde ao antigo eixo y invertido.
Ângulos de Euler:
Convencionamos a rotação euleriana ZYZ:
R = rotz(0.1) * roty(0.2) * rotz(0.3)
R =
0.9021 -0.3836 0.1977 0.3875 0.9216 0.0198 -0.1898 0.0587 0.9801
R = eul2r(0.1,0.2,0.3)
R =
0.9021 -0.3836 0.1977 0.3875 0.9216 0.0198 -0.1898 0.0587 0.9801
O problema inverso é determinar os ângulos a partir da matriz de rotação:
gamma = tr2eul(R)
gamma =
0.1000 0.2000 0.3000
como o mapeamento entre os ângulos Γe a matriz R não é biunívuco, a função tr2eul só retorna valores positivos de θ:
R = eul2r(0.1 , -0.2, 0.3)
R =
0.9021 -0.3836 -0.1977 0.3875 0.9216 -0.0198 0.1898 -0.0587 0.9801
gamma = tr2eul(R)
gamma =
-3.0416 0.2000 -2.8416
eul2r(gamma)
ans =
0.9021 -0.3836 -0.1977 0.3875 0.9216 -0.0198 0.1898 -0.0587 0.9801
Um caso interessante é com :
R = eul2r(0.1 , 0, 0.3)
R =
0.9211 -0.3894 0 0.3894 0.9211 0 0 0 1.0000
gamma = tr2eul(R)
gamma =
0 0 0.4000
Observe que, com a omissão de θ, o que temos são duas rotações sucessivas em torno de .
Para a convenção roll, pitch e yah, temos:
R = rpy2r(0.1, 0.2, 0.3)
R =
0.9363 -0.2751 0.2184 0.2896 0.9564 -0.0370 -0.1987 0.0978 0.9752
rpy = tr2rpy(R)
rpy =
0.1000 0.2000 0.3000
Representação de dois vetores
a = [1 0 0]';
o = [0 1 0]';
oa2r(o, a)
ans =
0 0 1 0 1 0 -1 0 0
Rotação em torno de um vetor arbitrário
Ao girar o frame "0" ao redor do vetor "v", θ graus, encontramos a matriz R:
[theta, v] = tr2angvec(R)
theta = 0.3655
v =
0.1886 0.5834 0.7900
Observe:
[v,lambda] = eig(R)
v =
-0.6944 + 0.0000i -0.6944 + 0.0000i 0.1886 + 0.0000i 0.0792 + 0.5688i 0.0792 - 0.5688i 0.5834 + 0.0000i 0.1073 - 0.4200i 0.1073 + 0.4200i 0.7900 + 0.0000i
lambda =
0.9339 + 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.9339 - 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i
Uma matriz de rotação ortonormal sempre possui um par de autovalores complexos e um autovalor real.
O par de autovalores complexos é da forma , onde θ é o ângulo de rotação.
O autovetor correpondente ao autovalor real é o eixo de rotação. Esse vetor é invariante pela operação de rotação.
R = angvec2r(pi/2, [1 0 0])
R =
1.0000 0 0 0 0.0000 -1.0000 0 1.0000 0.0000
Quatérnios
q = UnitQuaternion(rpy2tr(0.1, 0.2 , 0.3))
q = 0.98335 < 0.034271, 0.10602, 0.14357 >
Multiplicação pelo inverso:
q*inv(q)
ans = 1 < 0, 0, 0 >
Que é a identidade, ou rotação nula.
q.R
ans =
0.9363 -0.2751 0.2184 0.2896 0.9564 -0.0370 -0.1987 0.0978 0.9752
É a representação em termos de matrizes de rotação. Podemos visualizar através de
q.plot()
E um vetor é rotacionado através de um quatérnio usando
q*[1 0 0]'
ans =
0.9363 0.2896 -0.1987
Combinando rotações e translações:
T = transl(1, 0, 0) * trotx(pi/2) * transl(0, 1, 0)
T =
1.0000 0 0 1.0000 0 0.0000 -1.0000 0.0000 0 1.0000 0.0000 1.0000 0 0 0 1.0000
trplot(T)
Parte rotacional:
t2r(T)
ans =
1.0000 0 0 0 0.0000 -1.0000 0 1.0000 0.0000
Parte translacional:
transl(T)'
ans =
1.0000 0.0000 1.0000