Creating a rotation matrix with pitch, yaw, roll using Eigen

35,813

Solution 1

Seeing as how I couldn't find a prebuilt function that does this, I built one and here it is in case someone finds this question in the future

Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY());
Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX());

Eigen::Quaternion<double> q = rollAngle * yawAngle * pitchAngle;

Eigen::Matrix3d rotationMatrix = q.matrix();

Solution 2

Caesar answer is ok but as David Hammen says it depends on your application. For me (underwater or aerial vehicles field) the winning combination is:

Eigen::Quaterniond
euler2Quaternion( const double roll,
                  const double pitch,
                  const double yaw )
{
    Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX());
    Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY());
    Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitZ());

    Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle;
    return q;
}

Solution 3

How do I create a rotation matrix using pitch, yaw, roll with Eigen library?

There are 48 ways to do this. Which one do you want? Here are the factors:

  • Extrinsic verus intrinsic.
    Are the rotations about the axes of the fixed system (extrinsic) or are they about the rotated axes (intrinsic)?

  • Rotation versus transformation.
    Do you want to represent the matrix that physically rotates some object or do you want to represent the matrix that transforms vectors from one reference frame to another?

  • Astronomical sequences.
    There are six fundamental astronomical sequences. The canonical Euler sequence involves a rotation about the z axis followed by a rotation about the (rotated) x axis followed by a third rotation about (rotated again) z axis. There are five more of these astronomical-style sequences (x-y-x, x-z-x, y-x-y, y-z-y,and z-y-z) in addition to this canonical z-x-z sequence.

  • Aerospace sequences.
    To add to the confusion, there are six fundamental aerospace sequences as well. For example, a pitch-yaw-roll sequence versus a roll-pitch-yaw sequence. While the astronomy community has pretty much settled on a z-x-z sequence, the same cannot be said of the aerospace community. Somewhere along the way you find people using every one of the six possible sequences. The six sequences in this group are x-y-z, x-z-y, y-z-x, y-x-z, z-x-y, and z-y-x.

Solution 4

All you need to create a rotational matrix is the pitch, yaw, roll, and the ability to perform matrix multiplication.

First, create three rotational matrices, one for each axis of rotation (ie one for pitch, one for yaw, one for roll). These matrices will have the values:

Pitch Matrix:

1, 0, 0, 0,
0, cos(pitch), sin(pitch), 0,
0, -sin(pitch), cos(pitch), 0,
0, 0, 0, 1

Yaw Matrix:

cos(yaw), 0, -sin(yaw),  0,
0, 1, 0, 0,
sin(yaw), 0, cos(yaw), 0,
0, 0, 0, 1

Roll Matrix:

cos(roll), sin(roll), 0, 0,
-sin(roll), cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

Next, multiply all of these together. The order here is important. For normal rotations, you will want to multiply the Roll Matrix by the Yaw Matrix first and then multiply the product by the Pitch Matrix. However, if you're trying to "undo" a rotation by going backwards, you'll want to perform the multiplications in reverse order (in addition to the angles having opposite values).

Share:
35,813

Related videos on Youtube

Caesar
Author by

Caesar

C++ developer.

Updated on April 05, 2020

Comments

  • Caesar
    Caesar about 4 years

    How do I create a rotation matrix using pitch, yaw, roll with Eigen library?

  • Caesar
    Caesar over 10 years
    Thank you for the answer, I already knew about this but I was hoping that the library had a prebuilt function that does this.
  • ApproachingDarknessFish
    ApproachingDarknessFish over 10 years
    @MohammedMajeed I don't believe there is a built in function, but see stackoverflow.com/a/15043888/1530508 for a very concise technique using quaternions.
  • ggael
    ggael over 10 years
    This is documented there
  • Caesar
    Caesar over 9 years
    In aircraft principal axes Roll is Z, Pitch is X, and Yaw is Y. Is the standard different in underwater? en.wikipedia.org/wiki/Aircraft_principal_axes
  • Adri C.S.
    Adri C.S. about 9 years
    @Caesar In my case, I have a Ladybug panoramic camera and the axis are the same as in this answer.
  • Adri C.S.
    Adri C.S. about 9 years
    Nice answer, but as @narcispr said, the axis will depend on what application you have. Could you please specify in your answer that your target is aircraft applications to avoid confusion?
  • user183833
    user183833 over 7 years
    This is for a left handed coordinate system I assume? To apply this for a right handed system you just have to change the input values sign. i.e. set roll = - roll , yaw = - yaw, pitch = -pitch
  • ApproachingDarknessFish
    ApproachingDarknessFish over 7 years
    @user183833 Yes this is left-handed if memory serves.
  • Dylan Madisetti
    Dylan Madisetti about 4 years
    How did you get 48? (6 Astronomical + 6 Aerospace) * (2 for Intrinsic, Extrinsic) = 24 Rotation vs Transformation still uses the same matrices.
  • David Hammen
    David Hammen about 4 years
    @DylanMadisetti - Unless you consider the transpose of a matrix the same as the original, rotation (aka active rotation) and transformation (aka passive rotation) do not use the same matrices. Rotation / translation matrices are only rarely self-adjoint.