10.21 쿼터니언과 축-각도(Axis-Angle) 표현의 변환

10.21 쿼터니언과 축-각도(Axis-Angle) 표현의 변환

1. 두 표현의 자연스러운 관계

쿼터니언과 축-각도 표현은 회전을 표현하는 두 가지 방법이지만, 매우 밀접하게 관련되어 있다. 단위 쿼터니언이 본질적으로 축과 각도의 정보를 인코딩하므로, 두 표현 사이의 변환이 단순한 닫힌 형태로 주어진다.

2. 축-각도 표현의 정의

축-각도 표현은 회전을 회전 축 \hat{\mathbf{u}}(단위 벡터)와 회전 각 \phi의 쌍 (\hat{\mathbf{u}}, \phi)로 나타낸다. 이는 오일러의 회전 정리(Euler’s rotation theorem)에 의해 모든 3차원 회전이 단일 축 주위의 회전으로 환원될 수 있다는 사실에 기반한다.

3. 축-각도에서 쿼터니언으로의 변환

\hat{\mathbf{u}} = (u_x, u_y, u_z)와 회전 각 \phi로부터 단위 쿼터니언은 다음과 같이 정의된다.

\mathbf{q} = (\cos(\phi/2), \sin(\phi/2)\hat{\mathbf{u}})

명시적으로

q_w = \cos(\phi/2)

q_x = \sin(\phi/2)u_x

q_y = \sin(\phi/2)u_y

q_z = \sin(\phi/2)u_z

이 공식은 쿼터니언의 정의 자체이며, 축-각도 표현에서 쿼터니언으로의 변환은 거의 직접적이다.

4. 쿼터니언에서 축-각도로의 변환

역변환은 다음과 같이 수행된다.

4.1 회전 각 추출

\phi = 2\arccos(q_w)

또는 더 수치적으로 안정적인 형태로

\phi = 2\,\mathrm{atan2}(\lVert\mathbf{q}_v\rVert, q_w)

여기서 \lVert\mathbf{q}_v\rVert = \sqrt{q_x^2 + q_y^2 + q_z^2}이다.

4.2 회전 축 추출

\hat{\mathbf{u}} = \frac{\mathbf{q}_v}{\lVert\mathbf{q}_v\rVert} = \frac{(q_x, q_y, q_z)}{\sqrt{q_x^2 + q_y^2 + q_z^2}}

또는 \sin(\phi/2)를 사용하여

\hat{\mathbf{u}} = \frac{\mathbf{q}_v}{\sin(\phi/2)}

이 두 형태는 동등하다.

5. \arccos vs. \mathrm{atan2}

회전 각 추출에서 두 가지 공식이 사용될 수 있다.

5.1 \arccos 형태

\phi = 2\arccos(q_w)

이는 직접적이지만 q_w\pm 1에 가까울 때(작은 회전 또는 180도 회전) 수치적으로 불안정하다. \arccos의 도함수가 발산하기 때문이다.

5.2 \mathrm{atan2} 형태

\phi = 2\,\mathrm{atan2}(\lVert\mathbf{q}_v\rVert, q_w)

\mathrm{atan2}는 두 인수의 비율을 사용하므로 더 안정적이다. 모든 회전 각에서 잘 작동한다.

권장: 항상 \mathrm{atan2} 형태를 사용한다.

6. 작은 회전의 처리

회전 각 \phi가 0에 가까우면 \sin(\phi/2) \approx 0이고, 회전 축 \hat{\mathbf{u}}가 결정되지 않는다. 이는 항등 회전의 경미한 특이점이다.

6.1 검출

\text{if } \lVert\mathbf{q}_v\rVert < \epsilon: \text{handle small rotation}

6.2 처리

작은 회전에서는 회전 축이 의미가 없으므로 임의의 단위 벡터(예: (1, 0, 0))를 반환한다.

if abs(qw) > 1 - epsilon:
    # 항등 회전 또는 그와 유사
    angle = 0
    axis = (1, 0, 0)  # 임의
else:
    angle = 2 * atan2(norm(qv), qw)
    axis = qv / norm(qv)

7. 도 회전의 처리

\phi = \pi인 회전에서는 q_w = 0이고 \lVert\mathbf{q}_v\rVert = 1이다. 이 경우는 특이점이 아니며, 위의 공식이 정상적으로 작동한다. 단순히 \hat{\mathbf{u}}가 단위 벡터로 결정된다.

\phi = \pi의 경우 (\hat{\mathbf{u}}, \pi)(-\hat{\mathbf{u}}, \pi)는 같은 회전을 나타낸다. 이는 축-각도 표현의 이중성이다.

8. 부호 이중성의 처리

쿼터니언의 부호 이중성(\mathbf{q}-\mathbf{q})은 축-각도로 변환할 때 영향을 준다.

8.1 \mathbf{q} = (q_w, \mathbf{q}_v)의 변환

\phi = 2\arccos(q_w), \quad \hat{\mathbf{u}} = \mathbf{q}_v / \lVert\mathbf{q}_v\rVert

8.2 -\mathbf{q} = (-q_w, -\mathbf{q}_v)의 변환

\phi' = 2\arccos(-q_w) = 2(\pi - \phi/2) = 2\pi - \phi

\hat{\mathbf{u}}' = -\mathbf{q}_v / \lVert\mathbf{q}_v\rVert = -\hat{\mathbf{u}}

따라서 -\mathbf{q}의 변환 결과는 (-\hat{\mathbf{u}}, 2\pi - \phi)이다. 이는 원래 회전과 같지만(축이 반대이고 각도가 보각), 다른 매개변수로 표현된다.

8.3 표준 형태

일관된 결과를 위해 q_w \geq 0이 되도록 부호를 정규화한다. 이렇게 하면 \phi \in [0, \pi]의 표준 범위가 보장된다.

if q.w < 0:
    q = -q

9. 회전 벡터 표현

축-각도 표현의 변형으로 회전 벡터 \boldsymbol{\phi} = \phi\hat{\mathbf{u}}를 사용할 수 있다. 이는 축과 각도를 단일 벡터로 결합한 것이다.

9.1 쿼터니언에서 회전 벡터로

\boldsymbol{\phi} = \phi\hat{\mathbf{u}} = 2\arccos(q_w)\frac{\mathbf{q}_v}{\lVert\mathbf{q}_v\rVert}

또는 더 안정적인 형태로

\boldsymbol{\phi} = \frac{2\,\mathrm{atan2}(\lVert\mathbf{q}_v\rVert, q_w)}{\lVert\mathbf{q}_v\rVert}\mathbf{q}_v

9.2 회전 벡터에서 쿼터니언으로

\phi = \lVert\boldsymbol{\phi}\rVert, \quad \hat{\mathbf{u}} = \boldsymbol{\phi}/\phi

\mathbf{q} = (\cos(\phi/2), \sin(\phi/2)\hat{\mathbf{u}})

또는 직접 회전 벡터로부터

\mathbf{q} = (\cos(\lVert\boldsymbol{\phi}\rVert/2), \sin(\lVert\boldsymbol{\phi}\rVert/2)\boldsymbol{\phi}/\lVert\boldsymbol{\phi}\rVert)

10. 변환의 효율성

축-각도와 쿼터니언 사이의 변환은 비교적 효율적이다.

10.1 축-각도 → 쿼터니언

  • 1 코사인, 1 사인, 3 곱셈
  • 총 약 5 연산 (삼각 함수 제외)

10.2 쿼터니언 → 축-각도

  • 1 atan2 (또는 1 arccos), 3 곱셈, 1 제곱근, 3 나눗셈
  • 총 약 8 연산 (삼각 함수 제외)

10.3 회전 벡터를 거치는 경로

회전 벡터는 축과 각도를 결합한 형태이므로, 회전 벡터를 사용하면 변환이 약간 단순해진다.

11. 변환의 알고리즘

11.1 축-각도에서 쿼터니언으로

function axis_angle_to_quaternion(axis, angle):
    half_angle = angle / 2
    sin_half = sin(half_angle)
    
    q.w = cos(half_angle)
    q.x = sin_half * axis.x
    q.y = sin_half * axis.y
    q.z = sin_half * axis.z
    
    return q

11.2 쿼터니언에서 축-각도로

function quaternion_to_axis_angle(q):
    norm_v = sqrt(q.x*q.x + q.y*q.y + q.z*q.z)
    
    if norm_v < epsilon:
        # 작은 회전 (항등 회전 근처)
        angle = 0
        axis = (1, 0, 0)  # 임의
    else:
        angle = 2 * atan2(norm_v, q.w)
        axis = (q.x / norm_v, q.y / norm_v, q.z / norm_v)
    
    return axis, angle

12. 변환의 응용

12.1 회전의 시각적 표현

축-각도 표현은 사용자에게 직관적이다. 회전을 “어느 축 주위로 얼마나 회전했는지“로 설명한다.

12.2 회전 명령

사용자가 “이 축 주위로 90도 회전시켜라“라고 명령할 때, 축-각도 표현이 자연스럽다. 내부적으로 쿼터니언으로 변환하여 처리한다.

12.3 자세 오차

자세 오차를 축-각도로 표현하면 회전의 크기(각도)와 방향(축)을 명확히 분리할 수 있다. 이는 자세 제어에서 유용하다.

12.4 로드리게스 공식

축-각도 표현이 로드리게스 회전 공식의 자연스러운 입력이다. 쿼터니언에서 회전 행렬로 변환할 때 중간 단계로 축-각도가 사용될 수 있다.

12.5 보간

축-각도 표현은 같은 축 주위의 회전 보간에서 자연스럽다. 회전 각만 보간하면 된다.

13. 변환의 한계

13.1 작은 회전의 특이성

회전 각이 0에 가까울 때 회전 축이 결정되지 않는다. 이는 실용적으로 큰 문제는 아니지만, 일관된 처리가 필요하다.

13.2 도 회전의 이중성

(\hat{\mathbf{u}}, \pi)(-\hat{\mathbf{u}}, \pi)가 같은 회전을 나타낸다. 표준 형태를 선택해야 한다.

13.3 표준 범위

회전 각의 범위(예: [0, \pi] 또는 [0, 2\pi))에 대한 관례가 일관되지 않을 수 있다. 사용 중인 라이브러리의 관례를 확인한다.

14. 변환의 라이브러리 지원

대부분의 회전 라이브러리가 변환을 지원한다.

14.1 Eigen

Eigen::Quaterniond q(Eigen::AngleAxisd(angle, axis));
Eigen::AngleAxisd aa(q);
Eigen::Vector3d axis_out = aa.axis();
double angle_out = aa.angle();

14.2 NumPy/SciPy

from scipy.spatial.transform import Rotation
q = Rotation.from_rotvec(angle * axis).as_quat()
rotvec = Rotation.from_quat(q).as_rotvec()

(SciPy는 회전 벡터를 사용하며, 별도의 정규화 단계가 필요 없다.)

14.3 ROS의 tf2

tf2::Quaternion q;
q.setRotation(axis, angle);
double angle_out = q.getAngle();
tf2::Vector3 axis_out = q.getAxis();

15. 변환의 정확성 검증

15.1 왕복 변환

축-각도 → 쿼터니언 → 축-각도의 결과가 원래 입력과 (특이점을 제외하고) 같아야 한다.

15.2 회전 동등성

축-각도와 쿼터니언이 같은 회전을 나타내면, 같은 벡터에 대한 회전 결과가 같아야 한다.

\mathbf{R}_{\text{axis-angle}}\mathbf{v} = \mathbf{q}\mathbf{v}\mathbf{q}^*

16. 회전 표현의 비교

표현매개변수특이점용도
축-각도4 (3 + 1)항등 회전직관적 표현
회전 벡터3항등 회전 (경미)비선형 최적화
단위 쿼터니언4부호 이중성자세 추정, 보간

축-각도와 쿼터니언은 매우 밀접하게 관련되어 있으며, 변환이 단순하다. 회전 벡터는 축과 각도를 결합한 또 다른 형태이다.

17. 참고 문헌

  • Hamilton, W. R. (1844). “On Quaternions; or on a New System of Imaginaries in Algebra.” Philosophical Magazine, Vol. 25, 489–495.
  • Diebel, J. (2006). “Representing Attitude: Euler Angles, Unit Quaternions, and Rotation Vectors.” Stanford University Technical Report.
  • Shoemake, K. (1985). “Animating Rotation with Quaternion Curves.” SIGGRAPH Computer Graphics, 19(3), 245–254.
  • Kuipers, J. B. (1999). Quaternions and Rotation Sequences. Princeton University Press.
  • Sola, J. (2017). “Quaternion Kinematics for the Error-State Kalman Filter.” arXiv:1711.02508.

version: 1.0