Euler Angle¶
Euler angle representation is a set of three angles that represent the orientation of a rigid body in 3D space. The three angles are usually denoted as \(\phi\), \(\theta\), and \(\psi\).
This library provides a class 'EulerAngle' to represent Euler angles. The class provides methods to convert Euler angles to other representations like rotation matrix, quaternion, etc.
Using intrinsic rotations, Vector rotation(active rotation), and Tait-Bryan angles. If the order is ZYX, it means that the rotation is first around the Z-axis, then around the Y-axis, and finally around the X-axis.
Check out the Wikipedia page for more information.
Euler Angle Class¶
This class is not derived from MatrixBase. so most of the methods are implemented in the class itself.
// initialize
// by x,y,z angles
EulerAngle<float, EULER_ORDER::XYZ> euler1{0.1f, 0.2f, 0.3f};
EulerAngle<float, EULER_ORDER::ZYX> euler2{0.1f, 0.2f, 0.3f};
// by vector3
Vectorf<3> vec3{{0.1f, 0.2f, 0.3f}}; // x,y,z angles in radian
EulerAngle<float, EULER_ORDER::XYZ> euler3{vec3};
// type alias
EulerAnglef<EULER_ORDER::ZYX> euler4 = euler2;
EulerAngleXYZ<float> euler5 = euler1;
EulerAngleZYXf euler6 = euler2;
// accessors
float x_angle = euler1.x();
float y_angle = euler1.y();
float z_angle = euler1.z();
euler.x() = 0.1f;
euler.y() = 0.2f;
euler.z() = 0.3f;
x_angle = euler1[0];
y_angle = euler1[1];
z_angle = euler1[2];
euler[0] = x_angle;
euler[1] = y_angle;
euler[2] = z_angle;
x_angle = euler1.roll();
y_angle = euler1.pitch();
z_angle = euler1.yaw();
euler1.roll() = 0.1f;
euler1.pitch() = 0.2f;
euler1.yaw() = 0.3f;
z_angle = euler1.getAngleInOrder<2>(); // XYZ, 3rd angle = z_angle
x_angle = euler2.getAngleInOrder<2>(); // ZYX, 3rd angle = x_angle
AXIS z_axis = euler1.getAxisInOrder<2>(); // XYZ, 3rd axis = Z
AXIS x_axis = euler2.getAxisInOrder<2>(); // ZYX, 3rd axis = X
// rotation vector
Vectorf<2> vec2{{1.f, 2.f}};
Vectorf<3> vec3{{1.f, 2.f, 3.f}};
Vectorf<2> vec2_rot = euler1.rotateVector2D(vec2); // using only z angle
Vectorf<3> vec3_rot = euler2.rotateVector3D(vec3);
// axis rotation
EulerAngle<EULER_ORDER::ZYX> euler_rot_x = EulerAngle<EULER_ORDER::ZYX>::axisRotation<AXIS::X>(0.1f);
// rotation representation conversion
euler1.toUnitQuaternion()
euler1.toUnitComplexNum() // using only z angle
euler1.toAxisAngle()
euler1.toSO3Group()
euler1.toSO2Group() // using only z angle
euler1.toVector() // x_angle, y_angle, z_angle
// casting
EulerAngle<EULER_ORDER::ZYX> zyx = euler1.castAxisOrder<EULER_ORDER::ZYX>();
EulerAngleXYZ<double> xyz_d = euler1.castDataType<double>();