以下の内容はhttps://rikei-tawamure.com/entry/2025/03/07/080933より取得しました。


方向余弦行列

1. 方向余弦行列(DCM)とは?

方向余弦行列(Direction Cosine Matrix, DCM) とは、ある座標系から別の座標系へベクトルを変換する際に用いられる正方行列のことです。主に「剛体の姿勢表現」「座標変換」に用いられ、3次元空間における回転変換を表現します。

DCMの具体例

  • 飛行機やドローンの機体座標系(機体前方・右側・下向き等)から、地面基準の地上座標系にベクトルを変換したいとき
  • ロボットアームの各ジョイント座標系間の姿勢変換
  • カメラの画像座標から3Dワールド座標への回転の一部を表現するとき
  • ドローンの姿勢を表したいとき

このような座標系の変換には、しばしばオイラー角やクォータニオンを用いることもありますが、方向余弦行列は行列として直接ベクトルに掛け算して座標を変換できるため、計算が直感的(線形代数に基づく)であるという利点があります。


2. 方向余弦行列の定義

一般的な形

3次元空間の回転は、回転行列と呼ばれる 3×3 の実正方行列で表現されます。方向余弦行列も、3次元回転行列の一種です。3軸  x, y, z の方向ベクトル同士の 余弦(コサイン)を成分とすることから、こう呼ばれています。

ドローン座標系 {\mathbf{e}^d_i}におけるベクトル{X, Y, Z} から地球座標系 \mathbf{e}^e_iにおけるベクトル{x, y, z} へ座標変換する方向余弦行列を \mathbf{C} とした場合、座標変換の式は


\begin{bmatrix}
x \\ y \\ z
\end{bmatrix}
=\mathbf{C}
\begin{bmatrix}
X \\ Y \\ Z
\end{bmatrix}

で表すことができます(どちらの座標系を基準にするかによって転置が必要な場合もあるので、運用上は要確認)。
行列 \mathbf{C} は正規直交行列(Orthogonal Matrix)の性質を持ち、以下を満たします:


\mathbf{C}^{T} \mathbf{C} = \mathbf{I}, \quad \det(\mathbf{C}) = +1.

ここで \mathbf{I} は単位行列を表します。この性質により、回転によってベクトルの長さ(ノルム)が変わることはありません(剛体回転)。

成分の意味:方向余弦

方向余弦行列 \mathbf{C} の要素は、以下のように「基底ベクトル同士の内積=余弦」に基づいて決定されます。 (ただし基底ベクトルは単位ベクトルでなければなりません。)


\mathbf{C} =\begin{bmatrix} \mathbf{e}^e_i \mathbf{e}^d_j \end{bmatrix}=
\begin{bmatrix}
 \mathbf{e}^e_1 \cdot \mathbf{e}^d_1 & \mathbf{e}^e_1 \cdot \mathbf{e}^d_2 & \mathbf{e}^e_1 \cdot \mathbf{e}^d_3 \\
 \mathbf{e}^e_2 \cdot \mathbf{e}^d_1 & \mathbf{e}^e_2 \cdot \mathbf{e}^d_2 & \mathbf{e}^e_2 \cdot \mathbf{e}^d_3 \\
 \mathbf{e}^e_3\cdot \mathbf{e}^d_1 & \mathbf{e}^e_3 \cdot \mathbf{e}^d_2 & \mathbf{e}^e_3 \cdot \mathbf{e}^d_3
\end{bmatrix}

  •  \mathbf{e}^e_1, \mathbf{e}^e_2, \mathbf{e}^e_3 は、地球座標系を構成する3つの単位ベクトル
  •  \mathbf{e}^d_1, \mathbf{e}^d_2, \mathbf{e}^d_3 は、ドローン座標系を構成する3つの単位ベクトル

行列の各成分は、両座標系の単位ベクトルの内積(=cosine)に相当します。これが「方向余弦行列」と呼ばれる所以です。

ここからわかるように、方向余弦行列は二つの座標系の基底ベクトル同士の方向余弦を取りますので、どちらを基準に考えるかでふた通りの取り方があります。 ドローンの姿勢を考える際は、地球座標系を基準にして、ドローンの機体座標系との方向余弦をとります。


3. オイラー角とDCM

オイラー角からDCMを作る

3軸の回転(例えば、ロール・ピッチ・ヨーという3つの角度)を指定することで、DCMを構成することが可能です。たとえば「ZYXオイラー角」を使った場合、DCMは以下のように表せます(記号は一般的に使われる例):


\mathbf{C} = R_z(\psi) \, R_y(\theta) \, R_x(\phi),
  • \psi :Z軸まわりの回転(ヨー角)
  • \theta :Y軸まわりの回転(ピッチ角)
  • \phi :X軸まわりの回転(ロール角)
  • R_z(\psi) などは各軸回りの回転行列

例えば R_z(\psi) は:


R_z(\psi) =
\begin{bmatrix}
 \cos\psi & -\sin\psi & 0 \\
 \sin\psi &  \cos\psi & 0 \\
 0        &  0        & 1
\end{bmatrix}.

同様に R_y(\theta), R_x(\phi) も書き下すと、3つの行列を順番に掛け合わせることで \mathbf{C}(DCM)が得られます。

DCMからオイラー角を求める

逆に、得られたDCMからオイラー角を計算することもできます。ただし、オイラー角にはジンバルロックの問題や、軸の回転順によって式が変わるなど取り扱いの注意点があるので、実装時は自分の定義する回転順序を確認する必要があります。


4. クォータニオンとDCM

3次元回転を表現する方法として、よく比較されるのが クォータニオン(四元数)です。クォータニオンは、回転の連続的な合成が容易で、ジンバルロックが発生しないなどの利点があります。一方で、最終的にベクトルを回転させたり、姿勢の向きを直接読み取ったりする段階では行列を掛けたほうが分かりやすいことも多いです。
そのため、姿勢情報を内部的にはクォータニオンで保持し、最終的な座標変換においてはクォータニオンからDCMを生成して利用する、という流れがよく取られます。


5. DCMの主な特徴と利点

  1. 幾何的に分かりやすい
    ベクトルに回転を施す際、3×3行列を掛けるだけなので単純明快。線形代数の範囲で処理しやすい。

  2. 正規直交行列
    転置が逆行列になる正規直交行列であるため、計算が安定している(ただし、数値誤差により厳密な直交性が崩れることがあるため、場合によってはオルソノーマル化を行う必要あり)。

  3. ベクトルのノルムを保存
    回転行列である以上、ベクトルの大きさが変わらない。変位ベクトルや速度ベクトルを座標変換しても量が失われにくい。

  4. そのまま合成可能
    ある回転行列{\mathbf{C}_1}と別の回転行列{\mathbf{C}_2}を合成する場合、単純に行列の掛け算{\mathbf{C}_{1} \mathbf{C}_{2}} で実現できる。

  5. オイラー角やクォータニオンとの相互変換が容易
    オイラー角やクォータニオンから簡単に構成でき、また逆も可能。状況に合わせて使い分けができる。

  6. 列成分がドローンの機体座標系の基底ベクトルをあらわし機体の姿勢を示している  方向余弦行列の列成分は基準座標系(地球座標系)を用いた機体座標系の3つの基底ベクトルそのものを表していて、ドローン等の姿勢等を表すのに用いられる。


6. 実用上のポイント

数値誤差への対策

DCMは理論的には直交行列ですが、数値計算を繰り返していくとわずかな誤差が蓄積して、直交行列の性質(\mathbf{C}^T \mathbf{C} = \mathbf{I})が崩れていきます。
航空宇宙やロボティクスのシミュレーションでは、直交化処理(Orthonormalization)を定期的に行うことで、誤差を補正する実装が多いです。具体的には、Gram-Schmidt法などで列ベクトル(行ベクトル)の直交・正規化を行い、直交行列の性質を保ちます。

軸の取り扱いと回転順

DCMを構築する際は、どの座標軸を右手系としているか、回転の向きや順序(ZYX or XYZ など)を十分に確認しましょう。軸の取り扱いを間違えると、回転方向が逆になったり、要素の並びが変わったりして、実装バグの原因となります。

実装時のテスト

実際に行列をコードで実装する際は、単位ベクトル基底ベクトルを回転させてみて、期待どおりの向きに変換されているかをテストすることが大切です。
オイラー角を使う場合は、特定の角度( \phi = 0^\circ, \theta = 90^\circ 等)を与えて簡単にシミュレーションし、結果が理論値と合っているか確認すると良いでしょう。


7. まとめ

方向余弦行列(DCM)は、3次元空間での回転を表す際の最も基本的なツールの一つです。オイラー角やクォータニオンなど、さまざまな回転表現方法がある中でも、ベクトルとの掛け算だけで座標変換を直接行えるという点で直感的かつ強力です。

一方で、実装上は以下のポイントに気を配る必要があります。

  • 軸の回転順序や向きの定義を明確にする
  • 数値計算時の誤差による直交性の喪失を定期的に補正する
  • オイラー角やクォータニオンとの相互変換でバグが出やすいのでテストを怠らない

ロボティクスやドローン制御、カメラ姿勢推定など3次元空間の取り扱いがある分野では、今後もDCMは不可欠な知識です。基本を押さえておくことで、さまざまな回転変換・座標変換の実装やトラブルシューティングがスムーズに行えるようになります。

今後はより具体的な計算例を挙げていきたいと思います。




以上の内容はhttps://rikei-tawamure.com/entry/2025/03/07/080933より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14