3次元の剛体変換(Exponential Map)
3次元の回転(Exponential Map)ではSO(3)による回転表現について、簡単な説明とC++のライブラリSophusを用いた実装例について紹介した。今回は、併進を加えた3次元の剛体変換SE(3)について、簡単に紹介する。
SE(3)のExponential Mapは6次元のベクトル(u ω)Tを用いて以下のように表される。ここで、ωはSO(3)の時と同様に回転の軸角表現となっている。
逆変換のLogarithm Mapは、まずSO(3)のLogarithm Mapを用いてωを算出し、その後、このωを用いて以下のように算出できる。
また、以下のような2つの変換行列T1,T2の補間を行いたい場合は、次のように中間の剛体変換を算出することができる。
ここで、wは重みで0~1の値をとる。この補間方法を用いることで、2つのカメラ視点の中間視点などを算出できるようになる。
以下に、Sophusを用いたSE(3)の実装例を示す。
SE(3)のExponential Mapは6次元のベクトル(u ω)Tを用いて以下のように表される。ここで、ωはSO(3)の時と同様に回転の軸角表現となっている。
逆変換のLogarithm Mapは、まずSO(3)のLogarithm Mapを用いてωを算出し、その後、このωを用いて以下のように算出できる。
また、以下のような2つの変換行列T1,T2の補間を行いたい場合は、次のように中間の剛体変換を算出することができる。
ここで、wは重みで0~1の値をとる。この補間方法を用いることで、2つのカメラ視点の中間視点などを算出できるようになる。
以下に、Sophusを用いたSE(3)の実装例を示す。
#include <iostream>
#include "sophus/geometry.hpp"
int main() {
// 単位行列
Sophus::SE3d T0;
std::cout << "T0:\n" << T0.matrix() << std::endl;
// パラメータベクトルse3(後ろ3つが回転so3と対応)
Sophus::Vector6d uw1;
uw1 << 0.0, 0.0, 0.0, Sophus::Constants::pi() / 3, 0.0, 0.0;
// x軸周りに60度回転させる変換行列
Sophus::SE3d T1 = Sophus::SE3d::exp(uw1);
std::cout << "Transform matrix" << std::endl;
std::cout << T1.matrix() << std::endl;
std::cout << std::endl;
//変換行列2
Sophus::Vector6d uw2;
uw2 << 0.0, 1.0, 0.0, 0.0, 0.0, 0.0;
Sophus::SE3d T2 = Sophus::SE3d::exp(uw2);
std::cout << "T2:\n" << T2.matrix() << std::endl;
std::cout << std::endl;
// T1*T2
std::cout << "T1*T2" << std::endl;
std::cout << (T1 * T2).matrix() << std::endl;
std::cout << std::endl;
// 変換行列T1,T2の補間
std::cout << "Interpolation" << std::endl;
double interval = 1.0 / 10.0;
for (double i = 0; i <= 1.0; i += interval) {
Sophus::SE3d T = Sophus::SE3d::exp(i * (T2 * T1.inverse()).log()) * T1;
std::cout << "step: " << i << "\n" << T.matrix() << std::endl;
}
return 0;
}



コメント
コメントを投稿