0

I'm trying to understand the Eigen library's "eulerAngles" function, and I have some test code that doesn't make sense. My testing includes determining if the Euler function call "eulerAngles(0, 1, 2)" corresponds to a "XYZ" Euler sequence of the static frame. For Eigen's column major matrix multiplication, it should correspond to "Z * Y * X". I have confirmed that with some simple tests, but for negative angles around the X axis I don't understand the results. Instead of using a Euler 3 Angle constructor, I'm using the "AngleAxisd" function:

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

For positive angles around the X axis, it works the way I expect. For the -M_PI angle (equivalent to 180 degrees), I'm seeing the following:

Euler angles: -0, 3.14159, -3.14159

I expect the first element in the array to be near -π, and the other two to be near zero. I expect the range of the first and last angles to be ±π, and the middle angle to be ±π/2. The middle angle is out of range. The program is below:

#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;
}

The output is:

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

Euler angles: -0, 3.14159, -3.14159

This result is equivalent to a -π around the X axis (and it is the same as a positive π rotation around the X axis as well). Shouldn't the middle angle though be in the range that is equivalent to ±90 degrees?

B. Young
  • 191
  • 1
  • 1
  • 6

1 Answers1

0

Euler angles are not uniquely defined. In case of ambiguity, eulerAngles always pick the solution that minimizes the first angles. See also the following bug entries for related discussions: 609, 801, 947.

ggael
  • 28,425
  • 2
  • 65
  • 71