回転ベクトル・回転行列・クォータニオン・オイラー角についてまとめてみた
回転ベクトル・回転行列・クォータニオン・オイラー角についてまとめてみた

回転ベクトル・回転行列・クォータニオン・オイラー角についてまとめてみた

この記事では回転ベクトル,回転行列,オイラー角,クォータニオン(四元数)それぞれについて回転の表現方法,特徴,右手系・左手系の変換方法を紹介します。

右手座標系と左手座標系は、軸のどれか1本を反転させた関係であると言えます。 べつに右手系 X,Y,Z が左手系 X,-Z,-Y と対応するような変換を考えてもいいのですが、右手系 X,Y,Z と左手系 X,-Y,Z の対応を考えた後にX軸周りに270°回転させたものと考えたほうが分かりやすいです。 ということで、この記事では右手系と左手系は 2本の軸を共有していて1本の軸だけ反転している関係 と考えます。

今後この記事で右手・左手変換の例を紹介するときは、 Y軸反転 、つまり右手系で見ると である点を左手系で見ると になるような変換を取り上げることにします。

1. 回転ベクトル

まずは回転ベクトル(rotation vector)の紹介です。

回転ベクトルは、「ある点 を、原点を通るベクトル の周りでその長さ の分の角度だけ回転させる」という形で回転(=点の移動)を記述したものです。

たとえば、 はX軸を中心に90°回すように点を移動させることを意味します。 回転方向は、右手座標系では右ねじの方向(ベクトル方向を向いて時計回り)を正とし、左手座標系では左ねじの方向(ベクトル方向を向いて反時計回り)を正とします。

回転ベクトルはあくまで「点の回転移動」だけを記述するツールなので、グローバル->ローカルなのかローカル->グローバルなのかによって意味が変わることに注意してください。 つまり、 のどちらがグローバル座標でどちらがローカル座標なのかは状況によって違うということです。 これは、後で紹介する回転行列・クォータニオンも同じです。

1.1. 回転ベクトルの特徴 コンパクト

回転ベクトルは、回転を最もコンパクトに記述する、つまり 最低限の変数(3自由度) で記述する表現方法です。 そのため、パラメータの自由度を拘束する条件式を考える必要がなく扱いやすいです。

ジンバルロックがない

後で紹介するオイラー角と違って、ジンバルロックを生じないという特徴があります。 これは、回転ベクトルを滑らかに変化させることで、ある回転の状態(=姿勢)から任意の別の回転の状態へと滑らかに変化させられることを意味します。

最適化問題で利用しやすい

最適化問題を数値計算で解くときは、各パラメータを少しずつ変化させて評価関数の値がよくなるところを探索するという方法を採ります。 このとき、パラメータに無駄な自由度があるとそれを抑えるための制約条件を加える必要が出てきますが、制約付き最適化問題は制約なしに比べて複雑になるので計算コストが高くなってしまいます。 また、パラメータを滑らかに変化させたときに実際の姿勢も滑らかに変化してくれないと、効率的に最適化を行うことができません。

このような理由から、最適化問題では姿勢を回転ベクトル表現で記述することが多いです。 例えば、OpenCVの calibrateCamera() や solvePnP() なども、内部では回転ベクトル表現を利用しています。

同じ回転を表す組

回転量に対して という条件を課すことで、任意の回転は一意な回転ベクトルと一対一に対応します(ただし のときだけ など方向を一意に定める条件が必要)。

1.2. 回転ベクトルの逆変換

回転ベクトルは、向きを逆にしてやれば、真逆の回転を表す回転ベクトルになります。 そのため、 の逆変換は になります。

1.3. ロドリゲスの回転公式

回転ベクトルを使って点を移動させるアルゴリズムは、ロドリゲスの回転公式としてよく知られています。 回転ベクトル によって点 を回転させるとき、回転後の点 は以下の式で表されます。

この式は右手系と左手系で共通です。 気になる方は、 を代入したとき(右手系)と、 を代入したとき(Y軸反転の左手系)を比較して、 のY成分の符号だけが反転することを確かめてみてください。

1.4. 回転ベクトルの右手系と左手系の変換

右手系で取得した回転ベクトルを左手系での表現に直すときは、 向きを反転させた後で 普通のベクトルと同じように変換してやればよいです。 たとえば、右手系で観測した回転ベクトル はY軸反転した左手系で観測すると になります。

2. 回転行列

次に、みんな大好き回転行列(rotation matrix)のお話です。

回転行列は、三次元の回転を3×3の直交行列で表現する方法です。 点の座標を縦ベクトルで表現する場合、回転行列 によって点 を回転させると回転後の点 は以下の式で表されます。

2.1. 回転行列の特徴 回転を9パラメータで表現する

回転行列の各列ベクトルは、変換前の座標系における基底ベクトルXYZが、変換後にどのベクトルに対応するかを示しています。 見た目上は3自由度の回転を9つのパラメータで表現することになりますが、直交行列であるという条件( もしくは同値な条件として、列ベクトル表現を として )によって6自由度が抑えられるため、結果として3自由度を過不足なく表現できます。

任意の回転と一対一に対応する ジンバルロックがない

回転ベクトルと同じく、ジンバルロックは生じません

数学的にシンプルに記述できる

たとえば、座標系AからBへの座標値の変換とBからCへの座標値の変換がそれぞれ回転行列 であるなら、座標系AからCへの座標値の変換は となりますし、座標系CからAへの座標値の変換は となり、かなりシンプルに記述できます。

また、回転行列を拡張した 同次座標系 の概念を導入すれば、ベクトルと行列の式で回転・並進移動をまとめて扱えるようになります。 幾何関係を数学的に分析したいときによく使われる表現方法です。

2.2. 回転行列の逆変換

上でちらっと取り上げたように、回転行列の逆行列は逆変換に相当します。 また、直交行列の性質として が成立するので、結局、転置行列 が逆変換を表す回転行列となります。

2.3. 回転行列と回転ベクトルの関係

ロドリゲスの回転公式は右手系・左手系で共通ですので、もちろんこの式も右手系・左手系で共通です。 ただし次の項で説明するように、右手系と左手系どちらで見るかによって の値が変わるので、実際の回転行列の成分値は異なります。

2.4. 回転行列の右手系と左手系の変換

例えば、右手系で である回転ベクトルは、Y軸反転の左手系では になります。 これを上の式に代入すれば、Y軸反転の左手系での表現に変換するためには回転行列の1行2列目・2行1列目・2行3列目・3行2列目の4箇所の符号を反転させれば良いことがわかります。

3. クォータニオン

続いて、最近流行り(?)のクォータニオン(quaternion : 四元数)について紹介します。

3.1. クォータニオンの定義

たまに「クォータニオン=回転」みたいな表現を耳にしますが、クォータニオン自体は複素数を拡張したような数学的な体系の一つです。

名前の通り、クォータニオンは のように4つの基底を持つベクトルとして表現されます。 そして乗算に関して次のようなルールを持っています。

3.2. クォータニオンによる回転の表現

回転ベクトル (方向ベクトル 、長さ )があるとき、同じ回転を表現するクォータニオンは

であると定義されます。 この定義から の制約条件が付き、結果的に3自由度の回転をぴったり表現できていることになります。

クォータニオンを使って点 を回転させるときは、点の座標を というクォータニオンに読み替えて

を計算します。 の 成分を取り出すと、回転後の点の座標値になっています。

また、クォータニオン で回転させた後に で回転させたような回転は となります。 この回転にしたがって点を移動させるときは のようにすればよいです。 ちなみに、 が成り立ちます。

3.3. クォータニオンの特徴 ジンバルロックがない

回転ベクトルと同じく、ジンバルロックは生じません

同じ回転を表す組

クォータニオン と は同じ回転を表します。 これは、方向 長さ の回転ベクトルと、方向 長さ の回転ベクトルが同じ回転を表すことに対応しています。 そのため最終的な回転の状態としては同じですが、右回りで辿り着いたのか、左回りで辿り着いたのか、という区別があります。

球面線形補間が楽に計算できる

回転をクォータニオンで表現することのメリットとして球面線形補間(slerp : spherical linear interpolation)が楽に計算できることが挙げられます。 球面線形補間は、ある回転の状態(=姿勢)から別の回転の状態への変化を角度に対して線形に補間する処理です。 つまり、オブジェクトをある姿勢から別の姿勢までスムーズに回転させるような処理を簡単に実装できるようになります。

回転を表す2つのクォータニオン と配分率 が与えられたとき、補間して得られるクォータニオンは以下のように計算されます。

また、slerpの際に の代わりに を使うと補間されるルートが変わります。 ざっくり言うと、一方は地球を西廻りして日本→韓国のルートを辿りますが、もう一方は日本→ブラジル→アフリカ→韓国という遠回りの東廻りルートを辿ります。 短い方のルートを選びたいときは、 と内積を取って正になる方を使えばよいです。

3.4. クォータニオンの逆変換 3.5. クォータニオンの右手系と左手系の変換

例えば、右手系で であったクォータニオンは、Y軸反転の左手系では となります。

4. オイラー角

続いて、オイラー角(Euler angles)の紹介です。 これが一番ややこしいです。

オイラー角は、「座標軸の1本を選びその周りで回転させる、という操作を3回繰り返す」という形で座標系の関係を表現する方法です。 3回それぞれの回転量を並べて、 の形で回転を表現します。

オイラー角と一口に言っても、選ぶ回転軸の組み合わせによって X->Y->Z , Z->Y->X , Z->Y->Z , X->Y->X など12通りの表現があります。 ただ、結局はどの姿勢を と置くかの違いなので、どの表現も基本的な性質は変わりません。

また、2回目・3回目の回転のときに「もとの座標系の軸」と「回転後の座標系の軸」のどちらを基準に回転させるのかによっても種類が分かれます。 回転前の世界座標系の軸を使うものを外因性オイラー角(extrinsic Euler angles)、回転後の座標系の軸を使うものを内因性オイラー角(intrinsic Euler angles)と呼ぶようです。 なお、この記事では便宜上、内因性・外因性と呼ぶことにしますが正式な日本語訳があるのかはよくわかりません。

一般的にオイラー角といえば内因性オイラー角を指すことがほとんどです。 また、4.2. 回転行列との関係で説明しますが、内因性オイラー角と外因性オイラー角には対応関係があり、基本的な性質は共通しています。

ちなみに、 X->Y->Z のオイラー角を z-y-x とか x-y'-z" のように記述している文献もたまに見かけるので、文献ごとの流儀をよく確認しましょう。

4.1. オイラー角の特徴 リンク機構と対応している

内因性オイラー角を説明するときのイメージとしては、 ジンバル がよく取り上げられます。 これはジャイロスコープなどに採用されている機構で、外側のリングから順番に回転量を指定していくと中のコマの姿勢が1つに定まる、という機構がオイラー角と対応しています。 また、ロボットアームのようなリンク機構もオイラー角と対応しています。

このように、実在する回転機構と一致すること、回転をイメージしやすいことから、オイラー角は広く利用されています。 Unityのシーンエディタでもオブジェクトの回転を入力するのに X->Y->Z の内因性オイラー角が使用されています。

ヨー・ピッチ・ロールと対応している

よく使われるのは、下をZ・右をY・前をXとした Z->Y->X の内因性オイラー角における回転量をヨー・ピッチ・ロールと呼ぶスタイルらしいですが、文献によってバラバラの可能性があるのでよく確認してください。

ジンバルロックがある

オイラー角の厄介な性質として、ジンバルロック(特異姿勢)が知られています。 詳しい解説は他文献に譲りますが、これはある姿勢において回転の自由度が2に制限されてしまう現象です。 同じ意味ですが、3変数のうちの2つが同じ1自由度の表現に使われるため姿勢を一意に記述できなくなる現象、と説明されることもあります。

同じ回転を表現する組

回転角を の範囲で変化させるとき、同一の角度を表現するオイラー角は複数存在します。 特に、ジンバルロックの姿勢では1方向の回転を2軸が担っている状態なので、無数のオイラー角表現が存在します。 詳細に知りたい場合は、対象とするオイラー角を回転行列に変換して各成分を調べてみてください。

4.2. オイラー角の逆変換

例えば X->Y->Z のオイラー角 の逆変換は、 Z->Y->X のオイラー角 になります。 これを X->Y->Z のオイラー角で表現するのはなかなか面倒なので省略します。

4.3. オイラー角と回転行列の関係

まず、座標系Aから座標系Bへの回転を表す X->Y->Z の内因性オイラー角の場合。 各軸周りの回転行列を とすると全体の回転行列は となります。 座標系AからBへのオイラー角を考えていたのに、出てくるのが「座標系Bの座標値をAで見たときの座標値に変換する回転行列」である辺りが割と直感に反しているので気をつけてください。

この式は右手系・左手系で共通です。 X->Y->X などの他の内因性オイラー角も同じ要領で計算できます。

次に、座標系Aから座標系Bへの回転を表す X->Y->Z の外因性オイラー角の場合。 これは計算式を細かく追うと面倒なので省略しますが、座標系Bの基底が座標系Aで見るとどのようになっているのかを考えることで であることが確認できます。 よく見ると、内因性オイラー角と行列を掛け合わせる順を逆にしただけの式であることがわかります。

つまり、座標系Aから座標系Bへの回転を表す X->Y->Z の内因性オイラー角 と、座標系Aから座標系Bへの回転を表す Z->Y->X の外因性オイラー角 は全く同じ回転を表現しています。

4.4. オイラー角の右手系と左手系の変換

例えば、右手系での X->Y->Z のオイラー角 は、Y軸反転左手系では X->Y->Z のオイラー角 となります。

5. あとがきと参考文献

  • Rotation formalisms in three dimensions - Wikipedia
  • Quaternions, Interpolation and Animation - MIT
  • クォータニオンと回転 - エフアンダーバー
  • Transformations and Projections in Computer Graphics, David Salomon, Springer 2006
  • オイラー角について – EL-EMENT blog
  • 機械制御工学研究講義ノート - 理工学部・理工学研究科・理工学研究センター