8

我需要从旋转矩阵中提取滚动俯仰偏航角,并且我想确保我所做的事情是正确的。

    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

当它在描述的末尾说,其中定义了角度的间隔时,我有点困惑。

4

2 回答 2

16

我想这就是你要找的。取决于我们如何使用 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。简直是省了不少功夫!

于 2015-01-10T18:59:15.980 回答
5

Shawn Le 的答案是正确的,但我认为这条线应该是

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

然后ea将按该顺序保持偏航俯仰和滚动值。ZYX欧拉角旋转相当于XYZ定轴旋转,只不过是roll pitch和yaw。

于 2017-08-08T21:03:00.933 回答