lastnamesong

[Coordinate] 오일러 각 (Euler Angle) 본문

Robotics/Geometry

[Coordinate] 오일러 각 (Euler Angle)

응솩이 2023. 10. 6. 10:06
반응형

앞서 물체와 좌표계의 위치와 관련된 정보를 나타내기 위해 rotation matrix에 대한 내용을 정리했다. 이런 rotation matrix를 표현하기 위한 방법으로 다양한 방법이 존재한다. 항공기, 드론 제어 등에서 많이 볼 수 있는 roll-pitch-yaw (RPY), 쿼터니언 (quaternion) 등이 대표적이며 이번 글에서는 그 방법 중 하나인 Euler angle (오일러 각)에 대해 공부해본다.


- Euler Angle

위키피디아에 따르면, Euler angle은 강체가 놓인 방향을 3차원 공간에 표시하기 위해 도입된 세 개의 각도이다. 여기서 주목할 점이 세 개의 각도라는 것이다. 이는 rotation matrix를 표현하는 제일 간결한 표현방법이며, 세 개의 변수만 있으면 거의 모든 회전을 표현할 수 있다는 의미를 갖는다. 거의라는 표현을 사용한 이유는 이후에 설명할 짐벌락 (Gimbal lock)에 의한 한계가 존재하기 때문이다.

Modern Robotics의 Fig. 3.33을 참고

- Euler Angle to Rotation Matrix

위에 있는 그림에서 reference frame (\(x_{0}, y_{0}, z_{0}\) 으로 표현된 좌표계)에서 frame 3 (\( {3} \)으로 표현.)으로의 회전을 표현하기 위해서 어떤 방법을 생각해볼 수 있을까?

앞서 공부했던 연속적인 회전 변환을 통해 \( \left\{ 0 \right\} \)에서 \( \left\{ 1 \right\} \)로, \( \left\{ 1 \right\} \)에서 \( \left\{ 2 \right\} \)로, \( \left\{ 2 \right\} \)에서 \( \left\{ 3 \right\} \)으로 순서대로 하는 변환을 생각해볼 수 있다.

$$ R^{0}_{3} = R^{0}_{1} R^{1}_{2} R^{2}_{3} = Rot(z,\alpha) Rot(y,\beta)  Rot(x,\gamma) $$

각 축 방향 회전 변환에 대해서는 공부했고, 행렬 연산을 수행하게 되면 다음과 같은 결과를 얻을 수 있다.

$$ \begin{bmatrix} cos\alpha cos\beta & cos\alpha sin\beta sin\gamma - sin\alpha cos\gamma & cos\alpha sin\beta cos\gamma + sin\alpha sin\gamma \\ sin\alpha cos\beta & sin\alpha sin\beta sin\gamma + cos\alpha cos\gamma & sin\alpha sin\beta cos\gamma - cos\alpha sin\gamma \\ -sin\beta & cos\beta sin\gamma & cos\beta \cos\gamma \end{bmatrix} $$

Euler angle은 회전하는 회전축의 순서에 따라 ZYX (위에서 소개한 그림에 해다), XYZ, ZYZ 등등 다양하게 쓸 수 있다.

- Rotation Matrix to Euler Angle

위에서 rotation matrix를 구했던 것을 바탕으로, 임의의 rotation matrix가 주어지면 ZYX 순서에 해당하는 eleuer angle을 구할 수 있다 (다른 순서에 대해서는 그 순서에 맞게 Euler angle to rotation matrix를 안다면 역으로 구할 수 있을 것).

임의의 rotation matrix \( R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r{32} & r_{33} \end{bmatrix} \)에 대해, ZYX Euler angle을 구하는 것은 rotation matrix의 첫 번 째 열을 확인하는 것부터 시작한다. 위에서 구한 rotation matrix에서 볼 수 있듯, 그나마 가장 간단하다 심지어 항이 하나 (\( -sin\beta \))밖에 없는 원소도 존재한다.

$$ \begin{bmatrix} r_{11} \\ r_{21} \\ r_{31} \end{bmatrix} = \begin{bmatrix} cos\alpha cos\beta \\ sin\alpha cos\beta \\ -sin\beta \end{bmatrix} $$

코사인과 사인을 제곱해서 더하면 1이 된다는 점을 통해 첫 번째, 두 번째 열의 제곱합을 표현할 수 있다.

$$ r_{11}^2 + r_{21}^2 = cos^{2}\alpha cos^{2}\beta + sin^{2}\alpha cos^{2}\beta = ( cos^{2}\alpha + sin^{2}\alpha )cos^{2}\beta = cos^{2}\beta $$

이로써 \( \beta \)의 사인, 코사인을 \( r_{11}, r_{21}, r_{31} \)에 관련된 식으로 쓸 수 있다.

$$ \begin{matrix} cos\beta = \pm\sqrt{r_{11}^{2} + r_{21}^{2}}, & sin\beta = -r_{31}\end{matrix}  $$

이를 이용해 \( tan\beta = \frac{-r_{31}}{\pm\sqrt{r_{11}^{2} + r_{21}^{2}}} \)를 구할 수 있으며 \( tan^{-1} \) (아크탄젠트)으로 \( \beta \)를 구할 수 있다. 이때 프로그래밍 언어에서는 atanatan2를 통해 \( tan^{-1} \)을 계산한다.

각각의 디테일한 차이에 대해서는 다른 글에서 자세하게 다루도록 하고, 우리의 application에서는 atan 대신 atan2를 이용해 아크탄젠트를 구한다는 것을 알아두면 되겠다. (간단하게 이야기하자면, \( atan(\frac{y}{x}) = atan(\frac{-y}{-x}) \)이고, \( atan2(y,x) \neq atan2(-y,-x) \)이다.)

이러면 이제 \( tan\beta \)의 분모인 \( \sqrt{r_{11}^{2} + r_{21}^{2}} \)가 \( 0\)일 때와 \( 0\)이 아닐 때로 나누어 Euler angle을 구해볼 수 있다.

 

1)  \( \sqrt{r_{11}^{2} + r_{21}^{2}} \neq 0 \)

분모가 양수 (\( \sqrt{r_{11}^{2} + r_{21}^{2}}) \))일때와, 음수 (\( -\sqrt{r_{11}^{2} + r_{21}^{2}}) \))일때로 나누어 생각해볼 수 있다.

 

① \( \beta = atan2(-r_{31}, \sqrt{r_{11}^{2} + r_{21}^{2}}) \)

분모가 양수이기 때문에 제 1, 4 사분면에 위치한다. 때문에 \( \beta \)의 범위는 \( -frac{\pi}{2} \)부터  \( frac{\pi}{2} \)의 범위를 갖는다.

분자의 부호까지 알면 정확하게 어떤 사분면에 있는지 알 수 있을 것이다.

 

② \( \beta = atan2(-r_{31}, -\sqrt{r_{11}^{2} + r_{21}^{2}}) \)

반대로 분모가 음수이기 때문에 제 2, 3 사분면에 위치한다. 때문에 \( \beta \)의 범위는 \( (\frac{\pi}{2}, \pi) \), \( (-\pi, \frac{\pi}{2}) \)이다. (atan2의 출력 범위는 \( [-\pi, \pi] \))

\( \alpha \)와 \( \gamma \)는 각각 \( r_{21} /  r_{11} \), \( r_{32} / r{33} \)으로 구할 수 있다.

$$ \begin{matrix} \alpha = atan2(r_{21}, r_{11}), & \gamma = atan2(r_{32}, r_{33}) \end{matrix} $$

 

2)  \( \sqrt{r_{11}^{2} + r_{21}^{2}} = 0 \)

이렇게 되면 \( cos\beta = 0 \)이라는 것이므로 \( \beta = \pm 90^{\circ} \)가 된다. 두 개의 회전 축이 겹쳐져버리는 짐벌락 (Gimbal lock) 현상이 이 때 발생한다. 때문에 과거에는 제어를 위해 Euler angle을 사용할 때에 90도로 제어하지 않고, 89도나 90.5도와 같이 매우 작은 차이를 주어 제어를 했다고 한다.

 

① \( \beta = 90^{\circ} \)

$$ r_{22}=sin\alpha sin\beta sin\gamma + cos\alpha cos\gamma = sin\alpha sin\gamma + cos\alpha cos\gamma = cos(\alpha - \gamma) $$

② \( \beta = -90^{\circ} \)

$$ r_{22}=sin\alpha sin\beta sin\gamma + cos\alpha cos\gamma = -sin\alpha sin\gamma + cos\alpha cos\gamma = cos(\alpha + \gamma)$$

- MATLAB Examples

Euler angle과 rotation matrix 사이의 변환을 rotm2eul, eul2rotm 함수를 이용해 수행할 수 있다. 이 때 변환의 sequence는 rotm2eul(rotm, sequence), eul2rotm(eul, sequence)로 설정할 수 있으며, 따로 설정하지 않으면 ZYX로 변환을 수행한다. 


Euler angle의 정의와 rotation matrix와 Euler angle 사이의 변환을 알아보았다. MATLAB 함수를 이용해서도 변환이 가능함을 확인했으며, Gimbal lock 현상과 아크탄젠트 등의 내용 또한 간단하게 소개하였다. Euler angle은 3D 자세 표현의 핵심 도구 중 하나로, 그 활용은 다방면에 걸쳐 있다. 하지만 그 사용에는 주의가 필요하며, 다른 자세 표현 방법과 함께 고려해야 할 요소들이 있다.

반응형