欧拉角,四元数,旋转矩阵以及它们的转换关系

欧拉角

定义

一个物体(刚体)相对于世界坐标系(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值