Search code examples
c++matrixeigenrotational-matriceseuler-angles

Roll pitch and yaw from Rotation matrix with Eigen Library


I need to extract the roll pitch yaw angles from a rotation matrix and I want to be sure that what I do is correct.

    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));

Is that correct? Because I was reading here: http://eigen.tuxfamily.org/dox/group__Geometry__Module.html#gad118fececd448d7485ffea4858775e5a

And I was a bit confused when it says, at the end of the description, in which intervals are defined the angles.


Solution

  • I think this is what you are looking for. Depending on how we use m.eulerAngles(0, 1, 2); Here's the code which get rotx, roty, rotz that is reconstructed with 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;
    

    Thank you for your reference! I also firstly use Eigen. It's simply save a lot of work!