3次元空間の回転(ロドリゲス)

最近、以下の本を読みながら3次元の回転について復習している。
3次元回転:パラメータ計算とリー代数による最適化

金谷先生の本は、各式の展開や意味など丁寧に説明してあり非常に分かりやすい。
SLAMなどの理論を理解し、実装するためには必須の項目なのでこれを機にきっちりと理解したい。

3次元回転のオイラー角による表現については、高校数学で習ったことがあるかもしれない。ただし、オイラー角には各軸周りの回転をどの順番で掛け合わせるのか自由度があるという問題やジンバルロックの問題があることが知られている。

なので、今回は上記問題が無い回転軸と回転角によって3次元の回転を表現する方法を紹介する。回転軸と回転角によって表現するロドリゲス(ロドリーグ)の式を紹介する。ロドリゲスの式では3つのパラメータK=[k1, k2, k3]を用いて以下のように3次元の回転を表すことができる。

ここで、ロドリゲスの式では回転軸(x, y, z)と回転角(θ)の4つのパラメータがあるように見えるが、回転軸を表すベクトルのノルムは1という制約があるため、この方法による3次元回転の自由度は3となっている。

OpenCVやEigenなどには、ロドリゲスの式を使った3次元回転を取り扱うための方法がすでに実装されているので、それらを用いると簡単に3次元回転をプログラム上で実装することができる。以下は、Eigenを用いた場合の例である。x軸(1, 0, 0)周りに180度(π)回転させる例となっている。

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>

#include "Eigen/Core"
#include "Eigen/Geometry"

int main() {
  Eigen::Vector3d rotation_axis;
  rotation_axis << 1.0, 0.0, 0.0;
  double angle = M_PI;

  Eigen::AngleAxis<double> angle_axis(M_PI, rotation_axis);

  std::cout << angle_axis.matrix() << std::endl;

  return 0;
}

コメント

このブログの人気の投稿

COLMAPでキャリブレーション済みのデータを使う

5点アルゴリズムによるカメラ位置・姿勢の推定

2D-3D対応からのカメラ位置・姿勢の推定