四元数与飞行器

作者:nieyong

《姿态解算简介》中已经提到,四元数是姿态的一种数学表示方式。欧拉角是姿态另外一种表示方式,只是这种表示方式能够直观的表示飞行器在三维空间中的俯仰横滚等状态。在姿态解算算法中飞行器的姿态一般使用四元数表示,在需要输出到控制算法中的时候,才会将四元数转化为欧拉角。下面就详细介绍飞行器中四元数的使用。

四元数

四元数(Quaternions)是由威廉·卢云·哈密尔顿(William RowanHamilton,1805-1865)在1843年发现的数学概念。从明确地角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间。

将实数域扩充到复数域,并用复数来表示平面向量,用复数的加、乘运算表示平面向量的合成、伸缩和旋,这就是我们熟知的复数的二维空间含义,所以人们会继续猜想,利用三维复数不就可以表达三维空间的变换了吗,历史上有很多数学家试图寻找过三维的复数,但后来证明这样的三维复数是不存在的。有关这个结论的证明,我没有查到更明确的版本,据《古今数学思想》中的一个理由,三维空间中的伸缩旋转变换需要四个变量来决定:两个变量决定轴的方向,一个变量决定旋转角度,一个变量决定伸缩比例。这样,只有三个变量的三维复数无法满足这样的要求。但是历史上得到的应该是比这个更强的结论,即使不考虑空间旋转,只从代数角度来说,三维的复数域作为普通复数域的扩张域是不存在的。并且,据《古今数学思想》叙述,即使像哈密尔顿后来引入四元数那样,牺牲乘法交换律,这样的三维复数也得不到。经过一些年的努力之后, Hamilton 发现自己被迫应作两个让步,第一个是他的新数包含四个分量,而第二个是他必须牺牲乘法交换律。(《古今数学思想》第三册177 页)但是四元数用作旋转的作用明显,简化了运算,而且避免了万向锁(Gimbal Lock),四元数是最简单的超复数,我们不能把四元数简单的理解为3D空间的矢量,它是4维空间中的的矢量,也是非常不容易想像的。

我们知道在平面(x,y)中的旋转可以用复数来表示,同样的三维中的旋转可以用单位四元数来描述。我们来定义一个四元数:

我们可以把它写成,其中。那么V是矢量,表示三维空间中的旋转轴。w是标量,表示旋转角度。那么就是绕轴V旋转w度,所以一个四元数可以表示一个完整的旋转。只有单位四元数才可以表示旋转,至于为什么,因为这就是四元数表示旋转的约束条件。

所以大家可以理解为,单位四元数能够表示旋转。我们给出一组单位四元数和欧拉角的转换关系,通过这个关系来将采集到的四元数转化成欧拉角,原理将在软件解算中给出,这里直接使用就可以了:

四元数大量用于电脑绘图(及相关的图像分析)上表示三维物件的旋转及方位。四元数亦见于控制论、信号处理、姿态控制、物理和轨道力学,都是用来表示旋转和方位。

相对于另几种旋转表示法(矩阵,欧拉角,轴角),四元数具有某些方面的优势,如速度更快、提供平滑插值、有效避免万向锁问题、存储空间较小等等。

以上部分摘自维基百科-四元数

姿态解算与四元数

姿态解算的核心在于旋转,一般旋转有4种表示方式:矩阵表示、欧拉角表示、轴角表示和四元数表示。矩阵表示适合变换向量,欧拉角最直观,轴角表示则适合几何推导,而在组合旋转方面,四元数表示最佳。因为姿态解算需要频繁组合旋转和用旋转变换向量,所以采用四元数保存组合姿态。

在Crazepony中,使用四元数来保存飞行器的姿态(也就是在地球坐标系中的俯仰/横滚/航向情况)。在需要控制的时候,会将四元数转化为欧拉角,然后输入到姿态控制算法中。

姿态控制算法的输入参数必须要是欧拉角。

下面就是Crazepony开源四轴飞行器上,姿态解算到姿态控制的整个流程。AD值是指MPU6050的陀螺仪和加速度值,3个维度的陀螺仪值和3个维度的加速度值,每个值为16位精度。AD值通过姿态解算算法得到飞行器当前的姿态(姿态使用四元数表示),然后将四元数转化为欧拉角,用于姿态控制算法(PID控制)中。

四元数的运算

下面介绍四元数的基本运算,以及如何由四元数转化为欧拉角。这些运算在crazepony的代码中会遇到。

四元数可以理解为一个实数和一个向量的组合,也可以理解为四维的向量。这里用一个圈表示q是一个四元数(很可能不是规范的表示方式)。

四元数的长度(模)与普通向量相似。

下面是对四元数的单位化,单位化的四元数可以表示一个旋转。

四元数相乘,旋转的组合就靠它了。

四元数转化为欧拉角。然后使用欧拉角作为姿态控制算法(如PID算法)的输入参数。