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: