四元数(クォータニオン)
四元数とは、複素数を一般化した数の一つである。
複素数
複素数$ a + biからなる平面を複素平面または複素数平面という。
複素数$ a+ bi, c + diによる四則演算は、
$ (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}
と計算できる。
三元数
複素数平面は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とすることを考えたのが、四元数である。
https://gyazo.com/43d78f5210c01a300344415dcda4dabe
四元数
複素数$ 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}
が成り立つ。
https://gyazo.com/91f2b2c83e47deb81d5c77550cd17fd9
内積と外積
四元数$ z = a + bi + cj + dkを実数部分$ aと虚数部分$ bi + cj + dkに分け、前者を$ zのスカラー部分($ S_z)といい、後者を$ zのベクトル部分($ V_z)という。
ここで、ベクトル部分だけを用いる、つまり四元数を3次元に落とし込むことで、3次元幾何を記述することを考える。
$ S_zが$ 0である四元数同士の積を計算すると、
$ (bi + cj + dk)(fi + gj + hk) = -(bf + cg + dh) + (ch - dg)i + (df - bh)j + (bg - cf)k
が得られる。
このとき、
$ S_z = -(bf + cg + dh), \quad 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, \quad \beta = fi + gj + hk, \quad \vec \alpha = (b, c, d), \quad \vec \beta = (f, g, h)とすると
$ \vec \alpha \cdot \vec \beta = bf + cg + dh, \quad \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^3}
と定義される。
このとき、四元数による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とすると、各成分は
$ 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
であり、これを行列で表現すると
$ \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次元空間での回転を表す。
ここで、ロドリゲスの回転公式(後述)より、回転軸
$ n = \left[ \begin{array}{ccc}n_1 \\ n_2 \\ n_3\end{array} \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{\frac{\theta}{2}}, s = \sin{\frac{\theta}{2}}とすると、
$ \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[ \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[ 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]
である。
差分
物体には、姿勢という概念がある。
姿勢とは、その物体がどれほど回転したかを表す数値である。
つまり、回転とは、物体の姿勢を変化させる操作であるということができる。
3次元空間における姿勢表現には、オイラー角を使った方式と四元数を使った方式がある。
オイラー角を使った方式では、回転順序に依存して姿勢は変化し、特異姿勢となる可能性がある。
特異姿勢とは、現象名としてはジンバルロックと呼ばれ、姿勢計算のための回転計算においてゼロ除算が生じたことで、姿勢を求めることができない、ある姿勢状態のことである。
そこで、姿勢表現にも四元数を使うことを考える。
四元数の定義により、姿勢は回転軸と回転軸周りの回転角の情報を持つ。
ここで、姿勢クォータニオンを$ qとし、回転クォータニオンを$ pとすると、$ qを$ pによって回転させる操作は
$ pq
で表される。
よって、この回転によって姿勢$ qが姿勢$ q'に移ったとすると、
$ q' = pq
となり、両辺に$ qの逆数$ q^{-1} = \frac{q^*}{||q||^2}をかけると、
$ p = q'q^{-1}
となる。
この四元数$ pが、二つの姿勢$ qと$ q'の差分となる。
ロドリゲスの回転公式
任意の軸のまわりに角度$ \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の回転軸ベクトルである。