3次元の回転とクォータニオン その2


さて、クォータニオンをでっちあげましょう。\(I,\ X,\ Y,\ Z\)の代わりとなり得る \((1,\ i,\ j,\ k)\) の4つの数を導入し、任意の実数 \((x,\ y,\ z,\ w)\) を使って次のように書けるものをクォータニオンとします。
$$ q = w + xi + yj + zk $$
前ページの議論から、\(i,\ j,\ k\) が回転の生成子と同じような交換関係を持ち、クォータニオン同士をかけたものがまたクォータニオンになるように、\(i,\ j,\ k\) 同士のかけ算を次のように定義します。
$$
i^2 = j^2 = k^2 = -1,\\
ij = -ji = k,\ jk = -kj = i,\ ki = -ik = j
$$
こうしておけば、
$$
[i,\ j] = 2k,\ [j,\ k] = 2i,\ [k, i] = 2j
$$
となるので
$$
X \leftrightarrow \frac{i}{2},\ Y \leftrightarrow \frac{j}{2},\ Z \leftrightarrow \frac{k}{2}
$$
と対応付けることで、\(X,\ Y,\ Z\) が満たすべき交換関係を構築できます。

ところで、賢明な読者なら、\(i^2 = -1\ (X^2 = -I/4)\) という関係は2次元空間での回転でなきゃ満たせないんじゃないの? 次元が3以上なら回転で変化しない軸が必ずあるから(どの成分も \(0\) になる列や行があるはずだから) \(X^2 = -I/4\) とはなり得ないでしょう? と思うかもしれません。はい、その通りなんです。先に正体を明かしておくと、クォータニアンは3次元空間の回転を直接表現しているわけではなく、2次元の複素空間での回転をあらわしていたのです(このことは11ページ目の「まとめと余談」で説明します)。じゃあダメじゃん、なんでクォータニアンを3次元空間の回転に使えるの? という疑問が当然わいてくるわけですが、2次元空間の回転が1次元の複素空間の回転(複素平面での回転)に対応していたわけですから、3次元空間の回転が2次元の複素空間の回転に対応していても不思議ではありません。それに、「ちゃんとした対応関係」があれば3次元空間の回転を別のもので表現しても問題はないのです。

では「ちゃんとした対応関係」とは何でしょう? 上のように \(X,\ Y,\ Z\) と \(i,\ j,\ k\) を対応させれば3次元空間の回転をクォータニアンに変換することもできますし、クォータニアンを3次元空間の回転に変換することもできます。でもそれだけでいいんでしょうか? それでいいなら、どんなクォータニアンをでっちあげても良いことになってしまいます。

3次元の回転の計算で重要なのは回転の合成、つまり行列のかけ算です。もし回転行列同士のかけ算とクォータニオン同士のかけ算が同じふるまいを持つのであれば、回転行列の代わりにクォータニオンを使ってかけ算を計算しておいて、最後に回転行列に戻しても、それは始めから行列のかけ算で回転を合成したのと同じ結果になります。つまり「ちゃんとした対応関係」とはかけ算のふるまいが同じということなのです。

例えば2つの回転行列 \(A,\ B\) があり、これらの回転行列に対応したクォータニオンを \(q_A,\ q_B\) とします。
$$ A \leftrightarrow q_A,\ B \leftrightarrow q_B $$
このとき、2つの回転行列を合成した \(AB\) に対応したクォータニオンが \(q_Aq_B\) となっていれば、かけ算のふるまいが同じと言えます。
$$ AB \leftrightarrow q_A q_B $$
しかしこれは自明なことではありません。回転行列 \(A\) と回転行列 \(B\) を組み合わせたものは別の回転行列 \(C\) としてあらわすことができるわけですが、この回転行列 \(C\) をクォータニオンに変換した \(q_C\) が \(q_A q_B\) に一致することは保証されないからです。しかし、もし保証できるのであれば、回転行列の代わりにクォータニオンを使って回転を合成しておいて、いざというときに回転行列に戻しても、それは始めから回転行列で計算していたのと結果が一致することになるので、クォータニオンを回転行列の代わりに使ってよい根拠となります。

ではどうすればかけ算のふるまいが同じになることを保証できるのでしょう? それが交換関係なのです。

回転の生成子 \(X,\ Y,\ Z\) を適当に組み合せて \(X_A,\ X_B\) を作り、
$$ X_A = a_x X + a_y Y + a_z Z,\\ X_B = b_x X + b_y Y + b_z Z\, $$
回転行列 \(A\) を
$$
A = I + X_A + \cdots + \frac{1}{n!}X_A^n + \cdots \equiv e^{X_A}
$$
回転行列Bを
$$
B = I + X_B + \cdots + \frac{1}{n!}X_B^n + \cdots \equiv e^{X_B}
$$
と書いたとします。\(e^{X_A}\) なんて書くと急に難しそうに見えてしまいますが、ただの定義です。毎回テイラー展開の形式で書くのは大変だし読みづらいので、以降では \(e^{X_A}\) という書き方を多用します。行列の指数関数なんて奇妙な話ですが、このように書くのはテイラー展開の形が指数関数と同じだからです。

このとき、\(e^{X_A} e^{X_B} = e^{X_C}\) と書いたならば、回転行列と回転行列を合成したものは回転行列なので(※)、
$$ X_C = c_x X + c_y Y + c_z Z $$
の形で書けるはずです。一方で \(X_C\) は \(X_A\) と \(X_B\) の関数になっているはずですが、\(X_A^2\) や \(X_A X_B\) といった行列は \(X,\ Y,\ Z\) の線形結合では表現できません。\(X_A X_B = X_B X_A\) が成り立つならば \(X_C = X_A + X_B\) となりますが、これが成り立つのは2つの回転の回転軸が同じ場合だけです。2つの回転の回転軸が異なる場合、\(X_C\) には \(X_A,\ X_B\) の2個以上の積が含まれるはずです。そして、\(X_C\) が上の式のように \(X,\ Y,\ Z\) の線形結合で書けるのであれば、\(X_A\) と \(X_B\) の積は交換子によってのみ現れるはずです(そうであれば \(X_A X_B = X_B X_A\) のときに \(X_C = X_A + X_B\) となることも保証されますね)。つまり、異なる回転軸を持つ回転行列を合成したときのふるまいは、生成子 \(X,\ Y,\ Z\) の交換関係によって決まるのです。

実は、このことをはっきりと裏付けるBaker-Campbell-Hausdorffの公式というものがあるのです。この公式は、
$$ X_C = X_A + X_B + \frac{1}{2}[X_A,\ X_B] + \frac{1}{12}([X_A,\ [X_A,\ X_B]] + [X_B,\ [X_B,\ X_A]]) + \cdots $$
になるというもので、\(X_A\) と \(X_B\) の積は交換子によってのみ現れることを示しています。

ここで、もし \(X_A,\ X_B\) を違う何か (\(i_A, i_B\)) に置き換えて \(e^{i_A} e^{i_B} = e^{i_C}\) を計算しても同じように
$$ i_C = i_A + i_B + \frac{1}{2}[i_A,\ i_B] + \frac{1}{12}([i_A,\ [i_A,\ i_B]] + [i_B,\ [i_B,\ i_A]]) + \cdots $$
となるので、\(X_A \leftrightarrow i_A,\ X_B \leftrightarrow i_B\,\ X_C \leftrightarrow i_C\) と対応させるときに交換関係さえ維持しておけば、回転行列 \(A = e^{X_A},\ B = e^{X_B},\ C = e^{X_C}\) とクォータニオン \(q_A = e^{i_A},\ q_B = e^{i_B},\ q_C = e^{i_C}\) は「ちゃんとした対応関係」を持っていると言うことができます。

このBaker-Campbell-Hausdorffの公式はクォータニオンを3次元空間の回転として使ってよいことを示す決定的な証拠となるので、次のページで証明します。回転行列と回転行列を合成したら回転行列になるという状況証拠で満足できる人や、証明なんかどうでもいいって人は次のページを飛ばして9ページ目に進んでもかまいません。

(※) 回転行列と回転行列を合成したものが回転行列になるというのは、それほど自明なことではないと思う人もいるでしょう。回転行列 \(A\) と回転行列 \(B\) を合成して行列 \(C = AB\) ができたとします。\(A,\ B\) は回転行列なので \(A^TA = B^TB = I,\ \mathrm{det}A = \mathrm{det}B = 1\) ですが、行列 \(C\) もこの性質を引き継ぎます。
$$
C^TC = (AB)^T(AB) = B^TA^TAB = I,\\
\mathrm{det}C = \mathrm{det}A \mathrm{det}B = 1
$$
この性質は行列によって座標変換された後の座標軸が正規直交座標系を維持し、外積の向きも変えない(右手座標系なら右手座標系のままになる)ことを意味するので、こうなることは当然ではあります。

ここで、行列 \(C\) で変化しないベクトル \(\vec{c}\) がみつかったとします。\(\vec{c}\) に直交するベクトル \(\vec{a}\) をひとつ選び、行列 \(C\) をかけたならば、\(C^TC = I\) となることから、\(C\) によってベクトルの内積は変化しないはずなので、\(C\vec{a}\) もまた\(\vec{c}\) に垂直なベクトルになるはずです。つまり、少なくとも \(\vec{a}\) は行列 \(C\) によって \(\vec{c}\) を軸としながら回転されることになります。次に、\(\vec{b} = \vec{c} \times \vec{a}\) を \(C\) で変換してみましょう。\(C^TC = I\) に加えて \(\mathrm{det}C = 1\) でもあるので、行列 \(C\) は外積の関係を維持します(2ページ目最後の(※)参照)。つまり、\(C\vec{b} = \vec{c} \times (C\vec{a})\) となるので、\(\vec{b}\) は行列 \(C\) によって \(\vec{c}\) を回転軸として \(\vec{a}\) と同じ角度だけ回転されることがわかります。今、3つの互いに直交するベクトル \(\vec{a},\ \vec{b},\ \vec{c}\) が行列 \(C\) によってどのように変化するかを見てきました。いずれも \(\vec{c}\) を軸とした同じ回転の影響を受けます。任意のベクトルはこれら3つのベクトルの線形結合であらわされ、行列が線形演算であることから、行列 \(C\) が回転行列であることが言えます。

あとは \(\vec{c}\) をみつけるだけです。任意の回転軸まわりの回転行列がどのようになるかを知っていれば、行列の反対称成分
$$ \vec{c} = \left(\begin{array}{c} C_{32}\ -\ C_{23} \\ C_{13}\ -\ C_{31} \\ C_{21}\ -\ C_{12}\end{array}\right) $$
が回転軸に平行なベクトルであることがわかるでしょう。このベクトルが行列 \(C\) で変化しないことを示します。

まず行列 \(C\) を3つの列ベクトルを使って
$$ C = \left(\begin{array}{ccc} & & \\ \vec{c_1} & \vec{c_2} & \vec{c_3} \\ & & \end{array}\right) $$
と書いたとします。また、\(x,\ y,\ z\) 方向の単位ベクトルをそれぞれ \(\hat{x_1},\ \hat{x_2},\ \hat{x_3}\) とすれば、上の \(\vec{c}\) は
$$ \vec{c} = \left(\begin{array}{c} \hat{x_3} \cdot \vec{c_2}\ -\ \hat{x_2} \cdot \vec{c_3} \\ \hat{x_1} \cdot \vec{c_3}\ -\ \hat{x_3} \cdot \vec{c_1} \\ \hat{x_2} \cdot \vec{c_1}\ -\ \hat{x_1} \cdot \vec{c_2} \end{array}\right) $$
と書けます。ここに行列 \(C\) を左からかければ、
$$ C \vec{c} = (\hat{x_3} \cdot \vec{c_2}\ -\ \hat{x_2} \cdot \vec{c_3}) \vec{c_1} + (\hat{x_1} \cdot \vec{c_3}\ -\ \hat{x_3} \cdot \vec{c_1}) \vec{c_2} + (\hat{x_2} \cdot \vec{c_1}\ -\ \hat{x_1} \cdot \vec{c_2}) \vec{c_3} $$
となりますが、次の恒等式
$$ \vec{x} \times (\vec{y} \times \vec{z}) = (\vec{x} \cdot \vec{z}) \vec{y}\ -\ (\vec{x} \cdot \vec{y}) \vec{z} $$
を使えば、
$$ C \vec{c} = \hat{x_1} \times (\vec{c_2} \times \vec{c_3}) + \hat{x_2} \times (\vec{c_3} \times \vec{c_1}) + \hat{x_3} \times (\vec{c_1} \times \vec{c_2}) $$
と変形できます。\(\vec{c_1},\ \vec{c_2},\ \vec{c_3}\) は \(C^TC = 1\) であることから大きさが1で互いに直交することがわかります。また行列式が1、つまり、
$$ \mathrm{det}C = \vec{c_1} \cdot (\vec{c_2} \times \vec{c_3}) = \vec{c_2} \cdot (\vec{c_3} \times \vec{c_1}) = \vec{c_3} \cdot (\vec{c_1} \times \vec{c_2}) = 1 $$
となることも考慮すると、
$$ \vec{c_1} = \vec{c_2} \times \vec{c_3},\ \vec{c_2} = \vec{c_3} \times \vec{c_1},\ \vec{c_3} = \vec{c_1} \times \vec{c_2} $$
が言えます。これを使うと
$$ C \vec{c} = \hat{x_1} \times \vec{c_1} + \hat{x_2} \times \vec{c_2} + \hat{x_3} \times \vec{c_3} = \vec{c} $$
となることが確認できます。

補足
あまり複雑な計算を使わずに行列 \(C\) が回転行列になることを幾何学的に説明する方法を思いついたので追記しておきます。

\(\hat{x_1}\) を \(C\) で変換したものが \(\vec{c_1}\) なので、仮に \(C\) が回転軸 \(\vec{c}\) を持つ回転行列だとすれば、\(\vec{c}\) は \(\vec{c} \cdot \hat{x_1} = \vec{c} \cdot \vec{c_1}\) を満たす平面上にあるはずです。同じように、\(\hat{x_2}\) を \(C\) で変換したものが \(\vec{c_2}\) なので、\(\vec{c}\) は \(\vec{c} \cdot \hat{x_2} = \vec{c} \cdot \vec{c_2}\) を満たす平面上にあるはずです。これらの平面は共に原点を通り、必ず交わるので、このような \(\vec{c}\) は必ず存在します。

これで \(\hat{x_1}\) と \(\hat{x_2}\) が共通の軸を中心に回転して \(\vec{c_1},\ \vec{c_2}\) に移れることがわかりましたが、回転角は同じになるでしょうか? \(C^TC = I,\ \mathrm{det}C = 1\) であることから、行列 \(C\) は内積や外積の関係を維持します。つまり、\(\vec{c_1} \cdot \vec{c_2} = 0\) および \(\vec{c_1} \cdot (\vec{c} \times \vec{c_2}) = \hat{x_1} \cdot (\vec{c} \times \hat{x_2})\) が成り立つはずです。\(\vec{c_2}\) は \(\hat{x_2}\) を \(\vec{c}\) 軸まわりに回転させて得ることができるので、\(\vec{c}\) を中心軸とした \(\hat{x_2}\) に接する円錐面上にあるはずです。そして、この円錐面と \(\vec{c_1} \cdot \vec{c_2} = 0\) を満たす平面との交線は2つありますが、そのうちの片方だけが \(\vec{c_1} \cdot (\vec{c} \times \vec{c_2}) = \hat{x_1} \cdot (\vec{c} \times \hat{x_2})\) を満たすことになります。\(\hat{x_1}\) と \(\hat{x_2}\) が \(\vec{c}\) まわりに同じ角度だけ回転したならば、当然これらの関係を満たし、他の解の可能性はないことになります。

\(\vec{c_3}\) が残っていますが、\(C^TC = I,\ \mathrm{det}C = 1\) であることから、\(\vec{c_3} = \vec{c_1} \times \vec{c_2}\) と一意に決まり、行列 \(C\) が回転行列ならばこの関係を当然満たすので、\(\hat{x_3}\) を \(\vec{c}\) を回転軸として、\(\hat{x_1},\ \hat{x_2}\) と同じ角度だけ回転すると \(\vec{c_3}\) になることがわかります。
(補足ここまで)

6 thoughts on “クォータニオン徹底解説

  • 2018/11/04 at 6:20 AM
    Permalink

    Baker-Campbell-Hausdorffの公式と X, Y, Z の交換関係
    [X, Y]=Z, [Y, Z]=X, [Z, X]=Y

    を使えば、 e^XC=e^XA*e^XB としたときの XC は
    XC={a⃗ +b⃗ +12(a⃗ ×b⃗ )+112{a⃗ ×(a⃗ ×b⃗ )+b⃗ ×(b⃗ ×a⃗ )}+⋯}⋅X
    これのどこに交換関係を利用しておられるのですか?

    Reply
  • 2018/11/04 at 6:22 AM
    Permalink

    9ページの最初の方に書かれている内容です

    Reply
  • 2018/11/05 at 11:47 AM
    Permalink

    コメントありがとうございます。
    $$ [X_A, X_B] = (\vec{a} \times \vec{b}) \cdot \vec{X} $$
    とするのに使っています。

    Reply
  • 2018/11/06 at 4:26 AM
    Permalink

    こんな質問にまで答えてくださりありがとうございます

    Reply
  • 2018/11/07 at 4:50 AM
    Permalink

    10ページの内容なのですがR(a→ 、 θ)にベクトルv→ をかけるとa→ を軸にθだけ回転した式が与えられるのであればRに対応したクォータニオンqで
    v→*qで回転したv→が求められそうだと思ったのですが、これでは値は求められないのでしょうか?

    Reply
    • 2018/11/07 at 1:18 PM
      Permalink

      9ページまでの説明で、回転行列同士の積とクォータニオン同士の積は同じ振舞いをすることがわかったわけですが、ベクトルに対する作用が同じということまでは言えません。そもそも、ベクトルにクォータニオンを作用させる方法も定義されていません。
      そこで、10ページ目では、回転行列の座標変換(これは回転行列同士の積だけで表される)を使ってベクトル(回転軸)が変換されることを示し、それに対応したクォータニオン同士の積から、クォータニオンでベクトルを回転させる方法を導いています。

      Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *