四元数、欧拉角的一点记录

本文详细记录了四元数和欧拉角的理解与转换,包括四元数的优势(如计算简便、无万向锁)、欧拉角的直观性以及存在的万向锁问题。文中提到了四元数在物体坐标系中的乘法规则,并指出四元数到欧拉角的转换是难点,特别是避免万向锁。同时分享了相关的C++代码资源和参考资料,包括网站、视频和书籍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

被四元数、欧拉角虐了好久,记录一下。

四元数通过x、y、z、w表示,xyz表示一个向量(即旋转轴),w表示旋转角度(个人理解,实际w为旋转角度一半的cos值)。当xyzw的平方和(即四元数的模的平方)为1时,表示一个旋转,其余的不为1的四元数则不仅包含旋转,还包含了伸缩。四元数在旋转中表示的就是绕一个轴旋转一个角度。

四元数最大的特点是计算方便,而且可以任意插值,也不会有诸如欧拉角的万向锁等问题。但其也有部分缺点,最大的就是表示不直观,没有欧拉角来的形象直观,理解不容易,同时包含四个值,通过欧拉角可知只需三个值即可表示旋转方位,因此有冗余。

欧拉角则通过pitch、yaw、roll表示。三个值中,pitch表示绕x轴的转动,即俯仰角,yaw表示绕y轴转动,即偏航角,roll表示绕z轴转动,即翻滚角。特别注意,欧拉角采用的是物体坐标系,物体旋转后,其坐标轴也跟着一起旋转了。

欧拉角表现的很形象直观,但是却不容易插值,一方面是角度旋转较难控制匀速,可能造成抖动(具体的忘了,好像是这个,反正一句话,差值不方便),另一方面,也是最重要的一点,存在万向锁问题。因此,欧拉角比较少用于计算,而更多的是在终端输出。

矩阵不清楚,太烦躁了,但是知道矩阵包含了大量冗余量,但是在欧拉角、四元数等相互转换中却很重要,而且,说起来,有了矩阵,就没有算不出来的东西了,只是复杂度的问题而已。这里稍稍带过。


四元数表示旋转如下:假设有三个四元数q1、q2、q3,q1表示第一次旋转,q2表示第二次旋转,q3表示两次旋转后的结果,则在固定坐标系(如地磁坐标系)中,有q1*q2=q3;但在非固定坐标系(如物体坐标系)中,则有q2*q1=q3。大多数时候我们采用的是后一种情况,即在物体坐标系中计算。

在四元数与欧拉角转换过程中,欧拉角到四元数转换简单,问题不大,关键在于四元数到欧拉角转换难度较大。一方面要避免万向锁问题,一方面一个四元数对应着无数个欧拉角,但计算只能得到一个。

下面提供的方法是将其中一个角固定在+-90°之间,网上各种什么全角度的转换(包括很多期刊论文中提到的),我个人试了试感觉没一个靠谱的,都是瞎扯淡。

对了,实际使用中一定要注意使用的是地磁坐标系还是物体坐标系,是左手坐标系还是右手坐标系,弄错了会死的很惨的。


下面是相关的一点c++代码,自己用的。

对了,mark个网站,讲了各种编程中的物理数学知识,还有大量的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值