被四元数、欧拉角虐了好久,记录一下。
四元数通过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个网站,讲了各种编程中的物理数学知识,还有大量的代码