欧拉角
定义
一个物体(刚体)相对于世界坐标系(ENU坐标系)的旋转角度
旋转顺序
假设物体绕x轴旋转r1度,y轴旋转r2度,z轴旋转r3度。不同的选择顺序导致物体最后的姿态是不同的。如x->y->z和x->z->y就不同
外选和内旋
外旋表示针对世界坐标系的旋转,内旋表示针对自身坐标系的旋转。自身坐标系在旋转过程中本身也会相对于世界坐标系发生旋转。
四元数
定义
四元数由一个实部和三个虚部构成
四元数表示旋转
对于三维空间中的向量,认为它是一个不带实部的四元数v
定义一个 单位四元数
下面的算子表示以u作为旋转轴,旋转θ角度。
旋转矩阵
旋转矩阵与欧拉角的关系
三者相互转换
四元数->旋转矩阵
Eigen::Quaterniond quaternion( w, x, y, z); // w为实部,xyz为虚部
Eigen::Matrix3d rotation_matrix;
rotation_matrix=quaternion.toRotationMatrix();
四元数->欧拉角
Eigen::Quaterniond quaternion( w, x, y, z);
// 1、先将四元数转换为旋转矩阵,再转换为欧拉角
// 2、eulerAngles函数参数对应关系:0-x轴,1-y轴,2-z轴
// 3、返回参数的单位是degree
Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);
旋转矩阵->四元数
Eigen::Matrix3d rotation; // 通过其它方式初始化旋转矩阵
Eigen::Quaterniond quaternion(rotation);
cout<<"quaternion"<<quaternion.w()<<" "<<quaternion.x()<<" "<<quaternion.y()<<" "<<quaternion.z()<<endl;
旋转矩阵->欧拉角
Eigen::Matrix3d rotation; // 通过其它方式初始化旋转矩阵
// 旋转矩阵to欧拉角 ZYX顺序,0表示X轴,1表示Y轴,2表示Z轴
Eigen::Vector3d euler_angles = rotation.eulerAngles(2, 1, 0); //z-y-x
欧拉角->旋转矩阵
Eigen::Vector3d euler(yaw,pitch,roll);; // 对应 z y x
Eigen::Matrix3d rotation_matrix;
// 通过旋转向量来初始化旋转矩阵
rotation_matrix = Eigen::AngleAxisd(euler[0], Eigen::Vector3d::UnitZ()) *
Eigen::AngleAxisd(euler[1], Eigen::Vector3d::UnitY()) *
Eigen::AngleAxisd(euler[2], Eigen::Vector3d::UnitX());
欧拉角->四元数
Eigen::Vector3d eulerAngle(yaw,pitch,roll);
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
// 通过旋转向量来初始化四元数
Eigen::Quaterniond quaternion=yawAngle*pitchAngle*rollAngle;
参考文献
1 -- https://blog.csdn.net/xx970829/article/details/122149727
2 -- Quaternions and Rotations
3 -- https://danceswithcode.net/engineeringnotes/quaternions/conversion_tool.html
4 -- https://danceswithcode.net/engineeringnotes/quaternions/quaternions.html
5 -- 3D Rotations-Part 1