10.13 쿼터니언 기반 벡터 회전 공식의 유도

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