矩阵的使用可参考系列博客:点击此处
原文链接:基于eigen实现欧拉角(RPY), 旋转矩阵, 旋转向量, 四元数之间的变换。
也可以参考另一篇博客:eigen 中四元数、欧拉角、旋转矩阵、旋转向量。
在机器人学中经常会涉及到欧拉角,旋转矩阵,旋转向量,四元数之间的转换,因此基于eigen对变换关系进行实现,以便参考:
注意,代码中Eigen::AngleAxisd中使用的是必须是弧度radian,不是角度angle。所以,不要直接输入角度angle,需要先把角度angle转化为弧度radian。
#include <iostream>#include <Eigen/Core>
#include <Eigen/Geometry>using namespace std
;#define PI (3.1415926535897932346f)int main(int argc
, char **argv
)
{cout
<< endl
<< "********** AngleAxis **********" << endl
;Eigen
::AngleAxisd rotation_vector1
(M_PI
/4, Eigen
::Vector3d(0, 0, 1)); Eigen
::Matrix3d rotation_matrix1
= Eigen
::Matrix3d
::Identity(); rotation_matrix1
= rotation_vector1
.matrix();cout
<< "rotation matrix1 =\n" << rotation_matrix1
<< endl
; rotation_matrix1
= rotation_vector1
.toRotationMatrix();cout
<< "rotation matrix1 =\n" << rotation_matrix1
<< endl
; Eigen
::Vector3d eulerAngle1
= rotation_vector1
.matrix().eulerAngles(2,1,0);cout
<< "eulerAngle1, z y x: " << eulerAngle1
<< endl
;Eigen
::Quaterniond
quaternion1(rotation_vector1
);Eigen
::Quaterniond quaternion1_1
;quaternion1_1
= rotation_vector1
;cout
<< "quaternion1 x: " << quaternion1
.x() << endl
;cout
<< "quaternion1 y: " << quaternion1
.y() << endl
;cout
<< "quaternion1 z: " << quaternion1
.z() << endl
;cout
<< "quaternion1 w: " << quaternion1
.w() << endl
;cout
<< "quaternion1_1 x: " << quaternion1_1
.x() << endl
;cout
<< "quaternion1_1 y: " << quaternion1_1
.y() << endl
;cout
<< "quaternion1_1 z: " << quaternion1_1
.z() << endl
;cout
<< "quaternion1_1 w: " << quaternion1_1
.w() << endl
;cout
<< endl
<< "********** RotationMatrix **********" << endl
;Eigen
::Matrix3d rotation_matrix2
;rotation_matrix2
<< 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 0, 0, 1;
;Eigen
::Matrix3d rotation_matrix2_1
= Eigen
::Matrix3d
::Identity();Eigen
::Vector3d euler_angles
= rotation_matrix2
.eulerAngles(2, 1, 0); cout
<< "yaw(z) pitch(y) roll(x) = " << euler_angles
.transpose() << endl
;Eigen
::AngleAxisd rotation_vector2
;rotation_vector2
.fromRotationMatrix(rotation_matrix2
);Eigen
::AngleAxisd
rotation_vector2_1(rotation_matrix2
);cout
<< "rotation_vector2 " << "angle is: " << rotation_vector2
.angle() * (180 / M_PI
) << " axis is: " << rotation_vector2
.axis().transpose() << endl
;cout
<< "rotation_vector2_1 " << "angle is: " << rotation_vector2_1
.angle() * (180 / M_PI
) << " axis is: " << rotation_vector2_1
.axis().transpose() << endl
;Eigen
::Quaterniond
quaternion2(rotation_matrix2
);Eigen
::Quaterniond quaternion2_1
;quaternion2_1
= rotation_matrix2
;cout
<< "quaternion2 x: " << quaternion2
.x() << endl
;cout
<< "quaternion2 y: " << quaternion2
.y() << endl
;cout
<< "quaternion2 z: " << quaternion2
.z() << endl
;cout
<< "quaternion2 w: " << quaternion2
.w() << endl
;cout
<< "quaternion2_1 x: " << quaternion2_1
.x() << endl
;cout
<< "quaternion2_1 y: " << quaternion2_1
.y() << endl
;cout
<< "quaternion2_1 z: " << quaternion2_1
.z() << endl
;cout
<< "quaternion2_1 w: " << quaternion2_1
.w() << endl
;cout
<< endl
<< "********** EulerAngle **********" << endl
;Eigen
::Vector3d
ea(0.785398, -0, 0);Eigen
::Matrix3d rotation_matrix3
;rotation_matrix3
= Eigen
::AngleAxisd(ea
[0], Eigen
::Vector3d
::UnitZ()) * Eigen
::AngleAxisd(ea
[1], Eigen
::Vector3d
::UnitY()) * Eigen
::AngleAxisd(ea
[2], Eigen
::Vector3d
::UnitX());cout
<< "rotation matrix3 =\n" << rotation_matrix3
<< endl
; Eigen
::Quaterniond quaternion3
;quaternion3
= Eigen
::AngleAxisd(ea
[0], Eigen
::Vector3d
::UnitZ()) * Eigen
::AngleAxisd(ea
[1], Eigen
::Vector3d
::UnitY()) * Eigen
::AngleAxisd(ea
[2], Eigen
::Vector3d
::UnitX());cout
<< "quaternion3 x: " << quaternion3
.x() << endl
;cout
<< "quaternion3 y: " << quaternion3
.y() << endl
;cout
<< "quaternion3 z: " << quaternion3
.z() << endl
;cout
<< "quaternion3 w: " << quaternion3
.w() << endl
;Eigen
::AngleAxisd rotation_vector3
;rotation_vector3
= Eigen
::AngleAxisd(ea
[0], Eigen
::Vector3d
::UnitZ()) * Eigen
::AngleAxisd(ea
[1], Eigen
::Vector3d
::UnitY()) * Eigen
::AngleAxisd(ea
[2], Eigen
::Vector3d
::UnitX()); cout
<< "rotation_vector3 " << "angle is: " << rotation_vector3
.angle() * (180 / M_PI
) << " axis is: " << rotation_vector3
.axis().transpose() << endl
;cout
<< endl
<< "********** Quaternion **********" << endl
;Eigen
::Quaterniond
quaternion4(0.92388, 0, 0, 0.382683);Eigen
::AngleAxisd
rotation_vector4(quaternion4
);Eigen
::AngleAxisd rotation_vector4_1
;rotation_vector4_1
= quaternion4
;cout
<< "rotation_vector4 " << "angle is: " << rotation_vector4
.angle() * (180 / M_PI
) << " axis is: " << rotation_vector4
.axis().transpose() << endl
;cout
<< "rotation_vector4_1 " << "angle is: " << rotation_vector4_1
.angle() * (180 / M_PI
) << " axis is: " << rotation_vector4_1
.axis().transpose() << endl
;Eigen
::Matrix3d rotation_matrix4
;rotation_matrix4
= quaternion4
.matrix();Eigen
::Matrix3d rotation_matrix4_1
;rotation_matrix4_1
= quaternion4
.toRotationMatrix();cout
<< "rotation matrix4 =\n" << rotation_matrix4
<< endl
;cout
<< "rotation matrix4_1 =\n" << rotation_matrix4_1
<< endl
; Eigen
::Vector3d eulerAngle4
= quaternion4
.matrix().eulerAngles(2,1,0);cout
<< "yaw(z) pitch(y) roll(x) = " << eulerAngle4
.transpose() << endl
;return 0;
}
终端输出:
总结
以上是生活随笔为你收集整理的【自动驾驶】30.c++实现基于eigen实现欧拉角(RPY), 旋转矩阵, 旋转向量, 四元数之间的变换(附代码)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。