본문으로 건너뛰기

AHRS Quaternions and Rotations

Quaternions​

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

i2=j2=k2=ijk=−1q=x i+y j+z k+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ˉ=−x i−y j−z k+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​

q−1=qˉ∣∣q∣∣2(q−1=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‾=[pw−pzpypxpzpw−pxpy−pypxpwpz−px−py−pzpw][qxqyqzqw]=R(q)p‾=[qwqz−qyqx−qzqwqxqyqy−qxqwqz−qx−qy−qzqw][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⃗,θ)=[a⃗sin⁡(θ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=vx i+vy j+vz kv = 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‾=[1−2(qy2+qz2)2(qxqy−qzqw)2(qxqz+qyqw)02(qxqy+qzqw)1−2(qx2+qz2)2(qyqz−qxqw)02(qxqz−qyqw)2(qyqz+qxqw)1−2(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=qk−1kqk−2k−1⋯q01v0qˉ01⋯qˉk−2k−1qˉk−1kv_{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=qk−1kqk−2k−1⋯q01q_{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=[1−2(qy2+qz2)2(qxqy−qzqw)2(qxqz+qyqw)02(qxqy+qzqw)1−2(qx2+qz2)2(qyqz−qxqw)02(qxqz−qyqw)2(qyqz+qxqw)1−2(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}

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

k−1v=qkk−1kvqˉkk−1k−2v=qk−1k−2k−1vqˉk−1k−2=qk−1k−2qkk−1kvqˉkk−1qˉk−1k−2k−3v=qk−2k−3k−2vqˉk−2k−3=qk−2k−3qk−1k−2qkk−1kvqˉkk−1qˉk−1k−2qˉk−2k−3⋮⋮⋮\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=q10q21⋯qkk−1kvqˉkk−1⋯qˉ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=q10q21⋯qkk−1q_{k}^{0} = q_{1}^{0} q_{2}^{1} \cdots q_{k}^{k-1}

Small angle approximation​

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

sin⁡θ2=θ2−13!(θ2)3+15!(θ2)5−⋯cos⁡θ2=1−12!(θ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⁡θ2≈1\begin{aligned} \sin{\cfrac{\theta}{2}} & \approx \cfrac{\theta}{2} \\ \cos{\cfrac{\theta}{2}} & \approx 1 \end{aligned}

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

q‾(a⃗,θ)=[a⃗sin⁡(θ2)cos⁡(θ2)]T≈[θ2a⃗1]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}