クォータニオン勉強録
クォータニオン(四元数)について自分なりに勉強したことをまとめる
クォータニオンとは
そもそもクォータニオンとは.一つの数の種類である.
自然数,整数,有理数などと同じように,四元数という数が存在する.

クォータニオンを学ぶ前に,複素数の復習をするとよい.
復習 -複素数-
複素数平面では,
同様に,複素平面の単位円上にある任意の点を二乗すると,回転角は倍角になった.
例)
三乗すると三倍角に,四乗すると四倍角になる.
考えてみてほしい.デカルト座標系で回転を表そうと思ったら,例えば線形代数を覚えているのなら,回転行列を掛け合わせる必要があった.
それが,
また,複素平面では,単位円上の任意の点を,
と表すことができた.
ここまでの内容を覚えておくと,クォータニオンに入るのが少し楽になる.
導入
復習の部分で,複素数は2次元の回転表現に非常に適していると述べた.
ウィリアム・ローワン・ハミルトン(ハミルトン閉路問題とかで出てくる人)もそのように考え,これを3次元の回転表現に拡張できないかと考えた.
そして,虚数を3つに増やすことで,3次元の回転表現を単純な掛け算で表せることに気が付いた.
以下にその概要を示す.クォータニオンを
で表される.また,虚数単位
を満たす.
これだけ見ると項が多くてわかりづらいように感じるが,実部と虚部に分かれている点は複素数と同じである.
クォータニオンの演算
クォータニオンは掛け算において群になっている.クォータニオンの集合を
-
単位元がある
実部のみが1で,虚部が全て0になっているクォータニオンが単位元である.
と表され,単位クォータニオンと呼ばれる.I -
逆元がある
演算すると単位元になるような,逆クォータニオンが存在する.
逆クォータニオンを作るには,共役のクォータニオンを元のクォータニオンのノルムで割れば良い.
逆クォータニオンは ,共役のクォータニオンはq^{-1} ,ノルムはq^* と書く.\|q\| の式の共役,ノルム,逆クォータニオンは次のように計算できる.(1) q^* = \omega - a\textcolor{#E69F00}i -b\textcolor{#56B4E9}j - c\textcolor{#009E73}k\\[6pt] \|q\| = \sqrt{\omega^2 + a^2 + b^2 + c^2} \\[4pt] q^{-1} = \frac{q^*}{\|q\|} -
結合法則が成り立つ
について,\forall q_0, q_1, q_2 q_0 \cdot (q_1 \cdot q_2) = (q_0 \cdot q_1) \cdot q_2 が成り立つ.
ただし,クォータニオンは非可換群なので,
となる.
回転表現の種類
次の章に行く前に,回転表現の種類について触れておく.
回転の表現方法は大まかに二種類ある.オイラー角によるものと,クォータニオンによるものだ.
オイラー角では,

ただ回転を表すだけならば,こちらの方がより直感的で分かりやすいのだが,オイラー角による回転にはいくつか欠点がある.オイラー角による回転は,ジンバルロックが発生する.
ジンバルロックとは
オイラー角による回転表現は,回転させる順番が大事になる.
例として,Unityでは,z→x→yの順で回転させる.
この時,x軸にのみ
字面だけ見てもわからないと思うので,動画を探すことをお勧めする.
個人的には,swapを2変数でやろうとした時と同じような問題が起こっているのかなという印象を持った.片方の変数が上書きされて参照できなくなってしまう.みたいな.
また,オイラー角では,1つの物体を回転させるのに,x軸y軸z軸の計3回回さなければならず,計算量が増える.
一方,クォータニオンを用いた回転表現は,任意の方向に回転軸を取って,その回転軸に対して

このやり方の場合,ジンバルロックは発生しない.また,複素数の時と同じように,掛け算をすることで回転を表現できるため,クォータニオンはコンピュータグラフィックスなどで重宝される.
クォータニオンによる回転表現
ここからは,実際どのような式を用いて回転を表現するのかを見ていく.
クォータニオンで回転表現をする時は,複素数の時と同じように,単位球上を動かす.
そのため,単位球上の任意の点を表すクォータニオンはこのように表現される.
ここで,
となる任意の実数である.
これは,複素平面の単位円上の任意の点を表す式とよく似ているが,
複素数の時は
になっていたり,複素数の時は
前者は,虚数単位が3つに増えたためであり,それぞれの虚数の係数
なら,x-y平面に対して
後者については,まあ一言で言えば辻褄合わせなのだが.それだけだと説明として味気がないので,補足を入れておく.
補足
クォータニオンには二価性という性質がある.二周してようやく元に戻ってくるというような性質だ[1].逆に言えば,二周しないと絶対に元には戻って来れないのだ.この性質により,私たちの考える

ベクトルの回転
さて,任意の3次元ベクトルを回転させるにはどうすれば良いだろう.
クォータニオン同士の掛け算はできるが,クォータニオンとベクトルの掛け算は定義されていないので,どうしても無理な気もする.
だがこれを,ベクトルを無理やりクォータニオンに変換することで解決する.
例えば,
とする.ちなみに,このように実部が0のクォータニオンは純粋クォータニオンと呼ばれる.
この,ベクトルから作られたクォータニオンと,回転を表すクォータニオンをかけることで,回転させた後のベクトルを取り出すことができる.
ただし,
とする必要がある.こうすることで,純粋クォータニオンを得ることができ,ベクトルに直すことができる.これは,線形代数で扱った対角化と似ているように思う.
逆に,あるベクトルAから,あるベクトルBに移動させるような回転を表すクォータニオンを知りたければ,ベクトルA,Bの内積と外積を取れば良い.
内積と外積についてはまた別のところにまとめるつもりだが,ざっくりいうと,内積で回転角度.外積で回転軸を出すことができる.
姿勢の回転
実際によく用いられるのはこっちだろうと思う.(しらないけど)
一本のベクトルを回転させるだけなら,回転軸はいくらでも取れる.
しかし,三つの正規直行ベクトルを基底ベクトルとした姿勢を回転させるにはどうすれば良いだろうか.
ここでは,回転させたい基底ベクトルを相対座標系(ローカル座標系)とし,絶対に回転しない,基準となる基底ベクトルを絶対座標系(グローバル座標系)と表現する.
今度は,基底ベクトルのそれぞれの絶対座標(グローバル座標)を行列に表す.ここで,
この時,この姿勢を表すクォータニオンはこのように表される.
この
上記の式の導出にはロドリゲスの回転公式を用いるのだが,これに関しては私も詳しくないので教えてください.
この姿勢クォータニオンを回転させたければ,回転を表すクォータニオンをかければ良い.
逆に,ある姿勢Aからある姿勢Bに移動させるような回転を表すクォーニオンが知りたければ,
とすれば良い.
座標系の変換ならびに回転方向の反転
上で紹介しきれなかった部分を寄せ集めた感じになってしまった.
実際にコンピュータでクォータニオンを使って何かさせようと思った時,必ず座標系の設定をする必要がある.座標系には二種類あり,右手系と左手系と呼ばれている[2].
右手系で作ったクォータニオンを,左手系に持ってきてもうまくいかない.
逆もまた然りだ.
右手系から左手系にクォータニオンを変換するには,
このように,
また,クォータニオンの全ての符号を反転させると,逆回転して同じ位置に移動する.
結び
今回はここまでにしておこうと思う.
クォータニオンはコンピュータグラフィックスでとてもよく用いられている数体系であり,知識として知っておいて損はないと思う.
ただ,ロボティクスなどでは,クォータニオンの二価性が問題になる場合もあるので,その場合は六元数などを検討してみるのも良いだろう.
参考文献
以下の動画・PDFを参考にした.
また,姿勢クォータニオンの部分については,chatGPTを参考にしているので,間違っている部分があるやもしれない.もし,もっと良い方法・説明があれば教えていただきたい.
Discussion