10.13 쿼터니언 기반 벡터 회전 공식의 유도
1. 회전 공식의 진술
3차원 벡터 \mathbf{v}를 단위 쿼터니언 \mathbf{q}로 회전한 결과는 다음의 공식으로 주어진다.
\mathbf{v}' = \mathbf{q}\mathbf{v}\mathbf{q}^*
여기서
- \mathbf{q}: 회전을 표현하는 단위 쿼터니언
- \mathbf{v}: 회전할 3차원 벡터, 순수 벡터 쿼터니언 (0, \mathbf{v})로 표현
- \mathbf{q}^*: \mathbf{q}의 켤레
이 공식이 회전을 정확히 표현함을 본 절에서 유도한다.
2. 순수 벡터 쿼터니언
3차원 벡터 \mathbf{v} = (v_x, v_y, v_z)를 쿼터니언으로 표현할 때, 스칼라 부분이 0인 순수 벡터 쿼터니언으로 표현한다.
\mathbf{v}_q = (0, \mathbf{v}) = 0 + v_x i + v_y j + v_z k
이 쿼터니언은 4 성분이지만 첫 성분이 0이므로 실질적으로 3차원 벡터와 동일시된다.
3. 회전 공식의 유도 단계
3.1 단계 1: \mathbf{q}\mathbf{v}_q의 계산
먼저 \mathbf{q} = (q_w, \mathbf{q}_v)와 \mathbf{v}_q = (0, \mathbf{v})의 곱을 계산한다. 쿼터니언 곱 공식을 적용하면
\mathbf{q}\mathbf{v}_q = (q_w \cdot 0 - \mathbf{q}_v \cdot \mathbf{v}, q_w\mathbf{v} + 0 \cdot \mathbf{q}_v + \mathbf{q}_v \times \mathbf{v})
= (-\mathbf{q}_v \cdot \mathbf{v}, q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v})
이 결과는 일반적으로 순수 벡터 쿼터니언이 아니다(스칼라 부분이 비영).
3.2 단계 2: (\mathbf{q}\mathbf{v}_q)\mathbf{q}^*의 계산
다음으로 위 결과에 \mathbf{q}^* = (q_w, -\mathbf{q}_v)를 곱한다. 다시 쿼터니언 곱 공식을 적용한다.
\mathbf{a} = (a_w, \mathbf{a}_v) = (-\mathbf{q}_v \cdot \mathbf{v}, q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v})이고 \mathbf{b} = \mathbf{q}^* = (q_w, -\mathbf{q}_v)일 때
\mathbf{a}\mathbf{b} = (a_w b_w - \mathbf{a}_v \cdot \mathbf{b}_v, a_w \mathbf{b}_v + b_w \mathbf{a}_v + \mathbf{a}_v \times \mathbf{b}_v)
3.2.1 스칼라 부분
a_w b_w - \mathbf{a}_v \cdot \mathbf{b}_v = (-\mathbf{q}_v \cdot \mathbf{v})q_w - (q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v}) \cdot (-\mathbf{q}_v)
= -q_w(\mathbf{q}_v \cdot \mathbf{v}) + q_w(\mathbf{v} \cdot \mathbf{q}_v) + (\mathbf{q}_v \times \mathbf{v}) \cdot \mathbf{q}_v
첫 두 항은 상쇄되고(\mathbf{q}_v \cdot \mathbf{v} = \mathbf{v} \cdot \mathbf{q}_v), 세 번째 항은 0이다((\mathbf{a} \times \mathbf{b}) \cdot \mathbf{a} = 0).
따라서 스칼라 부분은 0이다. 이는 결과가 순수 벡터 쿼터니언임을 의미한다.
3.2.2 벡터 부분
a_w \mathbf{b}_v + b_w \mathbf{a}_v + \mathbf{a}_v \times \mathbf{b}_v
= (-\mathbf{q}_v \cdot \mathbf{v})(-\mathbf{q}_v) + q_w(q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v}) + (q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v}) \times (-\mathbf{q}_v)
각 항을 정리하자.
3.2.3 첫 번째 항
(-\mathbf{q}_v \cdot \mathbf{v})(-\mathbf{q}_v) = (\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
3.2.4 두 번째 항
q_w(q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v}) = q_w^2\mathbf{v} + q_w(\mathbf{q}_v \times \mathbf{v})
3.2.5 세 번째 항
(q_w\mathbf{v} + \mathbf{q}_v \times \mathbf{v}) \times (-\mathbf{q}_v) = -q_w(\mathbf{v} \times \mathbf{q}_v) - (\mathbf{q}_v \times \mathbf{v}) \times \mathbf{q}_v
\mathbf{v} \times \mathbf{q}_v = -(\mathbf{q}_v \times \mathbf{v})이고 BAC-CAB 공식을 사용하면
(\mathbf{q}_v \times \mathbf{v}) \times \mathbf{q}_v = \mathbf{v}(\mathbf{q}_v \cdot \mathbf{q}_v) - \mathbf{q}_v(\mathbf{q}_v \cdot \mathbf{v}) = \lVert\mathbf{q}_v\rVert^2\mathbf{v} - (\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
따라서 세 번째 항은
q_w(\mathbf{q}_v \times \mathbf{v}) - \lVert\mathbf{q}_v\rVert^2\mathbf{v} + (\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
3.2.6 모든 항의 결합
세 항을 모두 더하면
(\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v + q_w^2\mathbf{v} + q_w(\mathbf{q}_v \times \mathbf{v}) + q_w(\mathbf{q}_v \times \mathbf{v}) - \lVert\mathbf{q}_v\rVert^2\mathbf{v} + (\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
= 2(\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v + (q_w^2 - \lVert\mathbf{q}_v\rVert^2)\mathbf{v} + 2q_w(\mathbf{q}_v \times \mathbf{v})
이것이 회전된 벡터 \mathbf{v}'의 명시적 형태이다.
4. 결과의 정리
\mathbf{v}' = (q_w^2 - \lVert\mathbf{q}_v\rVert^2)\mathbf{v} + 2q_w(\mathbf{q}_v \times \mathbf{v}) + 2(\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
5. 단위 쿼터니언으로의 대입
이제 단위 쿼터니언 \mathbf{q} = (\cos(\phi/2), \sin(\phi/2)\hat{\mathbf{u}})를 대입하여 회전 공식과 비교한다.
q_w = \cos(\phi/2)
\mathbf{q}_v = \sin(\phi/2)\hat{\mathbf{u}}
\lVert\mathbf{q}_v\rVert^2 = \sin^2(\phi/2)
5.1 첫 번째 계수
q_w^2 - \lVert\mathbf{q}_v\rVert^2 = \cos^2(\phi/2) - \sin^2(\phi/2) = \cos\phi
이는 이중각 공식 \cos\phi = \cos^2(\phi/2) - \sin^2(\phi/2)이다.
5.2 두 번째 계수
2q_w\mathbf{q}_v = 2\cos(\phi/2)\sin(\phi/2)\hat{\mathbf{u}} = \sin\phi\hat{\mathbf{u}}
이는 이중각 공식 \sin\phi = 2\sin(\phi/2)\cos(\phi/2)이다.
5.3 세 번째 계수
2(\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v = 2\sin^2(\phi/2)(\hat{\mathbf{u}} \cdot \mathbf{v})\hat{\mathbf{u}}
2\sin^2(\phi/2) = 1 - \cos\phi이므로
= (1 - \cos\phi)(\hat{\mathbf{u}} \cdot \mathbf{v})\hat{\mathbf{u}}
5.4 결합
이러한 항을 결합하면
\mathbf{v}' = \mathbf{v}\cos\phi + (\hat{\mathbf{u}} \times \mathbf{v})\sin\phi + (\hat{\mathbf{u}} \cdot \mathbf{v})\hat{\mathbf{u}}(1 - \cos\phi)
이는 정확히 로드리게스 회전 공식이다. 따라서 \mathbf{q}\mathbf{v}\mathbf{q}^*가 축 \hat{\mathbf{u}} 주위의 각도 \phi 회전을 산출함이 증명되었다.
6. 회전 공식의 직관적 해석
쿼터니언 곱 \mathbf{q}\mathbf{v}\mathbf{q}^*가 회전을 표현하는 직관은 다음과 같이 이해할 수 있다.
6.1 “절반의 회전“의 두 번 적용
쿼터니언 \mathbf{q}는 회전 각의 절반(\phi/2)을 인코딩한다. \mathbf{q}\mathbf{v}는 \phi/2의 회전을 적용하지만, 결과가 일반 쿼터니언이 된다. \mathbf{q}^*를 추가로 곱하면 또 다른 \phi/2의 회전이 적용되어 총 \phi의 회전이 된다.
6.2 켤레의 역할
켤레 \mathbf{q}^*가 곱셈에서 “보정” 역할을 한다. 결과가 다시 순수 벡터 쿼터니언이 되도록 하며, 동시에 회전이 두 배의 효과를 가지게 한다.
6.3 행렬 형태와의 비교
회전 행렬 \mathbf{R}로 벡터를 회전하는 것은 단순한 행렬-벡터 곱 \mathbf{R}\mathbf{v}이다. 쿼터니언으로 회전하는 것은 두 번의 쿼터니언 곱 \mathbf{q}\mathbf{v}\mathbf{q}^*이다. 두 방법은 같은 결과를 산출하지만, 계산 과정이 다르다.
7. 회전 공식의 효율성
쿼터니언으로 벡터를 회전하는 계산 비용은 다음과 같다.
7.1 직접 계산
두 번의 쿼터니언 곱이 필요하다.
- 첫 번째 곱 (\mathbf{q}\mathbf{v}_q): 16 곱셈 + 12 덧셈
- 두 번째 곱 ((\mathbf{q}\mathbf{v}_q)\mathbf{q}^*): 16 곱셈 + 12 덧셈
총 32 곱셈, 24 덧셈이다. 그러나 첫 번째 인수가 순수 벡터 쿼터니언이라는 점을 이용한 최적화로 더 줄일 수 있다.
7.2 최적화된 형태
위에서 유도한 명시적 형태
\mathbf{v}' = (q_w^2 - \lVert\mathbf{q}_v\rVert^2)\mathbf{v} + 2q_w(\mathbf{q}_v \times \mathbf{v}) + 2(\mathbf{q}_v \cdot \mathbf{v})\mathbf{q}_v
를 직접 사용하면 약 15 곱셈, 15 덧셈으로 줄어든다.
7.3 회전 행렬 곱과의 비교
회전 행렬 곱 \mathbf{R}\mathbf{v}는 9 곱셈, 6 덧셈이다. 회전 행렬을 미리 계산해 두면 점 변환에서는 회전 행렬이 더 효율적이다.
따라서 다음의 일반적 패턴이 사용된다.
- 회전을 저장: 단위 쿼터니언 (4 성분)
- 점 변환: 쿼터니언을 회전 행렬로 한 번 변환 후 점에 곱셈 적용
8. 회전 합성에서의 효율성
여러 회전을 누적하는 경우 쿼터니언이 회전 행렬보다 효율적이다.
8.1 쿼터니언 곱
16 곱셈 + 12 덧셈 = 28 연산
8.2 회전 행렬 곱
27 곱셈 + 18 덧셈 = 45 연산
쿼터니언 곱이 약 60% 더 빠르다. 또한 메모리 사용도 4 성분 대 9 성분이므로 더 적다.
9. 회전 공식의 검증
유도된 회전 공식을 단순한 경우로 검증할 수 있다.
9.1 항등 회전
\mathbf{q} = (1, 0, 0, 0)일 때 \mathbf{q}^* = \mathbf{q}이고
\mathbf{q}\mathbf{v}_q\mathbf{q}^* = 1 \cdot \mathbf{v}_q \cdot 1 = \mathbf{v}_q
벡터가 변하지 않으며, 항등 회전이 정확히 적용된다.
9.2 z축 90도 회전
\mathbf{q} = (\cos(45°), 0, 0, \sin(45°)) = (\frac{\sqrt{2}}{2}, 0, 0, \frac{\sqrt{2}}{2}).
이를 사용하여 \mathbf{v} = (1, 0, 0)을 회전하면 \mathbf{v}' = (0, 1, 0)이 되어야 한다. 위 공식으로 계산하면
q_w^2 - \lVert\mathbf{q}_v\rVert^2 = \frac{1}{2} - \frac{1}{2} = 0
2q_w\mathbf{q}_v = (0, 0, 1)
\mathbf{q}_v \cdot \mathbf{v} = 0
\mathbf{q}_v \times \mathbf{v} = (0, 0, \frac{\sqrt{2}}{2}) \times (1, 0, 0) = (0, \frac{\sqrt{2}}{2}, 0)
따라서
\mathbf{v}' = 0 \cdot (1, 0, 0) + (0, 0, 1) \cdot (0, \frac{\sqrt{2}}{2}, 0)/(\sqrt{2}/2)
수정: 2q_w(\mathbf{q}_v \times \mathbf{v})의 계산은
2 \cdot \frac{\sqrt{2}}{2} \cdot (0, \frac{\sqrt{2}}{2}, 0) = (0, 1, 0)
따라서
\mathbf{v}' = 0 + (0, 1, 0) + 0 = (0, 1, 0)
이는 예상한 결과이며, 공식이 정확함을 확인한다.
10. 회전 공식의 응용
10.1 점군 변환
LiDAR 점군이나 메쉬의 모든 점을 같은 쿼터니언으로 변환할 때, 위 공식이 각 점에 적용된다.
10.2 자세 적분
자세 추정에서 각속도로부터 자세를 갱신할 때, 작은 회전 쿼터니언으로 현재 자세를 회전한다.
10.3 시각화
3D 그래픽스에서 객체의 회전을 단위 쿼터니언으로 저장하고, 렌더링 시 회전 행렬로 변환하거나 직접 위 공식을 적용한다.
10.4 자세 제어
자세 오차의 벡터 부분을 제어 입력으로 사용할 때, 쿼터니언 회전 공식이 활용된다.
11. 참고 문헌
- Hamilton, W. R. (1844). “On Quaternions; or on a New System of Imaginaries in Algebra.” Philosophical Magazine, Vol. 25, 489–495.
- 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.
- Diebel, J. (2006). “Representing Attitude: Euler Angles, Unit Quaternions, and Rotation Vectors.” Stanford University Technical Report.
- Markley, F. L., & Crassidis, J. L. (2014). Fundamentals of Spacecraft Attitude Determination and Control. Springer.
version: 1.0