クォータニオンによる回転表現初心者のための基本計算

どうも, レッシーです.

今回の記事はクォータニオンについてです. 私が学部生の頃に(かれこれ8年前)研究室の課題として勉強しました. 当時はネットにもあまりいい記事がなくて苦労しましたが, この頃は多くの記事が見つかります. それでもまだクォータニオン初心者にはとっつきにくいのではないかと思います.

クォータニオンがどうして回転を表せるのか, しっかり説明しようとするとA4用紙4ページほどかかります. 今回はそこらへんのしっかりとした説明はせず, その説明のために知っておかないといけない簡単な計算をまとめます.

虚数単位の計算

クォータニオンは四元数とも呼ばれます. 複素数のように虚数単位をとるのですが, クォータニオンの虚数単位は\(\mathrm{i}\), \(\mathrm{j}\), \(\mathrm{k}\)の3つがあります. 複素数のときは, 虚数単位を2乗すれば\(-1\)となりましたね. クォータニオンでの虚数単位の掛け算はつぎのようになります.

$$
\mathrm{i}^{2}=-1,
\mathrm{j}^{2}=-1,
\mathrm{k}^{2}=-1 \\
\mathrm{i}\mathrm{j}=\mathrm{k},
\mathrm{j}\mathrm{i}=-\mathrm{k} \\
\mathrm{j}\mathrm{k}=\mathrm{i},
\mathrm{k}\mathrm{j}=-\mathrm{i} \\
\mathrm{k}\mathrm{i}=\mathrm{j},
\mathrm{i}\mathrm{k}=-\mathrm{j}
$$

これら虚数単位の掛け算は可換ではないことに注意してください. これらの掛け算は, 虚数単位をパウリ行列を用いて表せば普通の行列積として表せたりしますが, ここでは話しません.

クォータニオンの表記ルール

この記事では, クォータニオン\(Q\)をつぎのように表すとします.

$$Q=q_{0}+q_{1}\mathrm{i}+q_{2}\mathrm{j}+q_{3}\mathrm{k}$$

クォータニオンを用いれば回転を表すことができます. しかし「クォータニオン\(=\)回転を表す式」ではないことに注意してください.

クォータニオンは4次元ベクトルのように記述されることが多いです. これにはクォータニオン同士の掛け算が簡単に表記できることや回転を扱う際に便利というメリットがあるからです. 兎にも角にも, この記事ではつぎのようにクォータニオンを表現できるとしましょう.

$$
Q =
\begin{pmatrix}
q_{0} \\ q_{1} \\ q_{2} \\ q_{3}
\end{pmatrix}
=
\begin{pmatrix}
q_{0} \\ \mathrm{q}
\end{pmatrix}
$$

$$
\mathrm{q} =
\begin{pmatrix}
q_{1}\\q_{2}\\q_{3}\\
\end{pmatrix}
$$

ここで\(\mathrm{q}\)はただの3次元ベクトルです.

クォータニオンの掛け算

クォータニオンは分配法則をもちいて普通の掛け算をすれば計算できます. ただし可換ではないことに注意してください.

$$P Q =
(p_{0}+p_{1}\mathrm{i}+p_{2}\mathrm{j}+p_{3}\mathrm{k})
(q_{0}+q_{1}\mathrm{i}+q_{2}\mathrm{j}+q_{3}\mathrm{k}) \\
=p_{0}q_{0}+p_{0}q_{1}\mathrm{i}
+p_{0}q_{2}\mathrm{j}+p_{0}q_{3}\mathrm{k}\\
+p_{1}q_{0}\mathrm{i}-p_{1}q_{1}
+p_{1}q_{2}\mathrm{k}-p_{1}q_{3}\mathrm{j}\\
+p_{2}q_{0}\mathrm{j}-p_{2}q_{1}\mathrm{k}
-p_{2}q_{2}+p_{2}q_{3}\mathrm{i}\\
+p_{3}q_{0}\mathrm{k}+p_{3}q_{1}\mathrm{j}
-p_{3}q_{2}\mathrm{i}-p_{3}q_{3}
$$

この計算をベクトル表記に直せばつぎのように書き表されます.

$$
PQ =
\begin{pmatrix}
p_{0}q_{0}-p_{1}q_{1}-p_{2}q_{2}-p_{3}q_{3} \\
p_{0}q_{1}+p_{1}q_{0}+p_{2}q_{3}-p_{3}q_{2}\\
p_{0}q_{2}+p_{2}q_{0}+p_{3}q_{1}-p_{1}q_{3}\\
p_{0}q_{3}+p_{3}q_{0}+p_{1}q_{2}-p_{2}q_{1}
\end{pmatrix}
$$

特殊な場合として, $p_{0}=0$, $q_{0}=0$のときを考えましょう. クォータニオンで回転を考える際には頻出する計算です. 突然ではありますが, クォータニオンをベクトル表記で表した際, クォータニオン同士の掛け算を表す記号を\(\otimes\)とします. つまり, つぎのように表せるとします.

$$
PQ =
\begin{pmatrix}
p_{0} \\ p_{1} \\ p_{2} \\ p_{3}
\end{pmatrix}
\otimes
\begin{pmatrix}
q_{0} \\ q_{1} \\ q_{2} \\ q_{3}
\end{pmatrix}
$$

先程のクォータニオン同士の掛け算の結果から, つぎが導かれます.

$$
\begin{pmatrix}
0 \\ p_{1} \\ p_{2} \\ p_{3}
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\ q_{1} \\ q_{2} \\ q_{3}
\end{pmatrix}
=
\begin{pmatrix}
-p_{1}q_{1}-p_{2}q_{2}-p_{3}q_{3} \\
p_{2}q_{3}-p_{3}q_{2}\\
p_{3}q_{1}-p_{1}q_{3}\\
p_{1}q_{2}-p_{2}q_{1}
\end{pmatrix}
$$

3次元ベクトル\(\mathrm{p}\), \(\mathrm{q}\)を使うとつぎのように表せます.

$$
\begin{pmatrix}
0 \\ \mathrm{p}
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\ \mathrm{q}
\end{pmatrix}
=
\begin{pmatrix}
-\mathrm{p} \cdot \mathrm{q}\\
\mathrm{p} \times \mathrm{q}
\end{pmatrix}
$$

ここで\(\cdot\)はベクトルの内積, \(\times\)はベクトルの外積を表します.

回転を表すクォータニオン

物体の姿勢は, 基本の姿勢からどの軸回りにどれだけ回転したかで表すことができます. 回転軸を3次元単位ベクトル\(\mathrm{w}\)で表し, 回転量を\(\theta\)radで表すとします. この回転をクォータニオン\(Q\)とするとつぎのように表されます.

$$
Q=
\begin{pmatrix}
\cos \frac{\theta}{2} \\
\mathrm{w} \sin \frac{\theta}{2}\\
\end{pmatrix}
=
\begin{pmatrix}
\cos \frac{\theta}{2} \\
w_{x} \sin \frac{\theta}{2}\\
w_{y} \sin \frac{\theta}{2}\\
w_{z} \sin \frac{\theta}{2}
\end{pmatrix}
$$

ここで\(w_{x}\), \(w_{y}\), \(w_{z}\)はそれぞれ\(\mathrm{w}\)の\(x\)成分, \(y\)成分, \(z\)成分です. なぜ\(\theta /2\)であるのかは後で簡単に説明します.

回転の合成

ベクトルをある軸周りに回転させた後, 別の軸回りで更に回転させる場合もあると思います. この2回分の回転を1つの回転で表すことができます(詳しくいうと, 回転する際に通った経路は無視して, 回転した後にどこにいるのかを1つのクォータニオンで表すことができます). 一度目の回転が\(\mathrm{w}_{1}\)軸回りに\(\theta_{1}\)rad, 二度目の回転が\(\mathrm{w}_{2}\)軸回りに\(\theta_{2}\)radとするとつぎのように回転を合成します.

$$
\begin{pmatrix}
\cos \frac{\theta_{2}}{2} \\
\mathrm{w}_{2} \sin \frac{\theta_{2}}{2}
\end{pmatrix}
\otimes
\begin{pmatrix}
\cos \frac{\theta_{1}}{2} \\
\mathrm{w}_{1} \sin \frac{\theta_{1}}{2}
\end{pmatrix}
$$

後の回転のほうが左に来ます. クォータニオン積は可換ではないため, この順番でなくてはなりません. このクォータニオン積の結果もまた, 回転を表すクォータニオンとなるのですが, 今回は割愛します.

クォータニオンが回転を表すという話

ここまでの計算を知った上で, どのように回転を表しているのか簡単に説明します. とあるベクトル\(\mathrm{u}\)を\(\mathrm{w}\)軸回りに\(\theta\)回転させるとベクトル\(\mathrm{v}\)になるとします. このときつぎの計算が成り立ちます.

$$
\begin{pmatrix}
0 \\ \mathrm{v}
\end{pmatrix}
=
\begin{pmatrix}
\cos \frac{\theta}{2} \\ \mathrm{w} \sin \frac{\theta}{2}
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\ \mathrm{u}
\end{pmatrix}
\otimes
\begin{pmatrix}
\cos \frac{\theta}{2} \\ -\mathrm{w} \sin \frac{\theta}{2}
\end{pmatrix}
$$

なんで\(\theta /2\)なのかというはなしですが, 実は\(\mathrm{u}\)と\(\mathrm{w}\)が直交しているとき, つぎの式が成り立ちます.

$$
\begin{pmatrix}
0 \\ \mathrm{v}
\end{pmatrix}
=
\begin{pmatrix}
\cos \theta \\ \mathrm{w} \sin \theta
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\ \mathrm{u}
\end{pmatrix}
=
\begin{pmatrix}
0 \\ \mathrm{u}
\end{pmatrix}
\otimes
\begin{pmatrix}
\cos \theta \\ -\mathrm{w} \sin \theta
\end{pmatrix}
$$

直交している場合はわざわざ\(\theta\)を2で割る必要はないのです. しかし, (\mathrm{u})と(\mathrm{w})が直交していない場合に同様の計算をするとおかしなことになります. これをうまく打ち消すため\(\theta\)を2で割って, 左右からクォータニオン積で挟むなんて面倒なことをやってます.

本当にこの計算で\(\mathrm{u}\)が望んだ回転をし, \(\mathrm{v}\)となるのかについてはまた後日記事にするかもしれません. 今回はここまで.

★ スポンサーリンク ★
プレミアムバンダイ  プレミアムバンダイ

コメント

タイトルとURLをコピーしました