일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- LaTeX
- Julia
- 우분투
- 수식삽입
- 논문작성
- teps
- 텝스공부
- 수치해석
- 딥러닝
- JAX
- 텝스
- matplotlib
- 인공지능
- Linear algebra
- 에러기록
- IEEE
- pytorch
- Python
- Dear abby
- 고체역학
- 생산성
- ChatGPT
- MATLAB
- 논문작성법
- Zotero
- 옵시디언
- Numerical Analysis
- WOX
- obsidian
- Statics
- Today
- Total
뛰는 놈 위에 나는 공대생
[항법] 쿼터니언 quaternion (1) 쿼터니언 개념과 오일러각 본문
쿼터니언은 해밀턴이 고안한 대수체계인데, 이 대수체계가 회전과 연관이 있어서 물리에서 많이 사용된다.
이 글에서는 내가 생각하는 쿼터니언 개념 및 수학적인 계산, 표현을 정리해놓는다.
쿼터니언 개념
고등학교에서 배운 것을 바탕으로 보면 가장 넓은 범위의 복소수는 실수와 허수로 나눌 수 있고 허수는 나뉘어 $i$라는 허수부를 뜻하는 문자와 함께 표현된다.
$i=\sqrt{-1}$임을 다들 알고 있을 것이다. 이는 x축을 실수, y축을 허수로 해놓은 공간에서 $i$를 곱함으로써 xy평면에서 시계 반대 방향(CCW)로 회전하는 것과 동일하게 생각할 수 있다.
$1\times i=i$
$i\times i = -1$
$-1 \times i = -i$
$-i \times i = 1$
이러한 개념을 삼차원으로 확장하려는 과정에서 만들어진 것이 사원수=쿼터니언(quaternion)이다.
왜 사원수가 되었는지에 대한 배경도 있는데 그 내용은 아래 글을 참고하면 좋다.
https://terms.naver.com/entry.naver?docId=3570720&cid=58944&categoryId=58970
읽기 귀찮은 사람에게 요약해서 설명하면, 허수 확장을 위해 새로운 허수 축 $j$를 추가하면 그 회전을 표현할 때 절대로 표현할 수 없는 구간이 존재하게 된다. 그런데 새로운 허수 축 $j,k$를 추가하면 삼차원 회전을 쉽게 표현할 수 있게 된다.
즉, 실수 성분 하나에 허수 성분 세 개로 표현하는 것이다.
$q_{0}+q_{1}i+q_{2}j+q_{3}k$와 같다.
성분의 곱셈은 다음과 같은 규칙을 가진다.
$i^{2}=j^{2}=k^{2}=ijk=-1$
$ij=k, \quad ji=-k$
$jk=i, \quad kj =-i$
$ki=j, \quad ik=-j$
이제 이걸 삼차원에 대해서 표현해야하는데 문제는 성분이 네 개인데 삼차원에 표현해야한다는 점이다.
실수 성분 1개와 허수 성분 2개에서는 회전을 표현하기 어려우므로 실수 성분은 회전 각도를 표현하는 의미로 두고, 허수 성분 3개는 좌표이자 벡터의 의미로 두기로 한다.
예를 들어 $i,j,k$로 표현된 좌표계에서 $i+j$라는 좌표를 y축($j$)에 대해서 회전을 한다고 하면, 그 각도를 실수부 1로 생각하고 허수부는 j를 넣어서 $1+j$를 곱해준다. 여기서 $1$이나 $1*j$는 모두 임의로 정한 것이고 개념적으로 이해하기 위한 것 뿐이다.
이 때 회전한 결과를 보고 싶으면 $S$를 내가 회전하고 싶은 좌표, $q$를 회전에 대한 쿼터니언이라고 생각하고 아래와 같은 계산을 수행하자. 회전 결과는 $S'$이다.
$S'=q*S*\frac{1}{q}=(1+j)*(i+j)*\frac{1}{1+j}=(i+j-k-1)*\frac{1-j}{(1+j)(1-j)}=\frac{1}{2}(i+j-k-1-k+1-i+j)=j-k$
그림을 참고하면 이해가 쉽다.
$i+j$를 j축에 대해서 90도만큼 회전해서 $j-k$가 된 결과이다.
이렇게 앞에는 회전을 나타내는 쿼터니언, 뒤에는 그 쿼터니언의 역을 곱해주면 된다.
이렇게 하는 이유는, 회전은 역으로 연산을 했을 때 다시 원래 모습으로 돌아와야하며 $q^{-1}S'q=S$, Euclidean length를 그대로 보존하기 위해서 $q^{-1}$를 곱해주는 것이다. 이렇게 하면 크기의 변화가 없기 때문이다.
위 식의 결과 그림에서 표현한 것과 동일한 결과가 된다. 임의로 정한 1이라는 실수부는 90도만큼 회전한 것을 나타내고, 허수부 $j$는 회전축인 y축을 나타낸다.
그런데 이럴 경우에는 쿼터니언의 실수 값이 고정된 것이 아니라 $1+j$, $2+2j$에 관계없이 어차피 같은 결과가 나오기 때문에 쿼터니언은 normalization을 해줘야한다.
즉 $q_{0}^{2}+q_{1}^{2}+q_{2}^{2}+q_{3}^{2}=1$와 같이 되도록 조정해준다.
이렇게 하면 $q^{*}q=qq^{*}=1$
따라서 $\frac{1}{q}$가 $q^{*}=q_{0}-q_{1}i-q_{2}j-q_{3}k$와 동일하게 되므로 회전된 좌표를 알고 싶을 때는
$S'=qSq^{*}$
$S'$은 회전한 결과의 좌표, $S$는 회전하기 전의 좌표이다.
그런데 notation에 따라서
$S'=q^{*}Sq$로 나타내는 경우도 있는데 내가 속해있는 community에서는 $q^{*}Sq$라고 쓰기 때문에 앞으로도 계속 $q^{*}Sq$라고 쓸 예정이다. 여기서 $q^{*}$는 원래 $q^{-1}$인데 내가 q를 norm으로 나눠주는 normalization을 수행했기 때문이고 위처럼 $q^{*}Sq$ transformation은 벡터를 left-handed rotation한 것으로 볼 수 있다.
쿼터니언과 공학에서의 회전 표현
쿼터니언을 공학에서 배웠다면 회전을 나타내기 위한 표현 방법 중 하나로 배우게 된다.
이 표현 방법 중에 가장 대표적인 것은 오일러각인데, 삼차원에서 회전하는 물체를 표현하기 위해서는 정해진 x,y,z축에 따라 각각의 각도를 정해주어야 한다. 그것이 롤, 피치, 요(roll, pitch, yaw)인데 자세한 내용은 오일러각 내용을 찾아보도록 하자. 아래 링크를 추가해놓는다.
https://normal-engineer.tistory.com/35?category=954775
이렇게 회전을 하는 표현이 어렵기 때문에
하나의 축에 대해, 어떤 각도로 회전하기만 하면, 롤, 피치, 요와 동일한 결과가 나올 수 있도록 한다면 정말 편할 것이다.
이게 바로 쿼터니언의 유용성이다. 쿼터니언을 이용하면, 실수부는 어떤 각도, 허수부는 특정 축으로 설정해서 회전한 결과가 롤, 피치, 요로 회전한 것과 동일한 결과가 나오도록 만들 수 있다.
어떤 축에 대해서 $\mu$(rotation angle)만큼 회전하면 여러 번의 회전을 단 한 번의 회전으로 표현할 수 있을 때, 이 축을 오일러축(Euler axis)이라고 한다. 오일러축은 내가 설정한 좌표계 $xyz$에서 각각 $\alpha, \beta, \gamma$의 각도를 가지고 있다고 표기한다. $\mu$는 rotation angle이므로 $0\leq \mu <2\pi$ 이다.
이 때 쿼터니언 q는
$q = [q_{0},q_{1},q_{2},q_{3}]=[\cos\frac{\mu}{2}, \cos\alpha \sin\frac{\mu}{2}, \cos\beta \sin\frac{\mu}{2}, \cos\gamma \sin\frac{\mu}{2}]^{\top}$
으로 표현할 수 있다.
이 때 $q_{1},q_{2},q_{3}$는 회전할 때 양의 방향과 나란하게 설정한다.
앞에서 쿼터니언을 이용해서 회전을 나타내는 방법을 알았으므로 쿼터니언을 통해 오일러각과 동일한 회전 결과를 낼 수 있음을 알 수 있다.
따라서 오일러각과 쿼터니언 사이의 관계식을 구할 수 있다.
Navigation frame($N$)(물체의 운동을 표현하기 위해 사람이 임의로 설정해놓은 좌표계, 예를 들면 NED 좌표계를 Navigation frame으로 설정할 수 있다)에서 Body frame($B$)으로 좌표계 회전을 한다고 생각해보자.
yaw에서의 회전은 Navigation frame $N$에서 z축으로 요 각도만큼 회전한 좌표계를 $B_{1}$이라고 하자. $N$에서 $B_{1}$로 옮기는 쿼터니언은 다음과 같다.
$q_{\psi}=\cos\frac{\psi}{2}+\sin\frac{\psi}{2}k$
또한 좌표계 $B_{1}$에서 피치 각도만큼 회전한 좌표계를 $B_{2}$라고 할 때 이 회전을 나타내는 쿼터니언은 다음과 같다.
$q_{\theta}=\cos\frac{\theta}{2}+\sin\frac{\theta}{2}j$
마지막으로 $B_{2}$에서 Body frame인 $B$로 변환하는 쿼터니언
$q_{\phi}=\cos\frac{\phi}{2}+\sin\frac{\phi}{2}k$
이 세 개의 쿼터니언을 연달아서 계산하면 나오는 최종적이 쿼터니언이 오일러각과 동일한 결과일 것이다.
이 때 주의해야할 점은 회전에 대한 벡터 operation을 $q^{*}Sq$로 설정했는지 $qSq^{*}$로 설정했는지에 따라 곱해지는 순서가 달라진다.
우리는 여기서 $q^{*}Sq$로 설정했으므로 이 내용대로 전개한다.
$S_{A}$에서 $S_{C}$로 변환하고 싶을 때 중간에 $S_{B}$를 거친다면 아래와 같은 과정이 나온다.
$\begin{equation}
\begin{aligned}
&S_{B}=\left(q_{A}^{B}\right)^{*} S_{A}\left(q_{A}^{B}\right), \\
&S_{C}=\left(q_{B}^{C}\right)^{*} S_{B}\left(q_{B}^{C}\right)=\left(q_{B}^{C}\right)^{*}\left(q_{A}^{B}\right)^{*} S_{A}\left(q_{A}^{B}\right)\left(q_{B}^{C}\right)
\end{aligned}
\end{equation}$
즉, $q_{A}^{C}=q_{A}^{B}q_{B}^{C}$와 동일하다. 만약 A에서 C로 가고 싶으면 A-B * B-C 순서대로 곱해주는 것이다.
마찬가지로 위의 오일러각은
요 - 피치 - 롤 순서대로 회전하므로
$q_{\psi}q_{\theta}q_{\phi}$ 순서로 계산한다. (순서가 매우 중요하다)
그 결과를 $q=q_{\psi}q_{\theta}q_{\phi}=[q_{0},q_{1},q_{2},q_{3}]$이라고 할 때
$\begin{equation}
\begin{aligned}
&q_{0}=\cos \frac{\Psi}{2} \cos \frac{\Theta}{2} \cos \frac{\Phi}{2}+\sin \frac{\psi}{2} \sin \frac{\Theta}{2} \sin \frac{\phi}{2} \\
&q_{1}=\cos \frac{\psi}{2} \cos \frac{\Theta}{2} \sin \frac{\Phi}{2}-\sin \frac{\psi}{2} \sin \frac{\Theta}{2} \cos \frac{\Phi}{2} \\
&q_{2}=\cos \frac{\psi}{2} \sin \frac{\Theta}{2} \cos \frac{\Phi}{2}+\sin \frac{\psi}{2} \cos \frac{\Theta}{2} \sin \frac{\Phi}{2} \\
&q_{3}=\sin \frac{\psi}{2} \cos \frac{\Theta}{2} \cos \frac{\Phi}{2}-\cos \frac{\psi}{2} \sin \frac{\Theta}{2} \sin \frac{\Phi}{2}
\end{aligned}
\end{equation}$
다음과 같이 변환할 수 있다.
이는 오일러각과 쿼터니언 사이의 관계와 동일하다.
다음 글에서는 쿼터니언의 미분 및 navigation에서 활용하기 위한 업데이트 식에 대해 다룬다.
참고자료
https://terms.naver.com/entry.naver?docId=3571334&cid=58944&categoryId=58970
'항공우주 Aeronautical engineering' 카테고리의 다른 글
[추진] 추진공학에 대한 개요 (1) 기본 원리 (0) | 2022.02.25 |
---|---|
[항법] 쿼터니언 Quaternion (2) 쿼터니언 미분과 업데이트 식 (0) | 2022.01.25 |
[비행동역학] Stick-free와 Stick-fixed static stability의 차이 (0) | 2022.01.06 |
[비행동역학] Lateral dynamics에 대한 이해 (0) | 2021.12.17 |
[항공우주] 비행기의 control surface와 관련된 control coefficients (0) | 2021.12.04 |