web-dev-qa-db-ja.com

EigenLibraryを使用した回転行列からのロールピッチとヨー

回転行列からロールピッチのヨー角を抽出する必要があり、自分の実行が正しいことを確認したいと思います。

    Eigen::Matrix< simFloat, 3, 1> rpy = orientation.toRotationMatrix().eulerAngles(0,1,2);
    const double r = ((double)rpy(0));
    const double p = ((double)rpy(1));
    const double y = ((double)rpy(2));

あれは正しいですか?私がここを読んでいたので: http://eigen.tuxfamily.org/dox/group__Geometry__Module.html#gad118fececd448d7485ffea4858775e5a

そして、説明の最後に、間隔が角度として定義されていると書かれているとき、私は少し混乱しました。

これがあなたが探しているものだと思います。 m.eulerAngles(0, 1, 2)の使用方法によって異なります。 rotx*roty*rotzで再構築されたrotx、roty、rotzを取得するコードは次のとおりです。

Matrix3f m;

m = AngleAxisf(0.25*M_PI, Vector3f::UnitX())
  * AngleAxisf(0.5*M_PI, Vector3f::UnitY())
  * AngleAxisf(0.33*M_PI, Vector3f::UnitZ());

cout << "original rotation:" << endl;
cout << m << endl << endl;

Vector3f ea = m.eulerAngles(0, 1, 2); 
cout << "to Euler angles:" << endl;
cout << ea << endl << endl;

Matrix3f n;
n = AngleAxisf(ea[0], Vector3f::UnitX())
  * AngleAxisf(ea[1], Vector3f::UnitY())
  * AngleAxisf(ea[2], Vector3f::UnitZ()); 

cout << "recalc original rotation:" << endl;
cout << n << endl;

ご参考いただきありがとうございます!私も最初にEigenを使います。それは単に多くの作業を節約するだけです!

11
TSL_

ショーン・ルの答えは正しいですが、私はその線が

Vector3f ea = m.eulerAngles(2, 1, 0);

次に、eaはヨーピッチとロール値をこの順序で保持します。 ZYXオイラー角回転は、ロールピッチとヨーに他ならないXYZ固定軸回転と同等です。

6
Rachit Bhargava