卡尔曼滤波(Kalman Filter)原理理解和测试

article/2025/10/5 22:09:20

Kalman Filter学原理学习

1. Kalman Filter 历史

Kalman滤波器的历史,最早要追溯到17世纪,Roger Cotes开始研究最小均方问题。但由于缺少实际案例的支撑(那个时候哪来那么多雷达啊啥的这些信号啊),Cotes的研究让人看着显得很模糊,因此在估计理论的发展中影响很小。17世纪中叶,最小均方估计(Least squares Estimation)理论逐步完善,Tobias Mayer在1750年将其用于月球运动的估计,Leonard Euler在1749年、Pierre Laplace在1787分别用于木星和土星的运动估计。Roger Boscovich在1755用最小均方估计地球的大小。1777年,77岁的Daniel Bernoulli(大名鼎鼎的伯努利)发明了最大似然估计算法。递归的最小均方估计理论是由Karl Gauss建立在1809年(好吧,他声称在1795年就完成了),当时还有Adrien Legendre在1805年完成了这项工作,Robert Adrain在1808年完成的。
在1880年,丹麦的天文学家Thorvald Nicolai Thiele在之前最小均方估计的基础上开发了一个递归算法,与Kalman滤波非常相似。在某些标量的情况下,Thiele的滤波器与Kalman滤波器时等价的,Thiele提出了估计过程噪声和测量噪声中方差的方法(过程噪声和测量噪声是Kalman滤波器中关键的概念)。上面提到的这么多研究估计理论的先驱,大多是天文学家而非数学家。现在,大部分的理论贡献都源自于实际的工程。“There is nothing so practical as a good theory”,应该就是“实践是检验真理的唯一标准”之类吧。
现在,我们的控制论大Wiener终于出场了,还有那个叫Kolmogorov(柯尔莫戈洛夫)的神人。在19世纪40年代,Wiener设计了Wiener滤波器,然而,Wiener滤波器不是在状态空间进行的(这个学过Wiener滤波的就知道,它是直接从观测空间z(n)=s(n)+w(n)进行的滤波),Wiener是稳态过程,它假设测量是通过过去无限多个值估计得到的。Wiener滤波器比Kalman滤波器具有更高的自然统计特性。这些也限制其只是更接近理想的模型,要直接用于实际工程中需要足够的先验知识(要预知协方差矩阵),美国NASA曾花费多年的时间研究维纳理论,但依然没有在空间导航中看到维纳理论的实际应用。
在1950末期,大部分工作开始对维纳滤波器中协方差的先验知识通过状态空间模型进行描述。通过状态空间表述后的算法就和今天看到的Kalman滤波已经极其相似了。Johns Hopkins大学首先将这个算法用在了导弹跟踪中,那时在RAND公司工作的Peter Swerling将它用在了卫星轨道估计,Swerling实际上已经推导出了(1959年发表的)无噪声系统动力学的Kalman滤波器,在他的应用中,他还考虑了使用非线性系统动力学和和测量方程。可以这样说,Swerling和发明Kalman滤波器是失之交臂,一线之隔。在kalman滤波器闻名于世之后,他还写信到AIAA Journal声讨要获得Kalman滤波器发明的荣誉(然而这时已经给滤波器命名Kalman了)。总结其失之交臂的原因,主要是Swerling没有直接在论文中提出Kalman滤波器的理论,而只是在实践中应用。
Rudolph Kalman在1960年发现了离散时间系统的Kalman滤波器,这就是我们在今天各种教材上都能看到的,1961年Kalman和Bucy又推导了连续时间的Kalman滤波器。Ruslan Stratonovich也在1960年也从最大似然估计的角度推导出了Kalman滤波器方程。


2. Kalman Filter 白话理解

引自:Highgear
一片绿油油的草地上有一条曲折的小径,通向一棵大树.一个要求被提出: 从起点沿着小径走到树下。“很简单。” A说,于是他丝毫不差地沿着小径走到了树下。现在,难度被增加了:蒙上眼。“也不难,我当过特种兵。” B说,于是他歪歪扭扭地走到了树旁。“唉,好久不练,生疏了。” (只凭自己的预测能力)。“看我的,我有 DIY 的 GPS!” C说,于是他像个醉汉似地歪歪扭扭的走到了树旁。“唉,这个 GPS 没做好,漂移太大。”(只依靠外界有很大噪声的测量)“我来试试。” 旁边一也当过特种兵的拿过 GPS, 蒙上眼,居然沿着小径很顺滑的走到了树下。(自己能预测+测量结果的反馈)
“这么厉害!你是什么人?”
“卡尔曼 ! ”
“卡尔曼?!你就是卡尔曼?”众人大吃一惊。 “我是说这个 GPS 卡而慢。”


引自:Kent Zeng
假设你有两个传感器,测的是同一个信号。可是它们每次的读数都不太一样,怎么办?
取平均。
再假设你知道其中贵的那个传感器应该准一些,便宜的那个应该差一些。那有比取平均更好的办法吗?
加权平均。
怎么加权?假设两个传感器的误差都符合正态分布,假设你知道这两个正态分布的方差,用这两个方差值,(此处省略若干数学公式),你可以得到一个“最优”的权重。接下来,重点来了:假设你只有一个传感器,但是你还有一个数学模型。模型可以帮你算出一个值,但也不是那么准。怎么办?
把模型算出来的值,和传感器测出的值,(就像两个传感器那样),取加权平均。
OK,最后一点说明:你的模型其实只是一个步长的,也就是说,知道x(k),我可以求x(k+1)。
问题是x(k)是多少呢?答案:x(k)就是你上一步卡尔曼滤波得到的、所谓加权平均之后的那个对x在k时刻的最佳估计值。
于是迭代也有了。这就是卡尔曼滤波


引自:周啸
假设我养了一只猪:
这只猪
一周前,这只猪的体重是46±0.5kg。注意,在这里我用了±0.5,表示其实我对这只猪一周前的体重并不是那么确定的,也就是说,46kg这个体重有0.5kg的误差。
现在,我又养了这只猪一个星期。那么我想要知道它一个星期之后多重,又大概有多少的误差?
一周后的猪
为了得到一周后的体重,我有两种方法:一是根据我多年的养猪经验得到的猪体重公式推求出一个大概的值,另一个就是直接去称它的体重。当然,两种方法都有一定的误差。假设经验公式得到的体重是48kg,误差2kg;直接称体重得到的是49kg,误差1kg:
预测这头猪
可是,我是一个处女座的人,不管是经验公式得到的值,还是直接称量得到的值,我都觉得不够准。我希望有一种方法,可以同时结合这只猪一周前的体重、用经验公式估计的值以及直接称量得到的值,综合考虑,得出一个最接近猪真实体重的,误差最小的值。这就是卡尔曼滤波要完成的任务。现在我们来把养猪的模型抽象成数学公式:
模型来了
上图的左边,上一周的猪的体重,可以抽象为也k-1时刻的状态值,用k-1时刻的最优估计值加上一个误差项来表示,右边同理。其中,

P=E[ekeTk](31) (31) P = E [ e k e k T ]

这一项表示的是估计值的协方差。这里要说明两点:1,上图中所有的变量都是用粗体,表示这是一个向量或者一个矩阵;2,之所以用(列)向量而非一个数来表示状态值,是因为,虽然一只猪的体重可以用一个值来表示,但是在实际的应用中很多状态并不是一个数就能表示的(比如导弹在空间中的位置,同时有x、y、z三个坐标)。上图中右边表示k时刻的状态值,这个值可以通过预测模块(也就是根据经验公式估计猪的体重)和纠错模块(也就是直接去称量猪的体重值)来估计。同样,预测模块和纠错模块都有着对应的误差和误差协方差矩阵。卡尔曼滤波要做的,就是根据贝叶斯估计的相关理论,同时考虑预测模块和纠错模块的协方差,对误差小的项赋予较大的权重,对误差大的项赋予较小的权重,并使预测的误差最小。
还是这头猪
具体的实现过程如下:
实现


知乎肖畅的回答也很好,推荐查看,这里附上几张简略图
在t=0时刻,原始位置
t=0
在t=1时刻,预测位置
t=1
在t=1时刻,测量位置
测量
结合预测和测量
结合


3. 先验知识

卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。

3.1 正太分布

在概率论中,正态(或高斯)分布是一个非常普遍的连续概率分布。先来简单看一元高斯分布,其概率密度为:

p(x)N(u,σ2)(21) (21) p ( x ) ∼ N ( u , σ 2 )

f(x|u,σ2)=12πσ2e(xu)22σ2(22) (22) f ( x | u , σ 2 ) = 1 2 π σ 2 e − ( x − u ) 2 2 σ 2

其中, u u 是分布的均值或期望; σ 是标准差; σ2 σ 2 是方差。下图为一元高斯的一个示意图。
WIKI
再谈多元高斯分布,k维随机向量 X=[X1X2...Xk]T X = [ X 1 , X 2 , . . . , X k ] T 的多元正态分布:
XN(u,Σ)(23) (23) X ∼ N ( u , Σ )

这里举例二元高斯分布,其概率密度为:
二元高斯分布概率密度函数

正太分布的性质

1 经过线性变换高斯分布仍然为高斯分布

XN(μ,Σ)Y=AX+B}YN(Aμ+B,AΣAT)(5) (5) X ∼ N ( μ , Σ ) Y = A X + B } ⇒ Y ∼ N ( A μ + B , A Σ A T )

2 高斯变量线性组合仍为高斯分布
X1N(μ1,σ21)X2N(μ2,σ22)}p(X1+X2)N(μ1+μ2,σ21+σ22+2ρσ1σ2)(6)

http://chatgpt.dhexx.cn/article/n2dU3DIr.shtml

相关文章

Kaplan-Meier

Kaplan-Meier 算法 Kaplan-Meier,是一种生存分析的常用方法,用于研究某一个因素对于生存时间的影响。在医学广泛使用,比如新药物是否有效的增加癌症病人的存活时间。 计算方法:假设我们已经计算出了时间t1的生存概率是0.95&#…

Kalman滤波器从原理到实现

转载请注明出处:http://xiahouzuoxin.github.io/notes Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than they. Our study of the works of the ancients enables us to give fresh life to their finer…

Kalman Filter 通俗讲解

引言 Kalman Filter,很多人刚听到这个名词时,总是会下意识认为这就是个滤波器。我这里想要重点声明的是,Kalman Filter不是滤波,它是一种信息融合的过程。 那么Kalman Filter到底是什么?它在那些方面有着应用&#xf…

卡尔曼(kalman)详解

Kalmanfliter [TOC](Kalmanfliter) kalman详解贝叶斯准则(Bayes rule)全概率定理贝叶斯卡尔曼matlab仿真 kalman详解 贝叶斯准则(Bayes rule) 全概率定理 两个随机变量 X 和 Y 的联合分布(joint distribution)如下: p (x , y) p (X x , Y y)(Xx,Yy同…

kalman简单例子——初始化参数对kalman性能的影响

此篇为第⑤篇,多目标跟踪系列文章: 基础demor入门①②;公式推导③④;深入分析初始化参数的影响⑤; ① Matlab Kalman滤波例子——小球跟踪解析 :matlab官方例子,单目标跟踪。匀速模型和匀加速模型 ②Matlab Kalman Filter based Multiple object Tracking 官方例子 多目…

卡尔曼(kalman)滤波器原理

引言:卡尔曼滤波器适用于线性高斯系统,若为非线性系统,可以使用扩展卡尔曼滤波器。 一、状态估算器 如下图,如果我们需要知道火箭发射时尾部内部的实际温度,这个温度与火箭的燃料输入有关。但是由于里面温度过高&…

Kalman详尽原理介绍合集

目录 前言 1.线性kalman(LKF) 1.1LKF原理简介 1.2 适用场合 2.扩展kalman(EKF) 2.1EKF原理简介 2.2 适用场合 2.3 使用注意事项 3.无迹kalman(UKF) 3.1UKF原理简介 3.2 UT变换 3.3 适用场合 4.粒子滤波PF 4.1 PF原理简介 4.2 适用场合 前…

对Kalman(卡尔曼)滤波器的理解

分类: 计算机视觉 转载过来的,觉得不错,原文 http://blog.csdn.net/lanbing510/article/details/8828109 1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他著名的理论(例如傅…

Kalman滤波通俗理解+实际应用

一、Kalman用于解决什么的问题? 卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。 人话&#xff1…

IDEA开发及运行第一个Android项目

IDEA自动下载SDK、Gradle,保证能访问网络。 原来eclipse能使用的sdk,配到idea报错,就换成自动下载最新的了。 之前没成功可能是我防火墙禁用了上网。 新建项目 提示安装SDK 等待下载完成 继续建项目 选择手机或平板及目标设备API版本 选择…

怎么导入别人的android项目

到期末了好多同学都问我怎么把别人的安卓项目导进自己电脑里面,今天我来统一解答一下,希望有所帮助。 1.删除项目中原有的自动构建的文件 去到要导入项目的目录下把 .idea .gradle与build 三个文件夹,*.iml,local.properties删除…

android 开源项目:

android 开源项目: https://github.com/white-cat/ThinkAndroid 转自:http://glblong.blog.51cto.com/3058613/1354953 Android开源:数据库ORM框架GreenDao学习心得及使用总结 2014-01-26 23:40:01 标签: sqllite Android 开源…

Android项目工程结构介绍

Android项目工程结构介绍 (1)gradle和.idea Android Studio自动生成的文件,打包的时候一般会删掉再进行打包 (2)app 项目的代码资源都在其中,也是我们工作的核心目录 build :编译生成文件。生…

Android项目如何真机运行?

很多初学者在刚开始写Android项目的时候,会使用Android Studio自带的模拟器去运行项目,但是自带模拟器一般占内存大(占2G都算少的);运行慢(运行一个项目要启动半天);卡顿等等&#x…

26、Android创建项目

利用 Android Studio,您可以轻松地为各种类型的设备(例如手机、平板电脑、电视和可穿戴设备)创建 Android 应用。本页介绍了如何启动新的 Android 应用项目或导入现有项目。 如果您未打开项目,Android Studio 会显示欢迎屏幕&…

创建的第一个Android项目

Package name:项目的包名,一定要具有唯一性! 静待。。。 创建模拟器 版本问题找不到具体信息,就选择这一个把。相似度比较高。紧跟着后边我也配置了安卓10(Q) 提示你的反病毒程序可能会影响你的构建性能。…

Android开源项目

阿里巴巴 项目名称功能描述freelineFreeline 是 Android 平台上的秒级编译方案,Instant Run 的替代品,也可以从 Freeline 官方主页来获取更多的信息。Freeline 由蚂蚁聚宝 Android 团队开发,它可以充分利用缓存文件,在几秒钟内迅…

Android项目框架搭建(一)

本篇先记录下当前项目中涉及的主要技术要点。也算是对所作项目的一次总结。如果这个过程能对你有些许的帮助,那可能就显得有意义点了。 一个完整的Android项目会涉及后台和前端。我们只关注于前端,也就是我们的app本身。 下面列出项目架构需要具备的技…

创建安卓项目工程

安卓项目工程 前言一创建工程的步骤newproject找到empty配置相关信息创建成功 二、项目相关的文件1.llayoyt文件这个文件位于app\src\res\layout它运行的结果是,这个APP如果在手机上运行的话,会是什么样的界面 前言 说清楚这么创建一个安卓工程 并且运行…

2.Android Studio创建安卓项目及项目结构

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 上一篇Android Studio搭建完成了,接下来我们就用Android Studio创建我们的安卓项目吧! 目录: 一、使用Android Studio 图形用户界面创建安卓工…