🍣

四元数

に公開

四元数とは、複素数を一般化した数の一つである。

複素数

複素数a + biからなる平面を複素平面または複素数平面という。
複素数a+ bi, c + diによる四則演算は、

\begin{aligned}(a + bi) \pm (c + di) &= (a \pm c) + (b \pm d)i \\(a + bi)(c+di) &= (ac-bd)+(ad+bc)i \\ (a^2 + b^2)(c^2+d^2) &= (ac-bd)^2+(ad+bc)^2\;(ラグランジュの恒等式)\\ \frac{c+di}{a+bi} &= \frac{(ac+bd)+(ad-bc)i}{a^2+b^2} \end{aligned}

と計算できる。

三元数

複素数平面は2次元であるため、3次元化することを考える。
複素数平面に垂直なもう一つの軸をj = \sqrt-1と定めると、三元数をa + bi + cjと考えることができる。
このとき、三元数同士の乗算を計算すると

(a + bi + cj)(d + ei + fj) = ad - be - cf + (ae + bd)i + (af + cd)j + (bf + ce)ij

となり、計算結果にijが含まれるため三元数にならない。
しかし、絶対値について

(a^2 + b^2 + c^2)(d^2 + e^2 + f^2) = (ad - be - cf)^2 + (ae + bd)^2 + (af + cd)^2 + (bf + ce)^2

が成り立つため、ijを単に0とすることはできない。
そこで、積ijを新しい虚数kとすることを考えたのが、四元数である。

四元数

複素数x + yiに対して、四元数をa + bi + cj + dkと定める。
ここで、三元数よりk = ijであるため、四元数は(a + bi) + (c+di)jと表すこともできる。
複素数においてはi^2 = -1と定義するが、四元数においてはi^2 = j^2 = k^2 = ijk = -1と定義する。
四元数の定義式より、

ij = k, ji = -k, jk = i, kj = -i, ki = j, ik = -j

が成り立つことが分かり、また、

ijk = -1 \Rightarrow ijk^2 = -k \Rightarrow -ij = -k \Rightarrow ij = k

より、四元数は積を入れ替えると一致しない非可換な数である。

ここで、四元数同士の乗算を計算すると

\begin{aligned} (a + bi + cj + dk)(e + fi + gj + hk) &= ae - bf - cg - dh \\ &+ (af + be + ch - dg)i \\ &+ (ag - bh + ce + df)j \\ &+ (ah + bg - cf + de)k \end{aligned}

となり、四元数になっていることが分かる。
さらに、絶対値についても

\begin{aligned} (a^2 + b^2 + c^2 + d^2)(e^2 + f^2 + g^2 + h^2) &= (ae - bf - cg - dh)^2 \\ &+ (af + be + ch - dg)^2 \\ &+ (ag - bh + ce + df)^2 \\ &+ (ah + bg - cf + de)^2 \end{aligned}

が成り立つ。

内積と外積

四元数z = a + bi + cj + dkを実数部分aと虚数部分bi + cj + dkに分け、前者をzのスカラー部分(S_z)といい、後者をzのベクトル部分(V_z)という。
ここで、ベクトル部分だけを用いる、つまり四元数を3次元に落とし込むことで、3次元幾何を記述することを考える。
S_z0である四元数同士の積を計算すると、

\begin{aligned} (bi + cj + dk)(fi + gj + hk) = &-(bf + cg + dh) \\ &+ (ch - dg)i + (df - bh)j + (bg - cf)k \end{aligned}

が得られる。
このとき、

S_z = -(bf + cg + dh), \; V_z = (ch - dg)i + (df - bh)j + (bg - cf)k

であり、スカラー部分S_zは同じ虚数単位の積になっており、ベクトル部分V_zは相異なる虚数単位の積になっている。
S_zは各虚軸におけるスカラー値のみを考え、それぞれ同じ虚軸同士のスカラー値の積を計算し、その総和を求めることで、2つの四元数の3次元幾何上での何かしらの関係性を表している。
これが、幾何ベクトルにおける内積となる。
V_zは相異なる虚軸の積からなる3つの軸を持ち、元となった2つの四元数とは異なる、新しい四元数を表現している。
これが、幾何ベクトルにおける外積となり、虚軸i, j, kは単位ベクトルであると考えることができる。
よって、

\alpha = bi + cj + dk, \; \beta = fi + gj + hk, \; \vec \alpha = (b, c, d), \; \vec \beta = (f, g, h)

とすると、

\vec \alpha \cdot \vec \beta = bf + cg + dh, \; \vec \alpha \times \vec \beta = (ch - dg, df - bh, bg - cf)

となるため、

\alpha \beta = - \vec \alpha \cdot \vec\beta + \vec \alpha \times \vec \beta \cdot (i, j, k)

と表現できる。
歴史的には、ハミルトンが四元数という概念を導入し、そしてテイトやマクスウェルらと共にそれらを拡張していった。
しかし、四元数の処理は複雑であり取り扱いが難しかったので、ギブスやヘビサイドらは内積、外積の部分を取り出し、その2つを3次元座標の組に対する積(スカラー積、ベクトル積)として基本の演算規則に定め、新しい記号などに書き直した。
そうして、3次元における記法の簡易化を行ったことで、現代のベクトルという概念が誕生した。

回転

複素数同士の積は、複素平面における回転を表す。
そこで、四元数を用いて3次元空間における回転を表すことを考える。

まず、四元数q = q_0 + q_1i + q_2j + q_3kについて、その複素共役は

q^* = q_0 - q_1i - q_2j - q_3k

と定義される。
すると、qのノルムは

||q|| = \sqrt{q_0^2 + q_1^2 + q_2^2 + q_3^2}

と定義される。
このとき、四元数による3次元ベクトルr = r_1i + r_2j + r_3kとし、四元数r'r' = qrq^*と定義すると、

\begin{aligned} r' &= (q_0 + q_1i + q_2j + q_3k)(r_1i + r_2j + r_3k)(q_0 - q_1i - q_2j - q_3k) \\ &= ((q_0^2 + q_1^2 - q_2^2 - q_3^2)r_1 + 2(q_1q_2 - q_0q_3)r_2 + 2(q_0q_2 + q_1q_3)r_3)i \\ &+ (2(q_0q_3 + q_1q_2)r_1 + (q_0^2 - q_1^2 + q_2^2 - q_3^2)r_2 + 2(-q_0q_1 + q_2q_3)r_3)j \\ &+ (2(q_1q_3 - q_0q_2)r_1 + 2(q_2q_3 + q_0q_1)r_2 + (q_0^2 - q_1^2 - q_2^2 + q_3^2)r_3)k \end{aligned}

と表せる。
ここで、r' = r_0' + r_1'i + r_2'j + r_3'kとすると、各成分は

\begin{aligned} r_0' &= 0 \\ r_1' &= (q_0^2 + q_1^2 - q_2^2 - q_3^2)r_1 + 2(q_1q_2 - q_0q_3)r_2 + 2(q_0q_2 + q_1q_3)r_3 \\ r_2' &= 2(q_0q_3 + q_1q_2)r_1 + (q_0^2 - q_1^2 + q_2^2 - q_3^2)r_2 + 2(-q_0q_1 + q_2q_3)r_3 \\ r_3' &= 2(q_1q_3 - q_0q_2)r_1 + 2(q_2q_3 + q_0q_1)r_2 + (q_0^2 - q_1^2 - q_2^2 + q_3^2)r_3 \end{aligned}

であり、これを行列で表現すると

\left[ \begin{array}{ccc}r_1' \\ r_2' \\ r_3'\end{array} \right] = \left[ \begin{array}{ccc}q_0^2 + q_1^2 - q_2^2 - q_3^2 & 2(q_1q_2 - q_0q_3) & 2(q_0q_2 + q_1q_3) \\ 2(q_0q_3 + q_1q_2) & (q_0^2 - q_1^2 + q_2^2 - q_3^2) & 2(-q_0q_1 + q_2q_3) \\ 2(q_1q_3 - q_0q_2) & 2(q_2q_3 + q_0q_1) & (q_0^2 - q_1^2 - q_2^2 + q_3^2) \end{array} \right] \left[ \begin{array}{ccc}r_1 \\ r_2 \\ r_3\end{array} \right]

となる。
ここで行列R

R = \left[ \begin{array}{ccc}q_0^2 + q_1^2 - q_2^2 - q_3^2 & 2(q_1q_2 - q_0q_3) & 2(q_0q_2 + q_1q_3) \\ 2(q_0q_3 + q_1q_2) & (q_0^2 - q_1^2 + q_2^2 - q_3^2) & 2(-q_0q_1 + q_2q_3) \\ 2(q_1q_3 - q_0q_2) & 2(q_2q_3 + q_0q_1) & (q_0^2 - q_1^2 - q_2^2 + q_3^2) \end{array} \right]

とすると、r'

r'_i = \sum_{j = 1}^{3}R_{ij}r_j (i = 1, 2, 3)

と表せる。
よって、四元数rに対して左から四元数qをかけ、右から複素共役q^*をかけることは、rの成分からなる3次元ベクトルに行列Rをかけることに対応している。
行列Rが回転行列であれば、四元数は空間における回転を表すことができることを示している。
このとき、行列Rが直交行列であり、行列Rの行列式が1である(|R| = 1)とき、行列Rは回転行列である。
四元数qが単位四元数(||q|| = 1)のとき、行列Rはこの2つを満たすため、回転行列となる。

以上より、四元数による3次元ベクトルに対して、単位四元数とその複素共役を左右からかけると元のベクトルの3次元空間での回転を表す。
ここで、倍角の公式よりc = \cos{\frac{\theta}{2}}, s = \sin{\frac{\theta}{2}}とすると、回転軸

n = \left[ \begin{array}{ccc}n_1 \\ n_2 \\ n_3\end{array} \right]

の周りに角度\theta回転する回転行列はロドリゲスの回転公式(後述)より、

\left[ \begin{array}{ccc} c^2 + (n_1s)^2 - (n_2s)^2 - (n_3s)^2 & 2((n_1s)(n_2s)-c(n_3s)) & 2c(n_2s)+2(n_1s)(n_3s) \\ 2c(n_3s)+2(n_1s)(n_2s) & c^2 - (n_1s)^2 + (n_2s)^2 - (n_3s)^2 & 2(-c(n_1s)+(n_2s)(n_3s)) \\ 2((n_1s)(n_3s)-c(n_2s)) & 2(n_2s)(n_3s)+2c(n_1s) & c^2-(n_1s)^2-(n_2s)^2+(n_3s)^2 \end{array} \right]

と表されるため、これとRを比較すると、

\left[ q_0,q_1,q_2,q_3 \right] = \left[ c,n_1s,n_2s,n_3s \right]

の対応関係があることが分かる。
よって、回転を表す四元数q = q_0 + q_1i + q_2j + q_3kのそれぞれの係数と回転角度\thetaと回転軸(n_1,n_2,n_3)の対応関係は

\left[ q_0,q_1,q_2,q_3 \right] = \left[ \cos{\frac{\theta}{2}},n_1\sin{\frac{\theta}{2}},n_2\sin{\frac{\theta}{2}},n_3\sin{\frac{\theta}{2}} \right]

となる。

ロドリゲスの回転公式

任意の軸のまわりに角度\thetaだけ回転させる回転行列は

\left[ \begin{array}{ccc} c + n_1^2(1-c) & n_1n_2(1-c)-n_3s & n_1n_3(1-c)+n_2s \\ n_2n_1(1-c)+n_3s & c+n_2^2(1-c) & n_2n_3(1-c)-n_1s \\ n_3n_1(1-c)-n_2s & n_3n_2(1-c)+n_1s & c+n_3^2(1-c) \end{array} \right]

と表される。
このとき、c = \cos\theta, s = \sin\thetaであり、

n = \left[ \begin{array}{ccc}n_1 \\ n_2 \\ n_3\end{array} \right]

はノルムが1の回転軸ベクトルである。

差分

物体には、姿勢という概念がある。
姿勢とは、その物体がどれほど回転したかを表す数値である。
つまり、回転とは、物体の姿勢を変化させる操作であるということができる。
3次元空間における姿勢表現には、オイラー角を使った方式と四元数を使った方式がある。

オイラー角を使った方式では、回転順序に依存して姿勢は変化し、特異姿勢となる可能性がある。
特異姿勢とは、現象名としてはジンバルロックと呼ばれ、姿勢計算のための回転計算においてゼロ除算が生じることで、姿勢を求めることができない、ある姿勢状態のことである。

そこで、姿勢表現にも四元数を使うことを考える。
四元数qは、複素数による回転演算を3次元に拡張したものであり、実部が回転角、虚部が回転軸の方向を表す。
したがって、姿勢を表す四元数同士の積は、複素数の掛け算が角度を加算するのと同様に、回転の合成を意味する。
よって、姿勢クォータニオンをqとし、回転クォータニオンをpとすると、qpによって回転させる操作はpqで表される。
この回転によって姿勢qが姿勢q'に移ったとすると、q' = pqとなり、両辺にqの逆数q^{-1} = \frac{q^*}{||q||^2}をかけると、p = q'q^{-1}となる。
この四元数pが、二つの姿勢qq'の差分となる。

GitHubで編集を提案

Discussion