Skip to main content

AHRS Quaternions and Rotations


Quaternions

Quaternion은 사원수 또는 쿼터니언이라고 부르며, 복소수를 확장해 만든 수 체계입니다.

i2=j2=k2=ijk=1q=xi+yj+zk+wq=[xyzw]T\mathbf{i}^2 = \mathbf{j}^2 = \mathbf{k}^2 = \mathbf{i}\mathbf{j}\mathbf{k} = -1 \\ q = x\,\mathbf{i} + y\,\mathbf{j} + z\,\mathbf{k} + w \\ \underline{q} = \begin{bmatrix}x & y & z & w\end{bmatrix}^T

Norm

q=x2+y2+z2+w2\begin{Vmatrix}q\end{Vmatrix} = \sqrt{x^2 + y^2 + z^2 + w^2}

Conjugate quaternion

qˉ=xiyjzk+w\bar{q} = -x\,\mathbf{i} - y\,\mathbf{j} - z\,\mathbf{k} + w pq=qˉpˉ\overline{pq} = \bar{q}\bar{p}

Pure quaternion

q=[xyz0]T\underline{q} = \begin{bmatrix}x & y & z & 0\end{bmatrix}^T

Identity quaternion

I=[0001]T\underline{I} = \begin{bmatrix}0 & 0 & 0 & 1\end{bmatrix}^T

Inverse quaternion

q1=qˉq2(q1=qˉif ||q|| = 1)q^{-1} = \cfrac{\bar{q}}{||q||^2} \quad \begin{pmatrix} q^{-1} = \bar{q} & \text{if ||q|| = 1} \end{pmatrix}

Hamilton product

pq=L(p)q=[pwpzpypxpzpwpxpypypxpwpzpxpypzpw][qxqyqzqw]=R(q)p=[qwqzqyqxqzqwqxqyqyqxqwqzqxqyqzqw][pxpypzpw]\begin{aligned} pq & = L(p)\underline{q} & = \begin{bmatrix} p_w & -p_z & p_y & p_x \\ p_z & p_w & -p_x & p_y \\ -p_y & p_x & p_w & p_z \\ -p_x & -p_y & -p_z & p_w \end{bmatrix} \begin{bmatrix} q_x \\ q_y \\ q_z \\ q_w \end{bmatrix} \\ & = R(q)\underline{p} & = \begin{bmatrix} q_w & q_z & -q_y & q_x \\ -q_z & q_w & q_x & q_y \\ q_y & -q_x & q_w & q_z \\ -q_x & -q_y & -q_z & q_w \end{bmatrix} \begin{bmatrix} p_x \\ p_y \\ p_z \\ p_w \end{bmatrix} \end{aligned}

Rotations

Rotate Vector

a(a=1)\vec{a}\left(||\vec{a}|| = 1\right)를 기준으로 벡터를 θ\theta만큼 회전시키는 데 필요한 쿼터니언은 아래와 같습니다.

q(a,θ)=[asin(θ2)cos(θ2)]T\underline{q}\left(\vec{a},\theta\right) = \begin{bmatrix} \vec{a}\sin{\left(\cfrac{\theta}{2}\right)} & \cos{\left(\cfrac{\theta}{2}\right)} \end{bmatrix}^T

벡터와 쿼터니언 연산 시 벡터는 pure quaternioin으로 나타낼 수 있습니다.

v=vxi+vyj+vzkv = v_x\,\mathbf{i} + v_y\,\mathbf{j} +v_z\,\mathbf{k} v=[vxvyvz0]\underline{v}= \begin{bmatrix} v_x & v_y & v_z & 0 \end{bmatrix}

a(a=1)\vec{a}\left(||\vec{a}|| = 1\right)를 기준으로 v\vec{v}θ\theta만큼 회전시킨 v\vec{v}'를 구하는 식은 아래와 같습니다.

v=qvqˉv=R(qˉ)L(q)v=[12(qy2+qz2)2(qxqyqzqw)2(qxqz+qyqw)02(qxqy+qzqw)12(qx2+qz2)2(qyqzqxqw)02(qxqzqyqw)2(qyqz+qxqw)12(qx2+qy2)00001][vxvyvz0]\begin{aligned} v' & = qv \bar{q} \\ \underline{v}' & = R(\bar{q}) L(q) \underline{v} \\ & = \begin{bmatrix} 1-2({q_y}^2+{q_z}^2) & 2(q_x q_y - q_z q_w) & 2(q_x q_z + q_y q_w) & 0 \\ 2(q_x q_y + q_z q_w) & 1-2({q_x}^2+{q_z}^2) & 2(q_y q_z - q_x q_w) & 0 \\ 2(q_x q_z - q_y q_w) & 2(q_y q_z + q_x q_w) & 1-2({q_x}^2+{q_y}^2) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} v_x \\ v_y \\ v_z \\ 0 \end{bmatrix} \end{aligned}

연속적인 회전은 아래와 같이 구할 수 있습니다.

v1=q01v0qˉ01v2=q12v1qˉ12=q12q01v0qˉ01qˉ12v3=q23v2qˉ23=q23q12q01v0qˉ01qˉ12qˉ23\begin{aligned} v_{1} & = & q_{0}^{1} v_{0} \bar{q}_{0}^{1} & & \\ v_{2} & = & q_{1}^{2} v_{1} \bar{q}_{1}^{2} & = & q_{1}^{2} q_{0}^{1} v_{0} \bar{q}_{0}^{1} \bar{q}_{1}^{2} \\ v_{3} & = & q_{2}^{3} v_{2} \bar{q}_{2}^{3} & = & q_{2}^{3} q_{1}^{2} q_{0}^{1} v_{0} \bar{q}_{0}^{1} \bar{q}_{1}^{2} \bar{q}_{2}^{3} \\ \vdots & & \vdots & & \vdots \end{aligned} vk=qk1kqk2k1q01v0qˉ01qˉk2k1qˉk1kv_{k} = q_{k-1}^{k} q_{k-2}^{k-1} \cdots q_{0}^{1} v_{0} \bar{q}_{0}^{1} \cdots \bar{q}_{k-2}^{k-1} \bar{q}_{k-1}^{k} q0k=qk1kqk2k1q01q_{0}^{k} = q_{k-1}^{k} q_{k-2}^{k-1} \cdots q_{0}^{1}

Rotate Frame

처음에 A와 B 좌표계는 동일했다가 B 좌표계가 a(a=1)\vec{a}\left(||\vec{a}|| = 1\right)를 기준으로 θ\theta만큼 회전했다고 가정하겠습니다.

Av{}^{A}\vec{v}는 A에서 관찰한 v\vec{v}입니다. Av{}^{A}\vec{v}는 회전하기 전 B 좌표계에서 관찰한 v\vec{v}라고 생각할 수도 있습니다.

Bv{}^{B}\vec{v}는 회전 후 B에서 관찰한 v\vec{v}입니다.

B 좌표계 위에 있는 관찰자 입장에서 보면 Av{}^{A}\vec{v}a\vec{a}를 기준으로 θ-\theta만큼 회전하여 Bv{}^{B}\vec{v}가 되었다고 생각할 수 있습니다.

반대로 Bv{}^{B}\vec{v}a\vec{a}를 기준으로 θ\theta만큼 회전하면 Av{}^{A}\vec{v}라고 생각할 수 있습니다.

Vector 회전식을 이용하여 Av{}^{A}\vec{v}Bv{}^{B}\vec{v}의 관계를 식으로 나타내면 아래와 같습니다. 을

Av=q(Bv)qˉ=qBA(Bv)qˉBA=[12(qy2+qz2)2(qxqyqzqw)2(qxqz+qyqw)02(qxqy+qzqw)12(qx2+qz2)2(qyqzqxqw)02(qxqzqyqw)2(qyqz+qxqw)12(qx2+qy2)00001][BvxBvyBvz0]\begin{aligned} {}^{A}v & = q({}^{B}v)\bar{q} = q_{B}^{A}({}^{B}v)\bar{q}_{B}^{A} \\ & =\begin{bmatrix} 1-2({q_y}^2+{q_z}^2) & 2(q_x q_y - q_z q_w) & 2(q_x q_z + q_y q_w) & 0 \\ 2(q_x q_y + q_z q_w) & 1-2({q_x}^2+{q_z}^2) & 2(q_y q_z - q_x q_w) & 0 \\ 2(q_x q_z - q_y q_w) & 2(q_y q_z + q_x q_w) & 1-2({q_x}^2+{q_y}^2) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} {}^{B}v_x \\ {}^{B}v_y \\ {}^{B}v_z \\ 0 \end{bmatrix} \end{aligned}

연속적인 회전은 아래와 같이 구할 수 있습니다.

k1v=qkk1kvqˉkk1k2v=qk1k2k1vqˉk1k2=qk1k2qkk1kvqˉkk1qˉk1k2k3v=qk2k3k2vqˉk2k3=qk2k3qk1k2qkk1kvqˉkk1qˉk1k2qˉk2k3\begin{aligned} {}^{k-1}v & = & q_{k}^{k-1} {}^{k}v \bar{q}_{k}^{k-1} & & \\ {}^{k-2}v & = & q_{k-1}^{k-2} {}^{k-1}v \bar{q}_{k-1}^{k-2} & = & q_{k-1}^{k-2} q_{k}^{k-1} {}^{k}v \bar{q}_{k}^{k-1} \bar{q}_{k-1}^{k-2} \\ {}^{k-3}v & = & q_{k-2}^{k-3} {}^{k-2}v \bar{q}_{k-2}^{k-3} & = & q_{k-2}^{k-3} q_{k-1}^{k-2} q_{k}^{k-1} {}^{k}v \bar{q}_{k}^{k-1} \bar{q}_{k-1}^{k-2} \bar{q}_{k-2}^{k-3} \\ \vdots & & \vdots & & \vdots \end{aligned} 0v=q10q21qkk1kvqˉkk1qˉ21qˉ10{}^{0}v = q_{1}^{0} q_{2}^{1} \cdots q_{k}^{k-1} {}^{k}v \bar{q}_{k}^{k-1} \cdots \bar{q}_{2}^{1} \bar{q}_{1}^{0} qk0=q10q21qkk1q_{k}^{0} = q_{1}^{0} q_{2}^{1} \cdots q_{k}^{k-1}

Small angle approximation

Taylor Series에 의해 sin함수와 cos함수는 아래와 같은 다항식으로 나타낼 수 있습니다.

sinθ2=θ213!(θ2)3+15!(θ2)5cosθ2=112!(θ2)2+14!(θ2)4\begin{aligned} \sin{\cfrac{\theta}{2}} & = \cfrac{\theta}{2} - \cfrac{1}{3!}\left(\cfrac{\theta}{2}\right)^3 + \cfrac{1}{5!}\left(\cfrac{\theta}{2}\right)^5 - \cdots \\ \cos{\cfrac{\theta}{2}} & = 1 - \cfrac{1}{2!}\left(\cfrac{\theta}{2}\right)^2 + \cfrac{1}{4!}\left(\cfrac{\theta}{2}\right)^4 - \cdots \end{aligned}

θ0\theta\to0 라고 가정하면 sin함수와 cos함수는 아래와 같이 나타낼 수 있습니다.

sinθ2θ2cosθ21\begin{aligned} \sin{\cfrac{\theta}{2}} & \approx \cfrac{\theta}{2} \\ \cos{\cfrac{\theta}{2}} & \approx 1 \end{aligned}

따라서 회전각이 충분히 작을 때, 회전 쿼터니언은 아래와 같이 나타낼 수 있습니다.

q(a,θ)=[asin(θ2)cos(θ2)]T[θ2a1]T(θ0)\begin{aligned} \underline{q}\left(\vec{a},\theta\right) & = \begin{bmatrix} \vec{a}\sin{\left(\cfrac{\theta}{2}\right)} & \cos{\left(\cfrac{\theta}{2}\right)} \end{bmatrix}^T & \\ & \approx \begin{bmatrix} \cfrac{\theta}{2}\vec{a} & 1 \end{bmatrix}^T & (\theta\to0) \end{aligned}