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