DOSEIの日記

技術メモ+日常ログ

回転行列と回転ベクトル

3次元空間の回転行列 (rotation matrix) Rとは

  • 3×3
  • 直交行列 (inv(R)=R'; R*R' = R'*R = I) プライムは転置ね。
  • det R = 1 *1

を満たす実行列. この集合 (この行列の作用による線型変換の集合) が 3 次の特殊直交群 SO(3)。

大事なこと

回転行列は,

  • 作用させるベクトルの縦横
  • 回転の向き (右手(右ねじ)回転か左手回転か)
  • 座標系の向き (右手系 or 左手系)
  • 点(座標)変換か, 座標系変換か(まぁ座標系の変換の場合は、ベクトルに掛けないと思うけど)

をはっきりさせて置かないといろいろ困る。
ここでは、縦ベクトル右手系右手回転系点変換を仮定。
↓超分かりやすい

性質

  • 縦ベクトル用の回転行列(左から掛ける)は横ベクトル用の回転行列(右から掛ける)と転置の関係にある
  • 回転の向きも転置の関係にある
  • 座標系の向きも転置の関係にある
  • 点変換と座標系変換も転置の関係にある

オイラー回転定理

任意の回転は 3 つのパラメタで完全に記述できる.
その表現には

  • ピッチロールヨー
  • オイラー
  • 回転ベクトルと回転角

回転公式

ロドリゲス *2 の公式と呼ばれている*3
任意の回転には回転軸が必ず存在するので、その軸(自由度2)と回転角(自由度1)によって回転行列が構成できる。

単位ベクトル r と回転角 t によって

R = I + sin(t)[r]× + (1−cos(t))[r]×2

(展開は省略。ただし、|r| = 1 より[r]×2 = [−x2−1 xy zx; xy y2−1 yz; zx zy z2−1] = rr'−I となる。)
したがって,

R = cos(t)I + sin(t)rr' + (1−cos(t))[r]×2

とも書ける。

逆に

sin(t)[r]× = (RR')/2

という関係から, Rr, t の変換ができる。

(OpenCV では Rodrigues2() でどちら向きの変換もやってくれる。)

オイラー

ある軸(x,y,or z)まわりの回転 Rx, Ry, Rz は簡単に書ける。任意の回転はこの軸まわりの回転角の3つの組で表され、オイラー角と呼ばれている。しかし、人によりどの軸まわりの組み合わせかがことなるので注意。多分一番多く使われているのが ZXZ の順での回転。(θ,φ,ψ) と書いて Rz(ψ)Rx(φ)Rz(θ)を表す。

*1:−1 の場合は、鏡映が起きる回転 (rotoinversion)

*2:Rodrigues; ロドリ(ー)グかもしれない

*3:Mathworld の回転関係のページにはここへのリンクが張られていないので注意!