モーションにおける3次元回転 #8 〜単位クォータニオンによる回転合成〜
単位クォータニオンの演算
ここでは,回転合成と前章まで議論したロドリゲスの式の,単位クォータニオン(オイラーパラメータ)による表現を示す.
回転合成の節では,行列表現によってクォータニオン同士の線形計算ができることを示すが,この行列表現を用いることでMatlab, Python(Numpy)などの行列計算を利用でき,プログラミングの記述も行いやすくなり.計測制御の観点では,行列表現によってKalman Filterなどの状態方程式を記述しやすい形式となる.また,このような演算はオイラー角ではできない.3自由度で表現するオイラー角と比較し自由度がひとつ高くなるデメリットはあるが,単位クォータニオンを使用することで計算上,または回転を幾何学的に理解する上でも,多くのメリットが得られる.そこで本稿では,具体的な計算例を示しながら行列表現による単位クォータニオンの演算を中心に示す.
また,次章ではこれまで示した3次元回転と単位クォータニオンによる演算をまとめて示す予定である.
クォータニオン積
でクォータニオン積について述べたが,単位クォータニオンでもクォータニオン積の演算が成り立つ.
単位クォータニオン$${\bm{q}=q_0+q_1 i+q_2 j+q_3 k, ~\bm{p}=p_0+p_1 i+p_2 j + p_3 k}$$に対するクォータニオン同士の積も
$$
\bm{qp} = (q_0+q_1 i+q_2 j+q_3 k)(p_0+p_1 i+p_2 j + p_3 k)
\\=
q_0 p_0 - q_1 p_1 - q_2 p_2 - q_3 p_3\\
+(q_0 p_1 + q_1 p_0 + q_2 p_3 - q_3 p_2)i\\
+(q_0 p_2 - q_1 p_3 + q_2 p_0 + q_3 p_1)j\\
+(q_0 p_3 + q_1 p_2 - q_2 p_1 + q_3 p_0)k
$$
のように同様に計算できる.
この計算は,地道に虚数単位の演算
$$
jk=i, ki=j, ij=k,kj=−i, ik=−j, ji=−k
$$
などを利用して,一つ一つ計算すれば上記の解を得られる.また,このような表現方法ではプログラミングにも時間がかかるので,この結果を利用して
$$
\bm{qp}=
\bm{A}_q \bm{p}
=
\begin{bmatrix}
q_0 & -q_1 & -q_2 & -q_3\\
q_1 & q_0 & -q_3 & q_2\\
q_2 & q_3 & q_0 & -q_1\\
q_3 & -q_2 & q_1 & q_0
\end{bmatrix}
\begin{bmatrix}
p_0\\
p_1\\
p_2\\
p_3
\end{bmatrix}~~~~~~~~~
(1)
$$
または,
$$
\bm{qp}=
\bm{B}_p \bm{q}=
\begin{bmatrix}
p_0 & -p_1 & -p_2 & -p_3\\
p_1 & p_0 & p_3 & -p_2\\
p_2 & -p_3 & p_0 & p_1\\
p_3 & p_2 & -p_1 & p_0
\end{bmatrix}
\begin{bmatrix}
q_0\\
q_1\\
q_2\\
q_3
\end{bmatrix}
~~~~~~~~~
(2)
$$
のような行列表現を用いると良い.なお,この「単位クォータニオン同士の積」は幾何学的に回転の合成を意味するが,このことは後半に示す.また,$${\bm{qp}}$$は式(1)でも(2)でも同じ結果を得られるが,このことは,後ほどでも述べるが,単位クォータニオンの積は可換ではない
$$
\bm{qp}\neq\bm{pq}
$$
ことを示している.つまり掛け算の順番に依存するが,これは回転行列と同様である.
注意1
単位クォータニオン同士の積の結果もノルムが1である単位クォータニオンとなり,これがクォータニオン積との違いである.しかし実際の数値計算においては積の演算による数値計算誤差によって,そのノルムが1からずれるので,クォータニオン積によって新しく計算された単位クォータニオンを
$$
\frac{\bm{q}}{||\bm{q}||}
$$
のように常にクォータニオンのノルムで割って補正を行う必要がある.
単位クォータニオンと3次のベクトルとの積の扱い
ここから先は
¥ 100