Quaternion2EulerZYX
vector3_t RPY = Eigen::EulerAngles<double, Eigen::EulerSystemZYX>(R).angles().reverse();
ZYX (intrinsic rotations, Eigen) or XYZ (extrinsic rotations): the intrinsic rotations are known as: yaw, pitch and roll.
My solution (test in robotics)
#include <unsupported/Eigen/EulerAngles>
// [Quaternion2Euler]
Eigen::VectorXd Euler_ZYX = Eigen::EulerAngles<double, Eigen::EulerSystemZYX>(quat.normalized().toRotationMatrix()).angles();
// [Euler2Quaternion]
Eigen::Quaterniond q_test =
Eigen::AngleAxisd(Euler_ZYX(0), Eigen::Vector3d::UnitZ()) *
Eigen::AngleAxisd(Euler_ZYX(1), Eigen::Vector3d::UnitY()) *
Eigen::AngleAxisd(Euler_ZYX(2), Eigen::Vector3d::UnitX());
cite: