オイラー角に潜む5つの罠

# オイラー角には罠がたくさん！！

3次元の姿勢表現によく用いられる**『オイラー角』**。
他の姿勢表現には**『回転行列』、『クォータニオン』**などが挙げられる。他にもいろいろあるけど、代表的なのはこの3つ。

その中でもオイラー角は、3つのパラメータで表現できることや、人間に理解しやすい構造をしている、といった利点がある。
ただし、実際に扱うとなると非常に面倒くさい性質を持っている。

この記事は、オイラー角の面倒な性質をまとめて解説する記事である。
解説というよりも愚痴に近いかもしれない。

# オイラー角とは

以下、Wikipediaより抜粋。

> オイラー角は3つの角度の組で表される。 一方の座標系を$( x, y, z )$で表し、他方を$( X, Y, Z )$で表す。
簡単のために、2つの座標系は原点を共有するものと考える。

>オイラー角は座標軸まわりの回転を繰り返すことで表すこともできる。
> 1. $( x, y, z )$ を $z$軸まわりに角度$\alpha$回転させ、$( x', y', z' )$ とする。
2. $( x', y', z' )$ を $x'$軸まわりに角度$\beta$回転させ、$( x'', y'', z'' )$ とする。
3. $( x'', y'', z'' )$ を $z''$軸まわりに角度$\gamma$回転させれば $( X, Y, Z )$ となる。
このとき $( \alpha, \beta, \gamma )$ がオイラー角である。 

> 上記の定義は z軸-x軸-z軸の順に回転するので z-x-z系のオイラー角とよばれる。
実際にはどの軸のまわりに回転させるかに任意性があり、同じ座標系をあらわすのに全部で12通りの表現法がある。

> ![Euler](https://upload.wikimedia.org/wikipedia/commons/8/85/Euler2a.gif "Euler")

オイラー角を扱う上で、重要なポイントは以下の通り。

- **3つのパラメータを持つこと**
- **各軸周りに3回の回転操作を行うこと**
- **回転操作に順序があること**
- **1つの姿勢に対して12通りの表現方法があること**

ポイントの上2つは理解しやすいが、問題は下の2つ。
こいつらのせいで話がややこしくなる。12通りも考慮するのは面倒だ。

またオイラー角を扱っていく中で、話をややこしくしていると感じた点を挙げる。

- **ジンバルロックの存在**
- **解説ページによって表現方法が統一されていない**
- **回転行列やクォータニオンとの相互変換の過程が曖昧**
- **固定角とオイラー角の差異が曖昧**

この辺に気を付けながら、以下解説する。


# オイラー角の心得

オイラー角の心得として**『覚えるな、理解しろ。』**とだけ書く。

他の解説ページや以下の解説で、いろんな数式や行列が出てくる。
が、**数式自体には何の意味も無いから覚える必要は無い。**

前述したように、オイラー角は軸順を考慮し12種類もある。
つまり、『数式が1つ出てきたらその12倍は考慮する必要がある』ということ。(台所の黒い虫みたいだね)

実際には、全パターンを考えるなんてことはまず無い。
大事なのは、**『導出過程を把握』して『自身が扱う系に適用』すること**である。

# 前提条件

ややこしいポイントとして、『解説ページによって表現方法が統一されていない』と記載した。
書籍なんかでも統一されていないようだし、ちゃんと理解していないと読み解けない。

前提条件が異なると結果も異なるため、以下にこの記事で用いる前提条件を記載する。
勿論これが正しいというワケではないので、悪しからず。
***
- **回転行列**

```math
\boldsymbol{R} _x (\theta)  = 
\begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \theta & -\sin \theta  \\
0 & \sin \theta & \cos \theta
\end{pmatrix}
\\
\boldsymbol{R} _y (\theta)  = 
\begin{pmatrix}
\cos \theta & 0 & \sin \theta  \\
0 & 1 & 0 \\
-\sin \theta & 0 & \cos \theta
\end{pmatrix}
\\
\boldsymbol{R} _z (\theta)  = 
\begin{pmatrix}
\cos \theta & -\sin \theta & 0  \\
\sin \theta & \cos \theta  & 0  \\
0 & 0 & 1 
\end{pmatrix}
```

上記の行列を転置させたものを回転行列として用いている解説サイトがあるが、それは『座標回転行列』である。
間違っているわけではないが、回転方向が逆になるため注意が必要。



# 罠１：12通りの表現方法

オイラー角と一口に言っても、**1つの姿勢に対して12通りのオイラー角が存在する**。
非常に面倒くさい。

オイラー角の3つのパラメータを与えられたとき、どの軸順で回転操作を行うかによって12通りの結果が得られる。
具体的には以下の軸順である。

| i-j-k タイプ | X-Y-Z | X-Z-Y | Y-X-Z | Y-Z-X | Z-X-Y |Z-Y-X|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| **i-j-i タイプ**  | **X-Y-X**  | **X-Z-X**  | **Y-X-Y**  | **Y-Z-Y**  | **Z-X-Z**  |**Z-Y-Z**|

- i-j-k タイプ：x軸、y軸、z軸 の全てを使用するタイプ
- i-j-i タイプ：最初と最後に同じ軸を2度使用するタイプ

> 「X-X-Y」のような、1つの軸を2度連続で使用するタイプは存在しない。
1つの軸に対して、1度で回転しようが2度連続で回転しようが同じ結果になるためである。

オイラー角のパラメータとして $( \alpha, \beta, \gamma )$ が与えられたとする。
このとき、オイラー角を回転行列に変換するには、各軸の回転行列を**右から掛け合わせていく。 (超重要)**

例えば軸順が『X-Y-Z』だとすると、回転行列で表すと以下のようになる.

(x軸で$\alpha$回転 ⇒ 回転後のy軸で$\beta$回転 ⇒ 回転後のz軸で$\gamma$回転)

```math
\begin{align}
\boldsymbol{R} _{xyz} (\alpha, \beta, \gamma) 
& = \boldsymbol{R} _x (\alpha) \boldsymbol{R} _y (\beta) \boldsymbol{R} _z (\gamma)  \\
\\
& = \begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha& -\sin \alpha\\
0 & \sin \alpha& \cos \alpha
\end{pmatrix}
\begin{pmatrix}
\cos \beta& 0 & \sin \beta\\
0 & 1 & 0 \\
-\sin \beta& 0 & \cos \beta
\end{pmatrix}
\begin{pmatrix}
\cos \gamma& -\sin \gamma& 0  \\
\sin \gamma& \cos \gamma& 0  \\
0 & 0 & 1 
\end{pmatrix}
\end{align}
```


# 罠２：ジンバルロックの条件

オイラー角を扱う上で面倒なのがこのジンバルロック。
簡単に言えば、**『1軸目と3軸目の見分けが付かなくなる状態』**である。
ジンバルロック自体はオイラー角が持つ性質なので、上手く付き合っていくしかない。

ややこしいのは、**ジンバルロック状態となる条件が解説サイトによって異なる**ことである。

オイラー角 $( \alpha, \beta, \gamma )$ が与えられたとする。
よく見かけるものは、『 $\beta=0$ だ！』だとか『 $\beta=\pi/2$ (90°) の場合だ！』とある。
う～ん、、、

正確には、オイラー角を12種類に分類したときの**『i-j-k タイプ』か『i-j-i タイプ』によって異なる**。
ジンバルロック状態となるのは、以下の条件となる場合である。

- **i-j-k タイプ：** $\beta=\pm\pi/2$　(±90°)
- **i-j-i タイプ：** $\beta=0, \pi$　(180°)


# 罠３：回転行列やクォータニオンとの相互変換の過程が曖昧

オイラー角が12通りあるという事は、**1つの回転行列やクォータニオンに対して12通りの計算方法がある**という事だ。

軽くググって出てくるページには、Z-Y-X系 や X-Y-Z系 の変換しか載っていないものが多い。
何なら軸順に触れずに変換結果のみを記載しているページがある。正直意味が無い。

ならば、**相互変換の計算過程を習得すれば良い**。

計算過程まで詳しく記載している記事を発見。
下記を参考にすると良い。

https://qiita.com/aa_debdeb/items/3d02e28fb9ebfa357eaf

オイラー角 ⇒ クォータニオンの変換だけ補足記事を作成した。
[オイラー角からクォータニオンへの変換](https://qiita.com/take4eng/items/ae487c82a6f7d60ceba8)


# 罠４：固定角とオイラー角の差異

**固定角：オイラー角と同等の回転操作を行うが、回転軸は基準座標を用いる。**
個人的には、この2つの存在がかなり話をややこしくしていると思っている。

両者はほぼ同等な存在で、固定角をオイラー角として扱っていることも多い。
『固定角』という呼び名が正しいのかさえ分からない。

例として、X-Y-Z系の$( \alpha, \beta, \gamma )$ が与えられた場合を考える。

**オイラー角 X-Y-Z系 の場合**

1. 初期の座標系を x-y-z とする
1. x 軸周りで α 回転する
1. 回転後のy' 軸周りで β 回転する
1. 回転後のz'' 軸周りで γ 回転する

**固定角 X-Y-Z系 の場合**

1. 初期の座標系を x-y-z とする
1. x 軸周りで α 回転する
1. y 軸周りで β 回転する
1. z 軸周りで γ 回転する

gif や動画があれば分かりやすいが、そんなものは無い。
要は、『回転後の座標軸を使うか元の座標軸を使うか』の違いである。

ここまでは概念レベルの話だから、何となく理解できてればいい。
問題は、**これを回転行列を用いて表現するところ**にある。

***

**オイラー角 X-Y-Z系 の場合** (おさらい)
各軸の回転行列を**右**から掛けていく。

```math
\begin{align}
\boldsymbol{R} _{xyz} (\alpha, \beta, \gamma) 
& = \boldsymbol{R} _x (\alpha) \boldsymbol{R} _y (\beta) \boldsymbol{R} _z (\gamma)  \\
\\
& = \begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha& -\sin \alpha\\
0 & \sin \alpha& \cos \alpha
\end{pmatrix}
\begin{pmatrix}
\cos \beta& 0 & \sin \beta\\
0 & 1 & 0 \\
-\sin \beta& 0 & \cos \beta
\end{pmatrix}
\begin{pmatrix}
\cos \gamma& -\sin \gamma& 0  \\
\sin \gamma& \cos \gamma& 0  \\
0 & 0 & 1 
\end{pmatrix}
\end{align}
```


**固定角 X-Y-Z系 の場合**
各軸の回転行列を**左**から掛けていく。

```math
\begin{align}
\boldsymbol{R} _{xyz} (\alpha, \beta, \gamma) 
& = \boldsymbol{R} _z (\gamma) \boldsymbol{R} _y (\beta) \boldsymbol{R} _x (\alpha)  \\
\\
& = 
\begin{pmatrix}
\cos \gamma& -\sin \gamma& 0  \\
\sin \gamma& \cos \gamma& 0  \\
0 & 0 & 1 
\end{pmatrix}
\begin{pmatrix}
\cos \beta& 0 & \sin \beta\\
0 & 1 & 0 \\
-\sin \beta& 0 & \cos \beta
\end{pmatrix}
\begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha& -\sin \alpha\\
0 & \sin \alpha& \cos \alpha
\end{pmatrix}
\end{align}
```

***

そう、**順番が入れ替わっただけ**である。

『あれ？順番が変わるとオイラー角の系も変わるんじゃないの？』
⇒ 計算上の数式で入れ替わっているだけであって、本質的には全くの別物である。

***

ここに例えば、オイラー角 Z-Y-X系の $( \gamma, \beta, \alpha )$ が与えられたとする 。
この時の回転行列は、下記のように表される。

**オイラー角 Z-Y-X系 の場合**
各軸の回転行列を**右**から掛けていく。

```math
\begin{align}
\boldsymbol{R} _{zyx} (\gamma, \beta, \alpha) 
& = \boldsymbol{R} _z (\gamma) \boldsymbol{R} _y (\beta) \boldsymbol{R} _x (\alpha)  \\
\\
& = 
\begin{pmatrix}
\cos \gamma& -\sin \gamma& 0  \\
\sin \gamma& \cos \gamma& 0  \\
0 & 0 & 1 
\end{pmatrix}
\begin{pmatrix}
\cos \beta& 0 & \sin \beta\\
0 & 1 & 0 \\
-\sin \beta& 0 & \cos \beta
\end{pmatrix}
\begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha& -\sin \alpha\\
0 & \sin \alpha& \cos \alpha
\end{pmatrix}
\end{align}
```

そう、軸順を入れ替えると、上の**固定角の回転行列と全く同じ形になる**。
なるほどね。

***

という事で、意味が異なるのに全く同じ数式が出てきた。
そして、ネット上の記事ではこれらを混同している、またはどちらを用いているか記載していないことが多い。

何を言ってるか分からないかもしれないが、現にこういった混乱が起きている。

正直なところ、数式や行列だけ記載されると区別が付かず、何を意味しているのか全く分からない。
そういった場合、前後の文脈や上記の性質から読み取るしかない。


# 罠５：パラメータの記載順が統一されていない

オイラー角の表現には**『3つの軸と3つの角度』**の合わせて6つの情報が必要となる。
(例) X-Y-Z系 $( \alpha, \beta, \gamma )$

これまでは上記の様な表現で記載してきたが、この記事を含め多くのサイトで記載方法が統一されていない。

上記の例は分かりやすい。
x軸でα回転 ⇒ y軸でβ回転 ⇒ z軸でγ回転

では、以下の例はどうだろうか？

***

(例) Z-Y-X系 $( \gamma, \beta, \alpha )$

解1：z軸でγ回転 ⇒ y軸でβ回転 ⇒ x軸でα回転　(記載順で適用)
解2：z軸でα回転 ⇒ y軸でβ回転 ⇒ x軸でγ回転　(軸に合わせ適用)

私には2つの認識があるように見える。
解1は、回転の順番に対応させ $( \theta_1, \theta_2, \theta_3 )$ と記載する表現。
解2は、パラメータを各軸に対応させ $( \theta_x, \theta_y, \theta_z )$ と記載する表現。

***

何を言ってるか分からないかもしれないが、現にこういった表現がまかり通っている。

私自身も、オイラー角を扱うときにどちらの表現を使用するかはその場で適当に決めている。
(Z-Y-X系を扱うことが多いため、なおさら混乱する。)

正直なところ、これも文脈や計算過程の中から判断するしかないと思っている。
> $\alpha, \beta, \gamma$ が使用されているなら、おそらく$\alpha$ ⇒ $\beta$ ⇒ $\gamma$ だろう。
$\phi, \theta, \psi$ が使用されているなら、x軸に $\psi$、y軸に $\theta$、z軸に $\phi$ が対応していることが多い。
全然違うこともある。


# まとめ

もともと12通りもある上に、固定角表現や記載表現などが定まっていないことも相まってややこしさを増している。
罠さえ把握して対処すれば、計算もしやすく直感的に理解できる姿勢表現である。

結局、『文脈から判断する』なんていう対処法しか提示できていないが、オイラー角を扱う上でのポイントを下記にまとめる。

- **自身が扱いたい軸順の系を決める。**
- **参考にしている解析サイトが、どの系で解析しているのかを見極める。**
- **その系がオイラー角なのか固定角なのかを見極める。**
- **角度パラメータの適用順を見極める。**

以上です。
おかしな点や間違っている点があればコメントでご指摘をお願いします。


# 参考ページ

[wikipedia：オイラー角](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E8%A7%92)
[南山大学：機械制御工学研究](http://www.st.nanzan-u.ac.jp/info/akiran/mces/mech_ctrl_eng_study_20160120.pdf)