特征库欧拉订单排序

时间:2016-02-03 21:03:34

标签: matrix transformation eigen euler-angles

我正在尝试理解Eigen库的“eulerAngles”函数,我有一些没有意义的测试代码。 我的测试包括确定Euler函数调用“eulerAngles(0,1,2)”是否对应于静态帧的“XYZ”Euler序列。对于Eigen的列主矩阵乘法,它应该对应于“Z * Y * X”。我已经通过一些简单的测试证实了这一点,但是对于围绕X轴的负角度,我不了解结果。我没有使用Euler 3 Angle构造函数,而是使用“AngleAxisd”函数:

rot3x3 = AngleAxisd( -M_PI, Vector3d::UnitX() );
Vector3d vec = rot3x3.eulerAngles(0, 1, 2);

对于围绕X轴的正角度,它按照我期望的方式工作。对于-M_PI角度(相当于180度),我看到以下内容:

Euler angles: -0, 3.14159, -3.14159

我希望数组中的第一个元素接近-π,另外两个接近于零。我期望第一个和最后一个角度的范围是±π,中间角度是±π/ 2。中间角度超出范围。 该计划如下:

#include "stdafx.h"
#include <iostream>
#include "<Eigen\Dense"
#include "<unsupported\Eigen\MatrixFunctions"

using namespace std;
using namespace Eigen;

int main(int argc, char* argv[])
{
  Matrix3d rot3x3;

  rot3x3 = AngleAxisd( -M_PI, Vector3d::UnitX() );
  cout << "Here is rot3x3:" << endl << rot3x3 << endl << endl;

  Vector3d vec = rot3x3.eulerAngles(0, 1, 2); // => 1-2-3 => XYZ => Z*Y*X
  cout << "Euler angles: " << vec.x() << ", "
                           << vec.y() << ", "
                           << vec.z() << endl << endl;
  system("pause");
  return 0;
}

输出结果为:

Here is rot3x3:
        1             0             0
        0            -1  1.22465e-016
        0 -1.22465e-016            -1

Euler angles: -0, 3.14159, -3.14159

该结果相当于X轴周围的-π(并且与围绕X轴的正π旋转相同)。中间角度不应该在相当于±90度的范围内吗?

1 个答案:

答案 0 :(得分:0)

欧拉角不是唯一定义的。如果含糊不清,eulerAngles总是选择最小化第一个角度的解决方案。另请参阅相关讨论的以下错误条目:609801947