四元数旋转相乘顺序(eigen和TF)

       四元数可以避免欧拉角的奇异性,但是不直观。旋转涉及到对全局坐标系还是对局部坐标系?对四元数旋转和对坐标旋转一样吗?左乘还是右乘?

        坐标转换相对比较容易理解,四元数的旋转困扰了我很久,思考如下,如有错误请大佬指正。

        规定ZYX顺序,对应Yaw,Pitch和Roll。

        若以局部坐标系旋转,也就是先按照Z轴旋转,再绕当前坐标系Y轴旋转,再绕当前坐标系X轴旋转。四元数和常见的姿态表示均用这种方式。用公式表示

Q=Q_{z}*Q_{y}*Q_{x}

        若以固定坐标系旋转,也就是先按照Z轴旋转,再绕固定坐标系Y轴旋转,再绕固定坐标系X轴旋转。用公式表示为:

Q=Q_{x}*Q_{y}*Q_{z}


       

        如果用四元数连续相乘,我觉得比较好理解的方式是全都考虑成局部坐标系中。

        Eigen中使用欧拉角、四元数、旋转矩阵和角轴不在这里提及。可参考:(12条消息) 使用Eigen实现四元数、欧拉角、旋转矩阵、旋转向量之间的转换_eigen 四元数转欧拉角_一抹烟霞的博客-CSDN博客https://blog.csdn.net/qq_34213260/article/details/113651597        下面说一下Eigen中四元数和欧拉角需要注意的地方。

欧拉角转四元数:

方法一:用eigen

Eigen::AngleAxisd rollAngle(Eigen::AngleAxisd(roll,Eigen::Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(Eigen::AngleAxisd(pitch,Eigen::Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(Eigen::AngleAxisd(yaw,Eigen::Vector3d::UnitZ()));
Eigen::Quaterniond Q = yawAngle*pitchAngle*rollAngle;

方法二:用tf2

tf2::Quaternion tf_q;
tf_q.setRPY( roll , pitch , yaw );

这里有篇博客跟我的相反,我也不知道为什么。

(12条消息) Eigen 四元数和欧拉角相互转换_eigen 欧拉角转四元数_heroacool的博客-CSDN博客

四元数转欧拉角:

方法一:

Eigen::Vector3d euler=quaternion.matrix().eulerAngles(0,1,2);

对应的就是Roll,Pitch和Yaw,也就是XYZ。但是由于有奇异性,所以容易超过pi。

方法二:用tf2中的四元数,不会出现超过pi

Eigen::Quaterniond q;
tf2::Quaternion tf_q(q.x(),q.y(),q.z(),q.w());
tf2::Matrix3x3 eulerMatrix(tf_q);
eulerMatrix.getRPY(r,p,y);  

//发现一个新的方法
#include "tf2/impl/utils.h"
double yaw = tf2::impl::getYaw(tf_q);
//除了yaw以外还有
//void getEulerYPR(const tf2::Quaternion& q, double &yaw, double &pitch, double &roll)
//double getYaw(const tf2::Quaternion& q)
 

备注:tf2的四元数转回eigen中的四元数

tf2::Quaternion tf_q;
Eigen::Quaterniond q(tf_q.getW(),tf_q.getX(),tf_q.getY(),tf_q.getZ());

tf和eigen中四元数对坐标旋转的区别:

eigen中四元数直接左乘vector3d

Eigen::Vector3d A{x,y,z};
Eigen::Quaterniond q;
A = q*A;

tf中需要借助函数

tf2::Vector3 V{x,y,z};
tf2::Quaternion tf_q;
tf2::Vector3 V1 = tf2::quatRotate(tf_q,V);
//或者借助Transform
tf2::Transform tftrans(tf_q);
tf2::Vector3 V1 = tftrans*V;


 举个例子:

现在有三个坐标系,水平系、IMUA系和IMUB系,其中IMUA传感器和IMUB传感器固连,有一个固定的变换。

已知水平系下姿态和位置编号2,水平系下IMUA系的姿态编号1(原点重合),那么可得IMUA系中表示的位姿。

接着已知IMUA和IMUB之间的旋转(比如绕z轴转90度),那么可以将IMUA下的姿态,转换到IMUB下的姿态。注意这两个姿态不是同一个姿态,是同一个旋转变换。可以理解成一个无人机上有两个IMU。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiangrongZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值