使用Eigen库从旋转矩阵中获取滚转角、俯仰角和偏航角

11

我需要从旋转矩阵中提取滚转、俯仰和偏航角,并且我想确保我的操作是正确的。

    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

当描述结束时,我有点困惑,它说角度所定义的间隔是什么。

2个回答

19

我认为这就是你在寻找的。根据我们如何使用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。它简单地节省了很多工作!


6
Shawn Le的回答是正确的,但我认为应该是这一行:

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

那么ea将按顺序保存偏航、俯仰和翻滚的值。ZYX欧拉角旋转等效于XYZ固定轴旋转,即翻滚、俯仰和偏航。


1
也许这可以解释得更好,因为如果更改了那行代码,重新计算旋转矩阵会产生与最初计算的不同的旋转矩阵。除非改变单位矩阵的顺序,否则我认为“m.eulerAngles(0, 1, 2);”是正确的。 - RStiltskin
不,我很确定应该是(2,1,0),上面的矩阵乘法不是传统的滚转俯仰。旋转应该是R_yaw * R_pitch * R_roll而不是相反的顺序。 - Rachit Bhargava
1
它是 m.eulerAngles(2,1,0) - zhoudingjiang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接