1843年一个叫做哈密尔顿的数学家发明了一种叫四元数算法,就是利用复数的特性来计算三维空间中的旋转。然而当时已经有两种计算三维旋转的方法了,第一种是欧拉算法,最直观,就是围绕着XYZ轴分别旋转几度,第二种则是矩阵算法,但欧拉算法有一个万向锁问题。太复杂不想解释,就是在一种特定的旋转模式下一个轴会锁死,再怎么转都没用,四元数算法可以避免万向锁问题。
哈密尔顿研究出这个算法后,就积极的推广。但当时的数学界根本不接受。首要的原因就是这个算法太抽象了,难以理解。欧拉算法很直观,在脑子里就可以想象得出来。虽然有万向锁问题,但遇到的概率很小,真的遇到了,大不了就用矩阵算法呗。而四元数算法虽然比矩阵算法快,但也就快那么一丢丢,没必要为了节省这一丢丢时间特意去用一种更抽象的算法。
1、Unity基础:欧拉角、四元数在游戏开发中,经常会接触到旋转,常用的旋转方式有使用矩阵旋转,使用欧拉角旋转和使用四元数旋转。在本篇中,主要研究欧拉角和四元数。在Unity的Transform中,Rotation属性对应的就是欧拉角,一共分为3个轴,x、y和z,而每一个数值对应的是绕对应的轴旋转的度数。如上图所示,表示按照坐标顺序旋转,X轴旋转30°,Y轴旋转90°,Z轴旋转10°。
2、什么是姿态四元数一句话”许多情况下用四元数(一种超复数)来描述姿态“,所以有姿态四元数的说法。一般情况下我们习惯性描述姿态的方法是使用欧拉角(横滚角、俯仰角和偏航角),但是由于使用欧拉角描述姿态存在奇点(比如“横滚角90度再偏航90度”的结果和“俯仰90度再横滚90度“可以得到相同的结果”)(或许还有其他的描述方法,大概就是这个意思,你可以再查查),同时四元数无论是从表述的精确性上和计算的方便性上都优于欧拉角,特别对于姿态解算过程,四元数乘法就是姿态更新的过程(原来姿态四元数乘以旋转四元数得到跟新的姿态四元数),所以四元数大量出现在姿态计算领域。
3、如何形象地理解四元数在n系中,加速度计输出为,经过bCn(用四元数表示的转换矩阵)转换之后到b系中的值为;在b系中,加速度计的测量值为,现在和均表示在b系中的竖直向下的向量,由此,我们来做向量积(叉积),得到误差,利用这个误差来修正bCn矩阵,于是四元数就在这样一个过程中被修正了。但是,由于加速度计无法感知z轴上的旋转运动,所以还需要用地磁计来进一步补偿。