基础卡尔曼滤波到互补卡尔曼滤波
从基础卡尔曼滤波到互补卡尔曼滤波
卡尔曼滤波自从1960被Kalman发明并应用到阿波罗登月计划之后一直经久不衰,直到现在也被机器人、自动驾驶、飞行控制等领域应用。基础卡尔曼滤波只能对线性系统建模;扩展卡尔曼滤波对非线性方程做线性近似以便将卡尔曼滤波应用到非线性系统。后来研究者发现将系统状态分成主要成分和误差,并将卡尔曼滤波用来预测误差,会使得系统的近似程度更高,效果更好。在姿态解算任务中,研究者们用辅助传感器如加速度计和磁力计来修正角速度计的积分结果,得到互补卡尔曼滤波的形式。
卡尔曼滤波是一种工具,对实际问题的不同建模方式会得到不同形式的卡尔曼滤波器。这导致了对于初学者不知道从何看起是好。另外也似乎很少有文章对基础卡尔曼滤波到各种形式的滤波形式做总结说明,于是便有了这篇文章。本文会从以下几个方面分析和讲解多种卡尔曼滤波器形式: 1. 基础卡尔曼滤波——对线性系统的预测 2. 扩展卡尔曼滤波——基础卡尔曼滤波在非线性系统的扩展 3. 基于四元素的卡尔曼滤波器——基于实际问题的讲解 4. 状态误差卡尔曼滤波——将状态误差引入状态向量 5. 互补卡尔曼滤波——一种只使用角度误差和角速度误差作为状态向量和测量向量的滤波器形式
符号定义
小写字母为变量;加粗小写字母为向量;大写和加粗大写为矩阵 # 基础卡尔曼滤波器 ## 宏观认识 卡尔曼滤波包含两个步骤
- 预测(prediction)—— Dynamic model
- 更新(correction/measurment update)—— Observation model
所谓预测,就是用一个数学模型,根据当前的传感器输入,直接计算此时系统的状态。可以理解为一个方程的计算就行。
所谓的更新,就是在某些时刻或者每一时刻,获取一些系统的其他状态输入(我们将这个值叫做测量值),比较此刻预测的系统状态和测量的系统状态,对预测出的系统状态进行修正,因此也叫测量更新(measurment update)。
整体框架如下图所示
状态方程及测量方程
测试
预测过程
更新过程
详细公式推导
本文作为一篇概述性文章,为了不使篇幅过于冗长,不进行基础卡尔曼滤波器公式的推导。想完全理解基础卡尔曼滤波器可以参考下面这几篇资料: 1. 卡尔曼滤波基础知识及公式推导——较为形象化地讲解预测和更新这两个过程之间地概率分布关系 2. wiki Kalman Filter——准确的公式化推导
如何理解卡尔曼滤波器?
从概率分布的角度
卡尔曼滤波器将系统状态的变化中的过程噪声假设为均值为0的高斯噪声,使得状态向量也变为一个符合高斯分布的随机向量。同时对观测过程的噪声也假设为均值为0的高斯噪声。通过测量方程,即公式(1-2)得到将状态向量映射到测量向量的函数。于是,当得到测量值的时候,可以利用测量值与状态向量之间的关系得出另外一个对状态向量的估计。利用测量值得出的状态估计和状态方程计算的状态均符合高斯分布,两个高斯分布的联合概率分布依旧保持高斯特性。进一步推导可以得到公式(1-5)到公式(1-7)。关于这个角度的理解可以阅读上面推荐的第一篇文章。 ### 从最小化误差的角度 卡尔曼滤波的最终输出是
扩展卡尔曼滤波
非线性方程的线性近似
卡尔曼滤波器建立在线性的状态方程和测量方程也就是公式(1-1)和公式(1-2)。但是在实际应用中,更多的关系是非线形关系,比如如何从连续的角速度计算出车辆当前的姿态角等。为了能够利用基本卡尔曼滤波器的预测和更新过程,对于非线性的状态方程和观测方程,我们利用一阶的泰勒展开,将非线性公式近似为线性公式。
状态方程及测量方程
对公式(2-1)在
在公式(2-4)和公式(2-5)中: -
预测方程及状态协方差矩阵
更新方程及卡尔曼增益
基础卡尔曼滤波器 && 扩展卡尔曼滤波器总结
基于四元数的拓展卡尔曼滤波器
从实际问题讲起
在运动物体的姿态估计,比如车辆的姿态计算中,常常利用IMU(Inertial Meseasurment Unit)惯性测量单元计算物体的姿态。 为了方便叙述,这里的姿态估计意味着我们希望解算车辆在每一时刻与起始坐标系之间三个轴的偏转角,通常用roll、pitch、yaw表示。 ## IMU(惯性测量单元) 现在的IMU一般是六轴或者九轴。六轴IMU可以输出
相关定义
在姿态估计的各个领域中,通常使用四元数来表示一个旋转。四元数比欧拉角表达拥有更好的特性,同时相比于旋转矩阵又更加紧凑。定义四元数如下
四元素乘积的导数
这部分是为了后面推导扩展卡尔曼滤波的状态方程中的雅各比矩阵准备
我们令
扩展卡尔曼滤波的重点之一在于求状态方程相对于状态的偏导;我们虽然可以从三轴角速度的输出得出角度积分的离散形式公式(1),但是我们其实不能对其直接对
为了能够对公式(1)求出偏导数,我们先求旋转相对时间的导数
我们令
状态向量及控制输入
我们直接将车辆的姿态角以四元数形式表达作为系统状态向量
同时,将每一时刻IMU的三轴角速度作为控制输入
状态方程及其雅各比矩阵
有了上一部分关于四元素导数的推导,我们可以直接写出状态方程如下
其中
测量更新
前文我们使用了角速度计的输出作为控制输入,并构建了状态方程和预测方程。IMU通常都会有加速度计输出,这部分输出可以用来作为测量量,并对预测的状态进行测量更新。我们先回顾测量更新中状态向量的更新过程。
其中的关键联系就是,当车辆静止时,加速度的合向量是重力加速度,垂直向下!
上图中,假设
则当小车运动后,重力加速度在
雅各比矩阵
从公式(3-7)我们可以得到测量模型中的转换函数
更新方程
状态误差卡尔曼滤波器(ErKF : Error-state Kalman Filter)
概述
在使用卡尔曼滤波器做姿态估计(Attitude Estimation)中,很大一部分都采用不是直接将系统姿态角作为卡尔曼滤波的状态,而是将姿态角的积分误差和角速度计的误差作为系统状态。将角速度计的输出弥补上估计出的角速度计误差,然后对其积分,得到姿态角的估计,再弥补上姿态角的误差估计。整个的流程图大概如下面的图,引用自Intertial Head-Tracker Sensor Fusion by a Complementary Separate-Bias Kalman Filter
PS: 要强调的是,各种卡尔曼滤波的形式多种多样,同时各种符号的定义也都并不完全一致,这也是入门卡尔曼滤波比较难的地方,有时候找资料都不知道怎么找。这也是写这篇文章的目的,提供一个基础的脉络给卡尔曼滤波的初学者。因此这里给出的ErKF只是形式之一,主要是引用自论文Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation
状态误差的递推公式
首先,我们令
则
于是,有了状态误差的递推公式,我们就可以像卡尔曼滤波一样推导预测和更新过程
预测过程
与直接对系统状态做卡尔曼滤波稍有不同,使用误差状态的卡尔曼滤波在计算姿态角的时候可以看成三步: 1. 在卡尔曼滤波系统外使用积分算出此时的系统状态 2. 使用卡尔曼滤波算出此时系统状态的误差 3. 将积分出来的系统状态弥补上卡尔曼滤波计算出误差
系统状态计算
由公式(4-1)可以得到状态误差的方程为
预测方程
类似于普通卡尔曼滤波,预测方程为
测量方程
更新方程
这里要执行两步更新 1. 先更新对状态误差的估计 2. 更新状态的估计(即把状态误差弥补到
互补卡尔曼滤波
前言
正如前文所说,卡尔曼滤波器的建模形式多种多样,而且很多研究也是在上世纪,对于误差状态卡尔曼滤波(Error-state Kalman Filter)和互补卡尔曼滤波(Comlimentary Kalman Filter)其实没有严格的定义。这里的互补卡尔曼滤波其实也可以看成上文ErKF的另一种形式。主要采用自论文Inertial head-tracker sensor fusion by a complementary separate-bias Kalman filter。卡尔曼滤波的工作太多,博客和论文也五花八门,看起来十分不易。这篇论文从引用、论文叙述、符号标识看起来都很不错,很适合想要将卡尔曼滤波应用到姿态估计的工程师阅读。甚至有一些工作,直接使用普通卡尔曼滤波输出,然后利用互补滤波器的概念,在多种姿态输出之间做加权平均,也叫互补卡尔曼滤波器,比如这篇专利:一种基于互补卡尔曼滤波算法计算融合姿态角度的方法
互补的概念
其实只要有了角速度计(Gyroscope)我们就可以根据其输出,并在时间上做积分解算出车辆的姿态角
从加速度计计算姿态角roll、pitch
加速度计(Accelerometer)可以输出三个轴的加速度,在静止的情况下,三个轴的合向量就是重力加速度。因此,我们可以利用三个轴加速度之间的关系计算静止状态下的俯仰角(pitch)和翻滚角(roll)
关于如何推导从三个轴的加速度计算roll和pitch,可以看这篇文章
最后得出的形式也非常简单:
具体的计算公式可以看这篇博客
从加速度计算的姿态弥补
从加速度计可以计算出roll角和pitch角,因此,可以将这个结果和角速度的积分结果结合起来,得到一个更好的估计姿态。不过要注意的是,从加速度计算的姿态弥补有两个局限: 1. 加速度计只能计算出Roll角和Pitch角,因此yaw角无法得到互补信息 2. 当车辆处于较大的加速度运动状态时,三轴加速度的合向量跟重力加速度会有偏差,因此互补结果应该根据这个偏差的大小做改变。
互补滤波器
互补滤波器使用角速度的积分结果和加速度与磁力计的计算结果进行插值,得到更好的结果
互补卡尔曼滤波器
互补卡尔曼滤波器将姿态角的误差、角速度的误差当作状态向量;并利用其余传感器如加速度计和磁力计计算出的姿态角与估计的姿态角之间的差作为测量量。通过以下步骤得到系统的姿态角: 1. 卡尔曼滤波器输出姿态角的误差和角速度的误差 2. 将当前时刻角速度的输出加上角速度的误差,并利用积分公式算出姿态角 3. 将步骤2算出的姿态角加上步骤1输出的姿态角误差
状态向量和测量向量
状态向量
测量向量
状态方程
我们可以推导出姿态角对于时间的导数,通常这个导数是姿态角和角速度的函数,即
预测&&更新过程
有了上面状态方程和测量方程的推导,剩下的就是按照公式(4-3)到公式(4-10)的过程代入。这里唯一不同的就是卡尔曼滤波输出的向量是角速度的误差和姿态的误差。在计算姿态的时候先将角速度的误差应用到角速度计的数据,对角度积分,将角度的误差应用到角度积分结果,得到最终的角度输出。整个框架如下图
后话
- 卡尔曼滤波是一个很古老的算法,但同时又是被广泛应用的算法。即使在今天姿态解算中很多用了因子图,但是对IMU的预积分依旧要使用卡尔曼滤波。但是卡尔曼滤波算法只是一个工具,不同的系统建模方式会产生不同形式的卡尔曼滤波器,这也导致了初学者不知道从哪里入手。
- 在查资料的过程中发现,卡尔曼滤波的一些变种如Error-State Kalman Filter和Complimentary Kalman Filter其实并不是严格定义的。
- 笔者对卡尔曼滤波并没有很丰富的应用经验,本身也不是专门做运动控制和姿态解算的。本文的叙述在追求通俗易懂之外尽力保证公式和符号定义的准确。但无法保证没有错误。
- 对于卡尔曼滤波器中各个变量的初始值设置是门学问,论文中都会有独立的章节讲述初始值如何设置。这方面可能得结合实际应用和效果得出最优的方案。
Reference
[1] Roll and Pitch Angles From Accelerometer Sensors
[2] 四元数、欧拉角、旋转矩阵转换
[3] 四元素乘积求导
[5] Inertial head-tracker sensor fusion by a complementary separate-bias Kalman filter
[6] Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation
[8] 卡尔曼滤波基础知识及公式推导