0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

仔细看完你就懂卡尔曼滤波(Kalman Filter)

FPGA之家 来源:FPGA之家 2023-03-13 10:25 次阅读

一、引言

以下我们引用文献【1】中的一段话作为本文的開始:

想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林。你仅仅能隐隐约约、断断续续地瞥见小鸟运动的闪现。你试图努力地猜測小鸟在哪里以及下一时刻它会出如今哪里,才不至于失去它的行踪。或者再想象你是二战中的一名雷达操作员,正在跟踪一个微弱的游移目标。这个目标每隔10秒钟在屏幕上闪烁一次。

或者回到更远的从前。想象你是开普勒,正试图依据一组通过不规则和不准确的測量间隔得到的非常不精确的角度观測值来又一次构造行星的运动轨迹。在全部这些情况下。你都试图依据随对问变化并且带有噪声的观察数据去预计物理系统的状态(比如位置、速度等等)。这个问题能够被形式化表示为时序概率模型上的推理,模型中的转移模型描写叙述了运动的物理本质,而传感器模型则描写叙述了測量过程。

为解决这类问题。人们发展出来了一种特殊的表示方法和推理算法——卡尔曼滤波。

二、基本概念

回忆一下HMM的基本模型(例如以下图所看到的)。当中涂有阴影的圆圈(yt-2,yt-1,yt)相当于是观測变量,空白圆圈(xt-2,xt-1,xt)相当于是隐变量。

这事实上揭示了卡尔曼滤波与HMM之间拥有非常深的渊源。

回到刚刚提及的那几个样例,你所观測到的物体状态(比如雷达中目标的位置或者速度)相当于是对其真实状态的一种预计(由于观測的过程中必定存在噪声),用数学语言来表述就是P(yt|xt),这就是模型中的測量模型或測量概率(Measurement Probability)。另外一方面,物体当前的(真实)状态应该与其上一个观測状态相关,即存在这样的一个分布P(xt|xt-1),这就是模型中的转移模型或转移概率(Transition Probability)。当然,HMM中隐变量必须都是离散的,观測变量并无特殊要求。

a2f88dac-bf62-11ed-bfe3-dac502259ad0.png

而从信号处理的角度来讲,滤波是从混合在一起的诸多信号中提取出所需信号的过程[2]。比如,我们有一组含有噪声的行星执行轨迹。我们希望滤除当中的噪声,预计行星的真实运动轨迹。这一过程就是滤波。

假设从机器学习和数据挖掘的角度来说。滤波是一个理性智能体为了把握当前状态以便进行理性决策所採取的行动[1]。比方,前两天我们没出门,可是我们能够从房间里观察路上的行人有没有打伞(观測状态)来预计前两天有没有下雨(真实状态)。

基于这些情况,如今我们要来决策今天(是否会有雨以及)外出是否须要打伞。这个过程就是滤波。

读者应该注意把握上面两个定义的统一性。

所谓预计就是依据測量得出的与状态X(t) 有关的数据Y(t) =h[X(t)] + V(t) 解算出X(t)的计算值a304b4ec-bf62-11ed-bfe3-dac502259ad0.png,当中随机向量V(t) 为測量误差,a3091a96-bf62-11ed-bfe3-dac502259ad0.png称为X的预计,Y 称为 X 的測量。

由于a304b4ec-bf62-11ed-bfe3-dac502259ad0.png是依据Y(t) 确定的.所以a304b4ec-bf62-11ed-bfe3-dac502259ad0.png 是Y(t) 的函数。

a3091a96-bf62-11ed-bfe3-dac502259ad0.png 是Y 的线性函数。则 X 称作 X 的线性预计。设在 [t0, t1] 时间段内的測量为Y。对应的预计为a304b4ec-bf62-11ed-bfe3-dac502259ad0.png。则

当t=t1时。a304b4ec-bf62-11ed-bfe3-dac502259ad0.png 称为X(t)的预计。

当t>t1肘,a304b4ec-bf62-11ed-bfe3-dac502259ad0.png称为X(t)的预測;

当t< t1 时, a304b4ec-bf62-11ed-bfe3-dac502259ad0.png称为X(t)的平滑。

最优预计是指某一指标函数达到最值时的预计。

卡尔曼滤波就是一种线性最优滤波器

由于后面会用到。这里我们补充一下关于协方差矩阵的概念。

设n维随机变量(X1,X2,…,Xn)的2阶混合中心

σij= cov(Xi,Xj) = E[(Xi-E(Xi))(Xj-E(Xj))], (i,j = 1, 2,…,n)

都存在,则称矩阵

a337cdf0-bf62-11ed-bfe3-dac502259ad0.png

为n维随机变量(X1,X2,…,Xn)的协方差矩阵,协方差矩阵是一个对称矩阵,并且对角线是各个维度的方差。

维基百科中还给出了协方差矩阵的一些重要性质,比如以下这两条(此处不做具体证明)。

兴许的内容会用到当中的第一条。

a33d45dc-bf62-11ed-bfe3-dac502259ad0.png

三、卡尔曼滤波方程推导

直接从数学公式和概念入手来考虑卡尔曼滤波无疑是一件非常枯燥的事情。为了便于理解,我们仍然从一个现实中的实例開始以下的介绍。这一过程中你所需的预备知识仅仅是高中程度的物理学内容。

假如如今有一辆在路上做直线运动的小车(例如以下所看到的),该小车在t时刻的状态能够用一个向量来表示,当中pt表示他当前的位置,vt表示该车当前的速度。当然,司机还能够踩油门或者刹车来给车一个加速度ut。ut相当于是一个对车的控制量。显然,假设司机既没有踩油门也没有踩刹车,那么ut就等于0。此时车就会做匀速直线运动。

a342e6b8-bf62-11ed-bfe3-dac502259ad0.png

假设我们已知上一时刻t-1时小车的状态。如今来考虑当前时刻t小车的状态。显然有

a34fd81e-bf62-11ed-bfe3-dac502259ad0.png

易知。上述两个公式中,输出变量都是输入变量的线性组合,这也就是称卡尔曼滤波器为线性滤波器的原因所在。既然上述公式表征了一种线性关系。那么我们就能够用一个矩阵来表示它,则有

a35b35ba-bf62-11ed-bfe3-dac502259ad0.png

假设另当中的

a366df5a-bf62-11ed-bfe3-dac502259ad0.png

则得到卡尔曼滤波方程组中的第一条公式——状态预測公式,而F就是状态转移矩阵。它表示我们怎样从上一状态来猜測当前状态。而B则是控制矩阵,它表示控制量u怎样作用于当前状态。

a37ae8ce-bf62-11ed-bfe3-dac502259ad0.png   (1)

上式中x顶上的hat表示为预计值(而非真实值)。等式左端部分的右上标“-”表示该状态是依据上一状态猜測而来的,稍后我们还将对其进行修正以得到最优预计。彼时才干够将“-”去掉。

既然我们是在对真实值进行预计,那么就理应考虑到噪声的影响。

实践中,我们通常都是假设噪声服从一个0均值的高斯分布。即Noise~Guassian(0,σ)。

比如对于一个一维的数据进行预计时,若要引入噪声的影响。事实上仅仅要考虑当中的方差σ就可以。当我们将维度提高之后。为了综合考虑各个维度偏离其均值的程度,就须要引入协方差矩阵。

回到我们的样例。系统中每一个时刻的不确定性都是通过协方差矩阵Σ来给出的。

并且这样的不确定性在每一个时刻间还会进行传递。也就是说不仅当前物体的状态(比如位置或者速度)是会(在每一个时刻间)进行传递的,并且物体状态的不确定性也是会(在每一个时刻间)进行传递的。这样的不确定性的传递就能够用状态转移矩阵来表示,即(注意。这里用到了前面给出的关于协方差矩阵的性质)

a387f154-bf62-11ed-bfe3-dac502259ad0.png

可是我们还应该考虑到。预測模型本身也并不绝对准确的,所以我们要引入一个协方差矩阵Q来表示预測模型本身的噪声(也即是噪声在传递过程中的不确定性),则有

a38cee84-bf62-11ed-bfe3-dac502259ad0.png  (2)

这就是卡尔曼滤波方程组中的第二条公式,它表示不确定性在各个时刻间的传递关系。

继续我们的小汽车样例。你应该注意到,前面我们所讨论的内容都是环绕小汽车的真实状态展开的。

而真实状态我们事实上是无法得知的,我们仅仅能通过观測值来对真实值进行预计。

所以如今我们在路上布设了一个装置来測定小汽车的位置。观測到的值记为Y(t)。

并且从小汽车的真实状态到其观測状态另一个变换关系。这个变换关系我们记为h(•)。并且这个h(•)还是一个线性函数。此时便有(该式前面以前给出过)

Y(t) =h[X(t)] + V(t)

当中V(t)表示观測的误差。既然h(•)还是一个线性函数,所以我们相同能够把上式改写成矩阵的形式。则有

Yt=Hxt+ v

就本例而言,观測矩阵H= [1 0],这事实上告诉我们x和Z的维度不一定非得相同。

在我们的样例中,x是一个二维的列向量,而Z仅仅是一个标量。此时当把x与上面给出的H相乘就会得出一个标量,此时得到的Y就是x中的首个元素,也就是小车的位置。

相同,我们还须要用一个协方差矩阵R来代替上述式子中的v来表示观測中的不确定性。

当然,由于Z是一个一维的值,所以此时协方差矩阵R也仅仅有一维,也就是仅仅有一个值,即观測噪声之高斯分布的參数σ。假设我们有非常多装置来測量小汽车的不同状态,那么Z就会是一个包括全部观測值的向量。

接下来要做的事情就是对前面得出的状态预计进行修正,具体而言就是利用以下这个式子

a394fd68-bf62-11ed-bfe3-dac502259ad0.png    (4)

直观上来说,上式并不难理解。前面我们提到。a39cdd94-bf62-11ed-bfe3-dac502259ad0.png是依据上一状态猜測而来的。那么它与“最优”预计值之间的差距如今就是等式右端加号右側的部分。a3a6fbd0-bf62-11ed-bfe3-dac502259ad0.png表示实际观察值与预估的观測值之间的残差。这个残差再乘以一个系数K就能够用来对预计值进行修正。

K称为卡尔曼系数,它也是一个矩阵,它是对残差的加权矩阵。有的资料上称其为滤波增益阵。

a3b1218c-bf62-11ed-bfe3-dac502259ad0.png   (3)

上式的推导比較复杂,有兴趣深入研究的读者能够參阅文献【2】(P35~P37)。

假设有时间我会在后面再做具体推导。可是如今我们仍然能够定性地对这个系数进行解读:滤波增益阵首先权衡预測状态协方差矩阵Σ和观測值矩阵R的大小。并以此来认为我们是更倾向于相信预測模型还是具体观測模型。

假设相信预測模型多一点。那么这个残差的权重就会小一点。反之亦然。假设相信观察模型多一点,这个残差的权重就会大一点。不仅如此,滤波增益阵还负责把残差的表现形式从观測域转换到了状态域。

比如本题中观測值Z仅仅是一个一维的向量,状态x是一个二维的向量。

所以在实际应用中,观測值与状态值所採用的描写叙述特征或者单位都有可能不同,显然直接用观測值的残差去更新状态值是不合理的。

而利用卡尔曼系数,我们就能够完毕这样的转换。比如。在小车运动这个样例中,我们仅仅观察到了汽车的位置,但K里面已经包括了协方差矩阵P的信息(P里面就给出了速度和位置的相关性)。所以它利用速度和位置这两个维度的相关性,从位置的残差中推算出了速度的残差。

从而让我们能够对状态值x的两个维度同一时候进行修正。

最后,还需对最优预计值的噪声分布进行更新。所使用的公式为

a3b5955a-bf62-11ed-bfe3-dac502259ad0.png (5)

至此。我们便获得了实现卡尔曼滤波所需的全部五个公式,我在前面分别用(1)~(5)的标记进行了编号。我如今把它们再次罗列出来:

a3c34dda-bf62-11ed-bfe3-dac502259ad0.png

我们将这五个公式分成预測组和更新组。

预測组总是依据前一个状态来预计当前状态。更新组则依据观測信息来对预測信息进行修正。以期达到最优预计之目的。

四、一个简单的实例

当然,你可能困惑于卡尔曼滤波是否真的有效。以下利用文献[4]中给出的样例(为提升显示效果。笔者略有改动)来演示卡尔曼滤波的威力。

这个样例模拟质点进行匀速直线运动(速度为1),然后引入一个非常大的噪声。再用卡尔曼滤波来对质点的运动状态进行轨迹。注意是匀速直线运动。所以当中不含有控制变量。

Z=(1:100); %观測值
noise=randn(1,100); %方差为1的高斯噪声
Z=Z+noise;
  
X=[0; 0]; %状态
Sigma = [1 0; 0 1]; %状态协方差矩阵
F=[1 1; 0 1]; %状态转移矩阵
Q=[0.0001, 0; 0 0.0001]; %状态转移协方差矩阵
H=[1 0]; %观測矩阵
R=1; %观測噪声方差
  
figure;
hold on;
  
for i=1:100
  
  X_ = F*X;
  Sigma_ = F*Sigma*F'+Q;
  K = Sigma_*H'/(H*Sigma_*H'+R);
  X = X_+K*(Z(i)-H*X_);
  Sigma = (eye(2)-K*H)*Sigma_;
    
  plot(X(1), X(2), '.','MarkerSize',10); %画点,横轴表示位置。纵轴表示速度
end

plot([0,100],[1,1],'r-');


下图给出了上述代码的执行结果。

可见经过最開始的几次迭代后。质点运动的状态预计就回到了正确轨迹上,并且预计的结果基本环绕在真实值附近,效果还是非常理想的。

a3cfb48a-bf62-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48127

    浏览量

    740171
  • 滤波器
    +关注

    关注

    158

    文章

    7334

    浏览量

    174813
  • HMM
    HMM
    +关注

    关注

    0

    文章

    14

    浏览量

    9859
  • 卡尔曼滤波
    +关注

    关注

    3

    文章

    160

    浏览量

    24478
  • 机器学习
    +关注

    关注

    66

    文章

    8134

    浏览量

    130577

原文标题:仔细看完你就懂卡尔曼滤波(Kalman Filter)

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    卡尔滤波的可视化解释-Kalman Filters(双语字幕)#卡尔滤波

    算法Filter卡尔滤波行业芯事经验分享
    硬件小哥哥
    发布于 :2022年06月24日 16:32:16

    卡尔滤波

    卡尔滤波的估计值能很好的逼近真实值,我的疑惑是,这和滤波有什么关系,请高手介绍下卡尔算法是如
    发表于 07-04 22:57

    到底哪种滤波算法好?互补滤波卡尔滤波结果比较

    ) * (angle_hb - mpu_data.y_gyro_f * 0.01) + (0.02)*(mpu_data.x_accel_f);//卡尔滤波Kalman_Filter
    发表于 06-12 14:54

    mpu6050卡尔滤波stc12单片机

    图片1-4是调零的步骤文档kalman卡尔滤波程序工程内有3个c文件hc.c被简单修改过用在平衡车上的kalman.c为
    发表于 05-23 15:49

    一个应用实例详解卡尔滤波及其算法实现

    卡尔增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!下面就要言归正传,讨论真正工程系统上的卡尔。3.
    发表于 09-12 22:16

    卡尔滤波的原理说明

    to the Kalman Filter)为了可以更加容易的理解卡尔滤波器,这里会应用形象的描述方法来讲解,而不是像大多数参考书那样罗列
    发表于 09-21 11:41

    卡尔滤波程序的转换问题

    上面是卡尔滤波的第五个公式,里面说I是一个全1矩阵,然后可以转换成下面这个式子,但是我仔细看了一下,如果想要转换成这样子,这个I应该是个单位矩阵才对,也就对角线为1的矩阵,全1矩阵乘
    发表于 04-12 06:36

    基于卡尔滤波的matlab算法分享!

    卡尔滤波实现简单,滤波效果好 ,下面分享一个基于卡尔滤波
    发表于 08-01 04:35

    卡尔滤波有哪些应用

    置信度高的值滤出来。综合看了不少文献和资料,能把卡尔滤波讲清楚的最好的几篇分别是:Understanding the Basis of the Kalman
    发表于 07-12 06:00

    卡尔滤波在信号处理中有何应用

    卡尔滤波在信号处理方面用的是比较多的,资料也是非常多的,这里就不写了。自适应卡尔滤波也有很多
    发表于 08-18 06:49

    卡尔滤波九轴融合算法stm32尝试

    一、卡尔滤波九轴融合算法stm32尝试1、Kalman滤波文件[.h已经封装为结构体]Kalman
    发表于 02-10 07:18

    卡尔滤波简介

    希望这篇笔记可以帮助到你。卡尔滤波Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。
    发表于 02-28 14:24

    Kalman滤波在视频监控中的应用

    Kalman滤波在视频监控中的应用摘要:卡尔滤波(Kalman) 是一种根据时变随机信号的统计特性,对信号的未来值做出尽可能接近真值的一种
    发表于 05-05 16:26 30次下载

    卡尔滤波(KF)与扩展卡尔曼(EKF)

    中。 百度百科是这样说的,也就是说卡尔滤波第一是递归滤波,其次KF用于线性系统。 但经过研究和改进,出现了很多卡尔曼,如EKF(extended
    发表于 05-10 17:51 3次下载

    一文详解卡尔滤波

    卡尔滤波Kalman Filter),以下简称KF,是由Swerling(1958)和Kalman(1960)作为线性高斯系统(line
    的头像 发表于 08-10 09:58 5622次阅读
    一文详解<b class='flag-5'>卡尔</b>曼<b class='flag-5'>滤波</b>