深度解析卡尔曼滤波在IMU中的使用

众所周知卡尔曼滤波在处理IMU传感器数据融合中作用巨大,但在实际实现起来并非那么容易;本文从MPU6050入手,分析卡尔曼滤波的使用。

本篇文章需要你在夜深人静的时候、先去冲一杯咖啡、准备一张纸、一支笔……

卡尔曼滤波
从来没有坐下来认真的计算卡尔曼滤波的公式由来以及它背后更深层次的原理,为什么在处理加速度以及陀螺仪的数据融合中卡尔曼滤波就那么的有效。但是对于大多数人来说,可能更感兴趣的是如何正确的去使用它,卡尔曼滤波的那五个公式到底怎么使用。

开始之前需要你具备一定的矩阵乘法、矩阵变换等知识,大家都知道矩阵乘法的重要性,不夸张的说,不懂矩阵乘法根本做不了复杂的模型。当然本篇涉及到的矩阵乘法没那么复杂,如果忘记了请翻大学时的课本脑补,或参考以下网站:

http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29

http://www.mathwarehouse.com/algebra/matrix/multiply-matrix.php

http://en.wikipedia.org/wiki/Transpose

http://en.wikipedia.org/wiki/Covariance_matrix

卡尔曼滤波器简单讲就是一个算法,它使用一系列随着时间推移的包含噪声的观察、测量,基于系统当前状态以及系统的前一个状态进行估计运算,不断的迭代,最终估计出系统的最优状态,类似加权平均。

对于mpu6050这个IMU惯性测量模块来讲,相对于加速度计,陀螺仪的精度会高一些,但是时间长了它会漂移;加速度计虽然精度不高,但是没有明显的随着时间增加的漂移。

有人会说那么短时间内我们相信陀螺仪,长时间内我们可以相信加速度计。可以使用互补滤波来处理这个问题;加速度计可以用一个数字低通滤波器来处理,陀螺仪可以用数字高通滤波器。但是它并不如卡尔曼滤波的效果好,当然也有很多人使用一阶互补滤波成功的应用到自己的产品中,比如平衡车以及四旋翼飞行器中。

关于互补滤波与卡尔曼的比较请移步这里:

http://robottini.altervista.org/kalman-filter-vs-complementary-filter

卡尔曼滤波器根据系统的观察和测量对系统做出最优的状态估计,它需要知道系统的测量噪声,以及系统本身的噪声,我们将系统本身的噪声称之为过程噪声。并且假定这些噪声符合高斯分布,令人庆幸的是现实中大部分随机噪声都是符合高斯分布的。如果忘记了什么是高斯分布,请回去翻高等数学脑补。

关于卡尔曼滤波的原理推导请参考:

http://en.wikipedia.org/wiki/Kalman_filter

http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf

http://academic.csuohio.edu/simond/courses/eec644/kalman.pdf

系统状态
在这里插入图片描述
接下来的部分可能比较费解,但是只要你坐下来准备好纸和笔,一步一步跟着来,也没那么难理解。

关于矩阵的乘法计算 可以使用这个在线计算器

http://www.wolframalpha.com

关于本篇文章的几点声明:

a. 如果矩阵是个常量,不依赖于当前时间,那么就不用写下标 k。

b. 前一个系统状态估计值,英文称为prveious,即 k-1 时刻的系统状态估计值:
在这里插入图片描述
c. 先验状态估计值,英文称为 priori,简单讲就是对系统状态的估计值:
在这里插入图片描述
d. 后验状态 英文称为posteriori,简单讲就是对系统的测量值即观测值:
在这里插入图片描述
对于我们的惯性测量模块,问题是系统状态是隐藏的,我们不能直接获取系统的角度,只能通过观测方程
在这里插入图片描述
来观测。这也称为隐马尔科夫模型。不懂什么叫隐马尔可夫模型,请移步这里:
https://en.wikipedia.org/wiki/Hidden_Markov_model

这就意味着系统状态是与当前时刻 k 的状态以及之前的状态有直接关系的,如果没有使用卡尔曼滤波是无法更真实的得到系统的状态的。

在 x 上面加一个帽子
在这里插入图片描述
意思是表示状态的估计。x 则表示系统的真实状态,我们试图努力去估计的值。
因此用
在这里插入图片描述
表示 k时刻系统的真实状态。
参考卡尔曼滤波的五个方程,系统状态方程可以这样给出:
在这里插入图片描述
其中
在这里插入图片描述
为系统状态矩阵,大小为 n1 列,对于MPU6050,n为2,因此可以这样表示系统状态矩阵:
在这里插入图片描述
使用符号
在这里插入图片描述
表示角度,使用
在这里插入图片描述
表示系统角速度偏差,基于加速度计和陀螺仪测量的角速度偏差即陀螺仪的漂移量。理论上,如果从陀螺仪的测量值减去这个偏差就可以得到陀螺仪的真实角速度值。
F 为状态转移模型矩阵,大小为 n
n ,对于本系统此处为:
在这里插入图片描述
先不要管为什么是
在这里插入图片描述
,接着往下看。
在这里插入图片描述
是系统控制输入,大小为 k1,对应我们的系统那就是陀螺仪在当前时刻 k 的测量值即角速度,单位是(°/s),我们使用
在这里插入图片描述
表示角速度,因此系统状态方程可以写成:
在这里插入图片描述
B 表示控制输入模型矩阵,大小为 n
k,对于我们的系统应该定义如下:
在这里插入图片描述
当用控制输入模型矩阵 B 去和
在这里插入图片描述
相乘时,第一行的
在这里插入图片描述

在这里插入图片描述
相乘可以直接得到角度
在这里插入图片描述
,因为我们不能直接通过角速度的计算得到偏差,因此,我们将矩阵 B 的底部设为0。
在这里插入图片描述
是 k 时刻的过程噪声,符合均值为0协方差为 Q 的高斯分布:
在这里插入图片描述
变量
在这里插入图片描述
是过程噪声协方差矩阵,对于我们的系统那就是加速度计的状态估计协方差以及陀螺仪的偏差协方差。我们假定系统的加速度计以及陀螺仪偏差估计都是独立的,即是相互解耦的,因此可以用对角矩阵表示:
在这里插入图片描述
可以看到,过程噪声协方差矩阵
在这里插入图片描述
是跟时间相关的,它依赖于当前时刻k。
这将造成过程噪声随着时间的增加越来越大,比如陀螺仪的漂移。这些常数是卡尔曼滤波器工作的前提,必须知道这些参数才能正确的使用卡尔曼滤波。

如果
在这里插入图片描述
设置了一个较大的值,那么系统的噪声也会随之增大。如果我们的角度估计值开始漂移,那么我们就必须增加
在这里插入图片描述
;如果对系统的估计趋势变慢,意味着对角度的信任度过高,那么我们应该降低
在这里插入图片描述
的值,以便于提高系统的动态响应能力。
测量值
在这里插入图片描述
测量值或称为观测值,有以下方程给出:
在这里插入图片描述
其中
在这里插入图片描述
为系统测量值,大小为 m1,式中的
在这里插入图片描述
为测量噪声,H 为称为观测模型矩阵,大小为 m
n ,作用是将系统真实状态空间映射到观测空间。系统的真实状态是无法观测的,因为测量仅仅对加速度计的测量。对于本系统:
在这里插入图片描述
测量噪声也是假定符合均值为0协方差为R的高斯分布:
在这里插入图片描述
因为R不是一个矩阵,测量噪声和测量的方差相等,因为同一个变量的协方差和方差相等。
因此我们将R定义为:
在这里插入图片描述
我们假定测量噪声是不随时间改变的,即我们假定测量噪声是个固定值,那么可以写成:
在这里插入图片描述
如果将测量噪声方差
在这里插入图片描述
设定的太大,卡尔曼滤波器的响应会变慢,因此他会对新测量值的信任度降低。但是如果测量噪声方差
在这里插入图片描述
设置的太小,那么预测值的权重会增大,因为我们对加速度计的测量值信任度更高。
因此我们必须想办法找出过程噪声方差
在这里插入图片描述

在这里插入图片描述
以及测量噪声方差
在这里插入图片描述
,有很多种方法找到他们,但是具体怎么去找不在本篇的讨论范围内。
卡尔曼滤波方程
下面我们将使用卡尔曼滤波方程估计出系统在k时刻的真实状态
在这里插入图片描述
预测阶段
卡尔曼滤波的五个方程中预测阶段由两个方程组成。在这两个方程中,我们将试图预测系统的当前状态即k时刻的状态,以及在k时刻的误差协方差矩阵。

卡尔曼滤波器首先基于系统之前的状态和陀螺仪的测量值估计系统的当前状态,即k时刻的系统估计先验状态估计值:
在这里插入图片描述
接下来我们将基于前一个误差协方差矩阵
在这里插入图片描述
试图估计这个先验误差协方差矩阵
在这里插入图片描述
,它的定义如下:
在这里插入图片描述
这个矩阵表示我们对当前预测状态的信任度,它越小说明我们越相信当前预测状态,上面方程的原理很容易理解,它表明误差协方差会随着上一次的系统预测状态增加,因此我们将误差协方差矩阵与状态转移模型 F 以及状态转移模型矩阵的转置矩阵
在这里插入图片描述
相乘,最后和当前时刻k的过程噪声
在这里插入图片描述
相加 。
对于我们的系统,误差协方差矩阵 P 是一个2x2的矩阵
在这里插入图片描述
更新阶段
首先我们计算出实际测量值
在这里插入图片描述
和先验状态即预测值
在这里插入图片描述
的差别,这也叫做残差:
在这里插入图片描述
它表示测量值和预测值的偏离程度,如果残差为0那么意味着测量值和预测值完全吻合。

观测模型 H 用于将先验状态
在这里插入图片描述
映射到观测空间,所谓的观测也就是对于加速度的测量,因此残差
在这里插入图片描述
不是一个矩阵:
在这里插入图片描述
接下来我们将要计算残差协方差:
在这里插入图片描述
它的计算基于先验误差协方差矩阵
在这里插入图片描述
和测量协方差矩阵 R,观测模型 H 用于将先验误差协方差矩阵
在这里插入图片描述
映射到观测空间。
测量噪声越大 S 的值越大,也就意味着我们不能过于信任测量值;对于我们的系统,S 不是一个矩阵:
在这里插入图片描述
接下来计算卡尔曼增益,卡尔曼增益用于表示我们对于残差
在这里插入图片描述
的信任度,它以下式定义:
在这里插入图片描述
从卡尔曼的增益公式可以看出,我们对残差
在这里插入图片描述
的信任度越小,它 的协方差将会越大;如果对于估计状态的信任度越高,误差协方差矩阵将会越小,因此卡尔曼增益将会随之变小;反之,如果我们对于残差的信任度越高,那么我们对于当前状态的预测的信任度就会降低。
观测模型H的转置用于将误差协方差矩阵P映射到观测空间,如果不知道误差协方差矩阵P的起始值,我们可以将P设置为:
在这里插入图片描述
L初始以一个较大的值代替。对于我们的系统,一开始的起始角度是确定的,而且一开始的陀螺仪偏差也是可以校正的,因此我们可以认为系统的初始状态是确定的,因此我们可以初始化误差协方差矩阵为:
在这里插入图片描述
卡尔曼增益是一个2x1的矩阵:
在这里插入图片描述
现在我们可以更新当前状态的后验估计:
在这里插入图片描述
卡尔曼增益
在这里插入图片描述
与 残差
在这里插入图片描述
的乘积再加上先验状态
在这里插入图片描述
,这就是卡尔曼滤波的本质,卡尔曼增益
在这里插入图片描述
作为一个加权值,决定我们对于系统观测值与估计值的信任度。
残差
在这里插入图片描述
是测量值
在这里插入图片描述
与先验状态估计值
在这里插入图片描述
的差。
最后我们需要更新后验协方差矩阵:
在这里插入图片描述
公式中的I是单位矩阵:
在这里插入图片描述
卡尔曼滤波器可以基于我们对于系统状态估计值的修正度来自动修正误差协方差矩阵。修正系统的状态既要基于误差协方差矩阵
在这里插入图片描述
也要基于残差
在这里插入图片描述
的协方差
在这里插入图片描述

代码实现
下面关键的部分来了,你一定迫切的想知道如何用代码实现上面的卡尔曼公式,计算出系统的角度、偏差等。代码参考请移步:

https://github.com/TKJElectronics/KalmanFilter

Step 1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上计算可以看出角度的先验状态估计
在这里插入图片描述
等于前一个状态估计
在这里插入图片描述
加上角速度与时间
在这里插入图片描述
的乘积。
因为偏差不能通过直接测量得到,可以认为先验状态偏差等于它前一个状态的偏差,因此可以用C语言这样计算角速度rate和角度angle:

 rate = newRate -bias;
 angle += dt*rate

Step 2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
误差协方差矩阵写成C语言:

P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
P[0][1] -= dt * P[1][1];
P[1][0] -= dt * P[1][1];
P[1][1] += Q_gyroBias * dt;

Step 3:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

角度的残差写成C语言:


y = newAngle - angle;

Step 4:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C代码实现:

S = P[0][0] + R_measure;

Step 5:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
值得注意的是在其他系统下S可能是一个矩阵,所以在某些系统下不能简单的用P去除以S,而是需要求矩阵的逆。

C语言实现为:

K[0] = P[0][0] / S;
K[1] = P[1][0] / S;

Step 6:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C代码实现:

angle += K[0] * y;
bias += K[1] * y;

Step 7:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C代码实现:

float P00_temp = P[0][0];
float P01_temp = P[0][1];
P[0][0] -= K[0] * P00_temp;
P[0][1] -= K[0] * P01_temp;
P[1][0] -= K[1] * P00_temp;
P[1][1] -= K[1] * P01_temp;

经过验证,初始参数设置为以下值时适用于大多数的IMU,并且这些初始参数将会使mpu6050工作在最佳状态;

float Q_angle = 0.001;
float Q_gyroBias = 0.003;
float R_measure = 0.03;

参考:

http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it/

https://blog.csdn.net/heyijia0327/article/details/17487467

https://github.com/xiahouzuoxin/kalman_filter

http://en.wikipedia.org/wiki/Kalman_filter

http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf

http://academic.csuohio.edu/simond/courses/eec644/kalman.pdf

  • 25
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
卡尔曼滤波是一种常用的数据融合算法,可以将多个传感器的测量结果进行合并,提高系统的追踪和估计精度。对于结合GPS和IMU传感器进行定位和导航的问题,卡尔曼滤波可以显著改善系统的性能。 GPS(全球定位系统)是一种利用卫星信号进行定位的导航系统,通过接收来自卫星的信号,可以测量出接收器与卫星之间的距离。然而,GPS存在着一些问题,例如信号受阻或者误差累积等,会导致实际位置的偏差。IMU(惯性测量单元)则是利用加速度计和陀螺仪等传感器测量出物体的加速度和角速度,可以提供相对准确的即时运动状态。 通过卡尔曼滤波,可以将GPS和IMU的测量结果进行融合,得到更加准确和可靠的定位和导航信息。卡尔曼滤波的核心思想是通过预测模型和测量模型,结合先验信息和观测数据,给出最优估计。具体地,卡尔曼滤波利用IMU的测量数据进行系统状态的预测,并通过GPS的测量数据进行更新,最终得到精确的位置和姿态。 卡尔曼滤波可以克服GPS定位精度的局限性,提供更准确和稳定的位置和姿态解算,尤其在信号不稳定或者断的情况下有很好的效果。通过结合两种不同类型的传感器,卡尔曼滤波可以充分利用各自的优点,弥补彼此的不足,从而实现更精确和鲁棒的定位和导航系统。 综上所述,卡尔曼滤波在结合GPS和IMU传感器进行定位和导航问题发挥着重要的作用,可以提高系统的性能,实现更准确和可靠的定位和导航。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值