关于EulerAngles从Eigen C ++库转换

时间:2015-11-24 14:17:47

标签: c++ eigen

假设我有一个三维框架,旋转滚动= 0,俯仰= 0,偏航= 0分别关于x,y和z轴。

我希望框架围绕x轴旋转3.14159(Pi)或roll = Pi。

以下是上述情况的代码。

问题是,当我想将旋转矩阵转换回滚动,俯仰和偏航时,代码会给出不同的答案。

而不是roll = Pi,结果是roll = 0,pitch = pi,yaw = pi。

我认为Peter Corke在Matlab上提供的RVC工具箱给出了正确答案。

使用我的程序或Eigen的eulerAngles可能有些不合适的东西吗?请帮忙。

代码:

#include <iostream>
#include <Eigen/Dense>

const double PI = 3.14159265359;

int main()
{
    using ::Eigen::AngleAxisd;
    using ::Eigen::Matrix3d;
    using ::Eigen::Vector3d;
    using ::std::cout;
    using ::std::endl;

    Matrix3d R,Rx;

    R = AngleAxisd(PI, Vector3d::UnitX())
        * AngleAxisd(0, Vector3d::UnitY())
        * AngleAxisd(0, Vector3d::UnitZ());
    Rx = AngleAxisd(PI, Vector3d::UnitX());

    cout << R << endl << endl;
    cout << Rx << endl << endl;

    Vector3d ea = R.eulerAngles(0,1,2); 
    Vector3d eax = Rx.eulerAngles(0,1,2); 

    cout << ea << endl << endl;
    cout << eax << endl << endl;

    std::cin.ignore();
    return 0;
}

输出(我将数字太小到零):

1 0 0
0 -1 0
0 0 -1

1 0 0
0 -1 0
0 0 -1

0
3.14159
3.14159

0
3.14159
3.14159

3 个答案:

答案 0 :(得分:1)

欧拉的角度并不是唯一的。在您的XYZ约定中,(0, pi, pi)(pi,0,0)表示相同的旋转,并且两者都是正确的。 Eigen::eulerAngles方法始终选择最小化第一个角度。

答案 1 :(得分:1)

请参阅Eigen:eulerAngles的{​​{3}}。有关欧拉角的各种惯例的详细信息已在documentationWikipedia中详细记录。

编辑:

  1. 如果您使用内部定义的M_PI而不是PI的截断值,您将获得准确的结果。

  2. 欧拉角表示具有奇点。您要比较的测试用例是一个独特的位置。

  3. 如果您希望克服奇点,可能需要使用四元数或轴角表示。

答案 2 :(得分:-1)

不同的订单欧拉角(roll1,pitch1,yaw1或pitch2,yaw2,roll2,...)可以产生相同的旋转矩阵。

实际上,Eigen文件给出了答案。 更仔细地阅读Eigen document的函数声明,您将得到答案。 Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > Eigen::MatrixBase< Derived >::eulerAngles ( Index a0, Index a1, Index a2 ) const 三个参数a0,a1,a2中的每一个将相应的旋转轴表示为{0,1,2}中的整数。例如,在:

Vector3f ea = mat.eulerAngles(2, 0, 2);

“2”表示z轴,“0”表示x轴等