1.3 Rotation in 3D
3D의 경우 2D에서 $z$-축이 추가된다. 방향은 right-hand rule을 따른다. 축에 평행한 단위 벡터들을 $\hat{\textbf{x}},\hat{\textbf{y}},\hat{\textbf{z}}$라고 하면,
\[\begin{align*} \hat{\textbf{z}} &= \hat{\textbf{x}} \times \hat{\textbf{y}} \\ \hat{\textbf{x}} &= \hat{\textbf{y}} \times \hat{\textbf{z}} \\ \hat{\textbf{y}} &= \hat{\textbf{z}} \times \hat{\textbf{x}} \\ \end{align*} \tag{ $ 1 $ }\]점 $\textbf{P}$는 좌표 $(x,y,z)$ 또는 벡터
\[\textbf{p} = x\hat{\textbf{x}} + y\hat{\textbf{y}}+z\hat{\textbf{z}}\]로 표현된다.
1.3.1 Orientation in 3D
3D에서는 더 이상 rotation이 commutative가 아니다. 이제부턴 rotation의 순서가 중요해진다.
Orthonormal Rotational Matrix
2D에서와 마찬가지다. $3 \times 3$ orthonormal matrix ${}^{A}\textbf{R}_{B}$를 이용해 frame $\{B \}$에서 표현된 벡터를 frame $\{A \}$에서 표현하려면
\[\begin{bmatrix} {}^A x \\ {}^A y \\ {}^A z \\ \end{bmatrix} = {}^A \textbf{R}_B \begin{bmatrix} {}^B x \\ {}^B y \\ {}^B z \\ \end{bmatrix}\]Orthonormal Rotation matrix의 성질
이하 내용은 Sec. 1.2의 2D 내용과 같다.
\[{}^X \textbf{R}_Y\]는 2D rotational matrix로 다음 성질들을 갖는다.
-
Orthonormal. 즉, 각 column들은 unit vector이며 orthogonal이다.
-
각 column들은 frame $X$에 대하여 회전된 frame $Y$의 축을 정의한다.
-
이 matrix는 special orthogonal group에 속한다. 즉 $\textbf{R} \in SO(3) \subset \mathbb{R}^{3 \times 3}$
-
Determinant는 $+1$이다. 따라서 변환 이후에도 벡터의 길이는 변하지 않는다. 즉, $\Vert {}^Y \textbf{p} \Vert = \Vert {}^X \textbf{p} \Vert, \forall \theta$
-
Inverse는 transpose와 같다. 즉, $\textbf{R}^{-1} = \textbf{R}^T$
$x$-, $y$-, $z$-축에 관한 각도 $\theta$만큼의 orthonormal rotation matrix는 다음과 같다.
\[\begin{align*} R_x(\theta) &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos(\theta) & -\sin(\theta) \\ 0 & \sin(\theta) & \cos(\theta) \\ \end{bmatrix} \\ \\ R_y(\theta) &= \begin{bmatrix} \cos(\theta) & 0 & \sin(\theta) \\ 0 & 1 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) \\ \end{bmatrix} \\ \\ R_z(\theta) &= \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \\ \end{align*}\]Robotics Toolbox - Rotational Matrix
$\textbf{R}_x(\theta)$를 계산하는 함수는,
R = rotx(pi/2)
R =
1.0000 0 0
0 0.0000 -1.0000
0 1.0000 0.0000
단위가 deg인 것에 주의.1 마찬가지로 roty
, rotz
함수도 존재.
그래프로 좌표계를 보고싶다면
trplot(R)
또, 직접 회전하는 모습을 볼 수도 있다.
tranimate(R)
Rotational matrix의 composition.
R = rotx(pi/2) * roty(pi/2)
S = roty(pi/2) * rotx(pi/2)
R =
0.0000 0 1
1 0.0000 0.0000
0.0000 1 0.0000
S =
0.0000 1 0.0000
0 0.0000 -1
-1 0.0000 0.0000
합성의 순서를 바꾸면 값이 달라짐을 알 수 있다.
Reading an Orthonormal Rotation Matrix
왼쪽부터 오른쪽으로 column을 읽어나가면, 새로운 frame의 축 방향을 현재 좌표계에 대해 읽을 수 있다. 예를 들어,
\[R= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 1 \\ \end{bmatrix}\]이라고 하자. 그러면 $R$에 의해 새로 만들어지는 frame의 $x$-축은 기존의 $x$-방향 $(1,0,0)$과 같다. $y$-축은 기존의 $(0,0,1)$과 같은 방향이고, $z$-축은 기존의 $(0,-1,0)$과 같은 방향이다.
1.3.2 Euler’s Rotation Theorem
임의의 rotation은 좌표축에 대한 최대 세 개의 rotation으로 나타낼 수 있다. 이때, 같은 축에 대해 두 번 연속되는 rotation이 없어야 한다.
여기서 두 class의 rotation sequence가 등장한다.
-
하나의 특정한 축을 반복해서 사용.: $XYX, XZX, YXY, YZY, ZXZ, ZYZ$
-
모든 세 축을 사용.: $XYZ, XZY, YZX, YXZ, ZXY, ZYX$
예를 들어, $ZYZ$ sequence는
\[\textbf{R} = \textbf{R}_z(\phi)\textbf{R}_y(\theta)\textbf{R}_z(\psi) \tag{ $ 2 $ }\]형태로 항공역학이나 동역학에서 자주 쓰이는 형태이다. Toolbox에서도 사용.
Robotics Toolbox - ZYZ Euler Angle
Euler angle은 3-vector $\mathbf{\Gamma} = (\phi, \theta, \psi)$.
Rotation matrix $\mathbf{\Gamma} = (0.1, 0.2, 0.3)$을 계산하고 싶다면,
R = rotz(0.1)) * roty(0.2) * rotz(0.3)
R = eul2r(0.1, 0.2, 0.3)
R =
0.9021 -0.3836 0.1977
0.3875 0.9216 0.0198
-0.1895 0.0587 0.9801
어느 쪽이든 같은 결과가 도출. 역방향을 계산하고 싶다면,
gamma = tr2eul(R)
gamma =
0.1000 0.2000 0.3000
또, 만약 $\theta$가 음수라면,
R = eul2r(0.1, -0.2, 0.3)
gamma = tr2eul(R)
R =
0.9021 -0.3836 -0.1977
0.3875 0.9216 -0.0198
0.1895 -0.0587 0.9801
gamma =
-3.0416 0.2000 -2.8416
$\theta$ 값은 양수로 나오는데다 $\phi$, $\psi$값은 이상한 값이 나온다. 그러나 이를 다시 Euler angle로 바꾸면,
eul2r( gamma )
ans =
0.9021 -0.3836 -0.1977
0.3875 0.9216 -0.0198
0.1895 -0.0587 0.9801
제대로 복구가 되는 모습을 볼 수 있다.
즉, 두 개의 다른 Euler angle set이 같은 rotation matrix를 가리킬 수 있다는 뜻! Rotation matrix에서 Euler angle로의 mappin은 유일하지 않으며, toolbox에서는 항상 $\theta$가 양수인 방향으로 return.
유사한 case로, $\theta=0$일 때,
R = eul2r( 0.1, 0, 0.3)
R =
0.9211 -0.3894 0
0.3894 0.9211 0
0 0 1.0000
역함수는
tr2eul(R)
ans =
0 0 0.4000
답이 이렇게 나오는 이유는 $\theta=0$일 때, $\textbf{R}_y = \textbf{I}$이므로, 식 $(2)$는
\[\textbf{R} = \textbf{R}_z(\phi) \textbf{R}_z(\psi) = \textbf{R}_z(\phi + \psi)\]가 되기 때문이다. 따라서 이런 경우에 inverse operation은 별로 도움이 되지 않는다.
$\theta=0$인 경우를 singularity라고 한다.
ZYX Euler Angle
Roll, pitch, yaw. 이들을 $ZYX$ 또는 $XYZ$로 나타낸다. $ZYX$를 쓰면,
\[\textbf{R} = \textbf{R}_z(\theta_y)\textbf{R}_y(\theta_p)\textbf{R}_x(\theta_r) \tag{ $ 3 $ }\]반대로 $XYZ$는
\[\textbf{R} = \textbf{R}_x(\theta_y)\textbf{R}_y(\theta_p)\textbf{R}_z(\theta_r) \tag{ $ 4 $ }\]Robotics Toolbox - ZYX Angle
Toolbox는 기본적으로 $ZYX$를 사용하지만, ‘xyz’ 옵션이 존재.
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
gamma = tr2rpy(R)
gamma =
0.1000 0.2000 0.3000
Robotics Toolbox - tripleangle
Euler angle과 roll-pitch-yaw angle을 실험할 수 있는 툴박스.
tripleangle
1.3.3 Sigularities and Gimbal Lock
Euler angle representation의 문제 중 하나는 singularity. Gimbal lock이라고도 한다. 이 현상은 angle sequence의 가운데 성분 때문에 발생한다.
가운데 gimbal이 $90^{\circ}$를 이룬다고 하자. 그러면 안쪽 gimbal과 바깥쪽 gimbal의 축이 일치하게 되고, 이제 가능한 회전축이 두 개로 줄어들게 된다.2
수학적으로 표현해보자. $ZYX$- angle로 표현한 platform frame $\{A \}$에 대한 비행기의 body-fixed frame $\{B \}$는
\[{}^A \textbf{R}_B = \textbf{R}_Z(\alpha)\textbf{R}_Y(\beta)\textbf{R}_X(\gamma)\]Matrix multiplication으로 어찌저찌 계산하면,
\[{}^A \textbf{R}_B = {}^A \textbf{R}_B(\alpha, \beta, \gamma) = \\ \begin{bmatrix} c \alpha c \beta & c \alpha s \beta s \gamma - s \alpha c \gamma & c \alpha s \beta c \gamma + s \alpha s \gamma \\ s \alpha c \beta & s \alpha s \beta s \gamma + c \alpha c \gamma & s \alpha s \beta c \gamma - c \alpha s \gamma \\ -s\beta & c \beta s \gamma & c \beta c \gamma \end{bmatrix}\]여기서 $c \alpha$는 $\cos{\alpha}$, $s \beta$는 $\sin{\beta}$를 줄여서 쓴 것.
Gimbal lock이 발생하는 경우는 두 번째 gimbal의 각도 $\beta = 90^{\circ}$인 경우. 이 때 $c \beta = 0$, $s \beta = 1$이고, 위 행렬은
\[{}^A \textbf{R}_B = \begin{bmatrix} 0 & c \alpha s \gamma - s \alpha c \gamma & c \alpha c \gamma + s \alpha s \gamma \\ 0 & s \alpha s \gamma + c \alpha c \gamma & s \alpha c \gamma - c \alpha s \gamma \\ -1 & 0 & 0 \end{bmatrix} = \begin{bmatrix} 0 & -s(\alpha - \gamma) & c(\alpha - \gamma) \\ 0 & c(\alpha - \gamma) & s(\alpha - \gamma) \\ -1 & 0 & 0 \\ \end{bmatrix}\]즉, $(\alpha - \gamma)$만이 정의된다. 이걸로는 $\alpha$, $\gamma$의 값이 각각 어떤지 알 수 없어진다. 둘 사이의 관계만 알 수 있을 뿐.
R = rpy2r(10, 90, 30); % roll, pitch, yaw가 각각 10, 90, 30도인 rotation matrix
tr2rpy(R) % rotation matrix를 다시 Euler angle로 변환
ans =
32.9578 63.3798 98.8734