卡尔曼滤波器(从vchelp的算法论坛上看到的)

2023-05-16

卡尔曼滤波器 – Kalman Filter

1.    什么是卡尔曼滤波器
(What is the Kalman Filter?)

在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人!

卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯。1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位。1957年于哥伦比亚大学获得博士学位。我们现在要学习的卡尔曼滤波器,正是源于他的博士论文和1960年发表的论文《A New Approach to Linear Filtering and Prediction Problems》(线性滤波与预测问题的新方法)。如果对这编论文有兴趣,可以到这里的地址下载: http://www.cs.unc.edu/~welch/media/pdf/Kalman1960.pdf。

简单来说,卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近年来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。

2.卡尔曼滤波器的介绍
(Introduction to the Kalman Filter)

为了可以更加容易的理解卡尔曼滤波器,这里会应用形象的描述方法来讲解,而不是像大多数参考书那样罗列一大堆的数学公式和数学符号。但是,他的5条公式是其核心内容。结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式。

在介绍他的5条公式之前,先让我们来根据下面的例子一步一步的探索。

假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。假设你对你的经验不是100%的相信,可能会有上下偏差几度。我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分配(Gaussian Distribution)。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。

好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值)和温度计的值(测量值)。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。

假如我们要估算k时刻的是实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)。然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。

由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的covariance来判断。因为Kg^2=5^2/(5^2+4^2),所以Kg=0.78,我们可以估算出k时刻的实际温度值是:23+0.78*(25-23)=24.56度。可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。

现在我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.56度)的偏差。算法如下:((1-Kg)*5^2)^0.5=2.35。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。

就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!

下面就要言归正传,讨论真正工程系统上的卡尔曼。

3.    卡尔曼滤波器算法
(The Kalman Filter Algorithm)

在这一部分,我们就来描述源于Dr Kalman 的卡尔曼滤波器。下面的描述,会涉及一些基本的概念知识,包括概率(Probability),随即变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。但对于卡尔曼滤波器的详细证明,这里不能一一描述。

首先,我们先要引入一个离散控制过程的系统。该系统可用一个线性随机微分方程(Linear Stochastic Difference equation)来描述:
X(k)=A X(k-1)+B U(k)+W(k)
再加上系统的测量值:
Z(k)=H X(k)+V(k)
上两式子中,X(k)是k时刻的系统状态,U(k)是k时刻对系统的控制量。A和B是系统参数,对于多模型系统,他们为矩阵。Z(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。W(k)和V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的covariance 分别是Q,R(这里我们假设他们不随系统状态变化而变化)。

对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下面我们来用他们结合他们的covariances 来估算系统的最优化输出(类似上一节那个温度的例子)。

首先我们要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是k,根据系统的模型,可以基于系统的上一状态而预测出现在状态:
X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
式(1)中,X(k|k-1)是利用上一状态预测的结果,X(k-1|k-1)是上一状态最优的结果,U(k)为现在状态的控制量,如果没有控制量,它可以为0。

到现在为止,我们的系统结果已经更新了,可是,对应于X(k|k-1)的covariance还没更新。我们用P表示covariance:
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
式(2)中,P(k|k-1)是X(k|k-1)对应的covariance,P(k-1|k-1)是X(k-1|k-1)对应的covariance,A’表示A的转置矩阵,Q是系统过程的covariance。式子1,2就是卡尔曼滤波器5个公式当中的前两个,也就是对系统的预测。

现在我们有了现在状态的预测结果,然后我们再收集现在状态的测量值。结合预测值和测量值,我们可以得到现在状态(k)的最优化估算值X(k|k):
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
其中Kg为卡尔曼增益(Kalman Gain):
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)

到现在为止,我们已经得到了k状态下最优的估算值X(k|k)。但是为了要另卡尔曼滤波器不断的运行下去直到系统过程结束,我们还要更新k状态下X(k|k)的covariance:
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中I 为1的矩阵,对于单模型单测量,I=1。当系统进入k+1状态时,P(k|k)就是式子(2)的P(k-1|k-1)。这样,算法就可以自回归的运算下去。

卡尔曼滤波器的原理基本描述了,式子1,2,3,4和5就是他的5 个基本公式。根据这5个公式,可以很容易的实现计算机的程序。

下面,我会用程序举一个实际运行的例子。。。
4.    简单例子
(A Simple Example)

这里我们结合第二第三节,举一个非常简单的例子来说明卡尔曼滤波器的工作过程。所举的例子是进一步描述第二节的例子,而且还会配以程序模拟结果。

根据第二节的描述,把房间看成一个系统,然后对这个系统建模。当然,我们见的模型不需要非常地精确。我们所知道的这个房间的温度是跟前一时刻的温度相同的,所以A=1。没有控制量,所以U(k)=0。因此得出:
X(k|k-1)=X(k-1|k-1) ……….. (6)
式子(2)可以改成:
P(k|k-1)=P(k-1|k-1) +Q ……… (7)

因为测量的值是温度计的,跟温度直接对应,所以H=1。式子3,4,5可以改成以下:
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-X(k|k-1)) ……… (8)
Kg(k)= P(k|k-1) / (P(k|k-1) + R) ……… (9)
P(k|k)=(1-Kg(k))P(k|k-1) ……… (10)

现在我们模拟一组测量值作为输入。假设房间的真实温度为25度,我模拟了200个测量值,这些测量值的平均值为25度,但是加入了标准偏差为几度的高斯白噪声(在图中为蓝线)。

为了令卡尔曼滤波器开始工作,我们需要告诉卡尔曼两个零时刻的初始值,是X(0|0)和P(0|0)。他们的值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,X会逐渐的收敛。但是对于P,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的X(0|0)是系统最优的,从而使算法不能收敛。我选了X(0|0)=1度,P(0|0)=10。

该系统的真实温度为25度,图中用黑线表示。图中红线是卡尔曼滤波器输出的最优化结果(该结果在算法中设置了Q=1e-6,R=1e-1)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卡尔曼滤波器(从vchelp的算法论坛上看到的) 的相关文章

  • C#中调用PDFCreator生成PDF文件

    前一阵子做了一个生成报表的小project xff0c 生成的报表是关于股价的记录 没有什么现成的包和第三方程序给我们用 xff0c 听说WPF渲染的页面可以之间存成PDF xff0c 不过只是道听途说 xff0c 没敢真正实践 xff0c
  • 一个简单的审批流程模型

    最近在做一个审批流程的模块用来支持对一些事务的审批 基本的业务要求如下 xff1a 1 模型需要支持两级审批 xff0c 在这里我们定义为有一半权限的B Approver xff0c 和有更高权限的C Approver xff1b 2 每一
  • node.js连接Sql Server数据库

    最近对node js比较感兴趣 xff0c 网上的例子大多都是node js集成MongoDB 我对MongoDB实在不是太感冒 xff0c 并不是因为它有什么不好听 xff0c 只是在工作上的确是很难遇到 在工作上还是和Sql Serve
  • StringEscapeUtils 工具特殊字符转码,防止xss攻击

    一 xss攻击简介 XSS 即 xff08 Cross Site Scripting xff09 中文名称为 xff1a 跨站脚本攻击 XSS的重点不在于跨站点 xff0c 而在于脚本的执行 那么XSS的原理是 xff1a 恶意攻击者在we
  • CMake file命令参数GLOB和GLOB_RECURSE

    命令 file GLOB variable RELATIVE path globbing expressions file GLOB RECURSE variable RELATIVE path FOLLOW SYMLINKS globbi
  • Sphinx使用说明

    link https blog csdn net sinat 29957455 article details 83657029 1 安装插件 xff1a pip3 install sphinx pip3 install sphinx rt
  • ubuntu16.04下vim的安装与配置(出错的解决方案)

    一般来说 xff0c 在终端中输入 sudo apt span class token operator span get upgrade sudo apt span class token operator span get instal
  • K8S部署Prometheus

    前言 xff1a zabbix与prometheus的区别 和Zabbix类似 xff0c Prometheus也是一个近年比较火的开源监控框架 xff0c 和Zabbix不同之处在于Prometheus相对更灵活点 xff0c 模块间比较
  • LINUX 下进行UDP收发的C代码

    include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt string h gt include lt sys socket
  • VINS-Mono详解(一)

    文章目录 VINS Mono前端概述入口函数main 回调函数img callback 发布频率控制特征点提取与光流跟踪单目处理逻辑双目处理逻辑 FeatureTracker readImage 函数更新特征点id VINS Mono前端概
  • 在windows下使用putty连接虚拟中的linux出现主机拒绝的问题(已解决)

    一 首先windows的ip地址段必须和linux的ip地址段相同 xff0c 具体方法百度 xff0c Google下 二 linux的ssh服务必须安装 xff0c 打开 xff0c 具体指令如下 安装指令应该是 代码 sudo apt
  • 程序员读书的五重天

    第八天 xff0c 上帝说要有书 xff0c 于是人类文明摆脱了靠遗传来传承的窘境 所以对于读书好处 xff0c 基本上从古至今都是被人所认同的 其中最为精妙的莫过于宋真宗所言 xff1a 富家不用买良田 xff0c 书中自有千钟粟 xff
  • HTML5初体验——蛮神奇的

    记得去年在一个公司实习的时候 xff0c 听当时的领导说起过HTML5 xff0c 当时就大体了解了一下 知道了是新的下一代HTML的新标准 xff0c 去掉了HTML4中的一些标签 xff0c 扩展了一些标签内容 其他的就没有继续深入的去
  • Aruco码估计相机位姿初步

    Abstract xff1a 利用aruco库中的相关函数实现在摄像头下aruco码的识别和在指定地方插入视频 Criticize xff1a 一 xff1a OpenCV实现USB摄像头的打开 并且实现USB摄像头参数调节 我们调用ope
  • 【笔记】Protues仿真STM32的实现过程

    测试环境 xff1a protues8 6 问题 xff1a 搭建好基本电路 xff0c 在仿真时候出错 xff0c 提示没VSS和VDD未连接 xff0c 如下如图 提示错误 解决办法 xff1a 选择 Design gt Configu
  • 年度回忆录(2013.01----2013.12)

    看了一下上次的年度总结是从 2013 年 2 月份开始的 xff0c 按照以往的习惯 xff0c 年度回忆录是半年一写的 xff0c 这次居然破例了 xff01 由于工作的原因吧 xff08 这是找借口的节奏么 xff09 xff0c 没有
  • 使用JMF实现音乐播放(java多媒体编程)

    JMF实际上是Java的一个类包 JMF 2 1 1技术提供了先进的媒体处理能力 xff0c 从而扩展了 Java平台 的功能 这些功能包括 xff1a 媒体捕获 压缩 流转 回放 xff0c 以及对各种主要媒体形式和编码的支 持 xff0
  • Pygame下载和安装

    Pygame 的下载非常简单 xff0c 可分为两种方式 xff1a 一是通过 Python 的包管理器 pip 来安装 xff1b 二是下载二进制安装包进行安装 其中使用 pip 包管理器安装是最简单 最轻量级的方法 xff0c 下面以
  • 物联网毕业设计 stm32四轴飞行器设计与实现

    1 简介 Hi xff0c 大家好 xff0c 今天向大家介绍一个学长做的单片机项目 基于stm32的四轴飞行器设计 大家可用于 课程设计 或 毕业设计 这次尝试制作一个四旋翼飞控的过程 这个飞控是基于STM32 xff0c 整合了MPU6
  • 机器学习(周志华)学习笔记八:集成学习(上)

    一 AdaBoost思想 三个臭皮匠 xff0c 顶个诸葛亮 xff0c 这也正是集成学习的目的 为了达到上述目的 xff0c AdaBoost算法有两个核心思想 1 更加关注之前基学习器做错的样本 xff1b 2 降低错误率较高的基学习器

随机推荐

  • opencv在编译报错的汇总

    Q1 xuy 64 xuy 桌面 opencv test make usr bin cmake home xuy anaconda2 lib libcurl so 4 no version information available req
  • 至简设计系列_闹钟

    作者 xff1a 小黑同学 本文为明德扬原创及录用文章 xff0c 转载请注明出处 xff01 1 1 1 概述 数字时钟是采用数字电路技术实现时 分 秒计时显示的装置 xff0c 可以用数字同时显示时 xff0c 分 xff0c 秒的精确
  • 遥控器对码与飞控解锁

    今天开始DIY 四旋翼 xff0c 购买了 mwc 飞控和天地飞六代遥控器 xff0c 装好电机电调后 xff0c 想试一下遥控控制电机 首先是遥控发射器与接收器的对码 将电调连上电机后 xff0c 单独把电调的杜邦线插口查到接收器油门插槽
  • Git保存论文

    多图预警 多图预警 多图预警 多图预警 操作步骤 下载git for windows客户端安装TortoiseGit使用Git删除文件夹再试一遍 下载git for windows客户端 下载地址 http msysgit github i
  • Git小乌龟分支操作

    分支的创建 选择创建分支 这里填上分支名字 切换到新分支可点可不点 选中的话直接就切换到新分支 不点的话进行下一步选择切换 检出 选择要切换的分支 分支就创建完成 接下来是分支的合并 分支的合并 首先 确认当前的分支为发起合并方 个人理解
  • 零星PCB打板|开源广场|每月2张|等你来撸|保姆级教程:嘉立创免费PCB打样获取攻略

    目录 缘由 软件 xff1a 嘉立创EDA专业版 xff08 视情况下载 xff0c 非必需 xff09 软件 xff1a 嘉立创PC端下单助手 xff08 领优惠券 xff09 优惠券在这里 xff1a 嘉立创PCB免费打样新规则解读 6
  • Linux下利用GDB调试快速找到Bug

    调试程序最让人头疼的就是层出不断的Bug xff0c 而且有些Bug不容易定位 xff0c 下面介绍一种很强大的调试工具 xff1a GDB 虽然之前听过GDB调试 xff0c 但是自己调试时一直没使用过 今天在调试highmac程序时 x
  • 无状态会话bean(1)---定义

    无状态会话bean 用于完成在单个方法的生命周期内的操作 无状态bean 可以实现许多业务操作 xff0c 但是每个方法都不能假定任何其他的方法会在它之前调用 后半句的意思是现在的你可能不是刚才的你 xff0c 明天的你可也能不是今天的你
  • 树莓派(Raspberry Pi),如何在命令行下配置查看WIFI无线网络

    通常 xff0c 我们的wifi路由器都是开启了DHCP自动分配 ip地址的功能的 xff0c 本文是以这个为前提 xff0c 如果你的WIFI路由器没有开启DHCP xff0c 则在本文的基础上 xff0c 还需要给WLAN0口配置静态I
  • ubuntu虚拟机网络配置同时连接WIFI上外网和连接以太网与ARM开发板通信

    在学习ARM嵌入式开发过程中 xff0c 需要在ubuntu虚拟机下进行程序开发和编译 xff0c 一般需要使用网线直连ARM开发板 xff0c 或挂载NFS网络文件系统 xff0c 或 通过SSH TFTP等网络协议传输在PC端编译完的二
  • Systemd 服务管理教程

    Systemd 概述 Systemd 简介 Systemd 是一系列工具的集合 xff0c 其作用也远远不仅是启动操作系统 xff0c 它还接管了后台服务 结束 状态查询 xff0c 以及日志归档 设备管理 电源管理 定时任务等许多职责 x
  • 高版本Matlab运行时//在当前文件夹或MATLAB路径中未找到文件//函数或变量 ‘xx‘ 无法识别//解决方法

    当你用2019以上版本Matlab时 xff0c 可能会发现这样一个问题 xff1a 当你默默选择 更改文件夹 或者 添加到路径 后 xff0c Matlab又会输出 函数或变量 xx 无法识别 类似这样 xff1a 总之不会乖乖出现运行结
  • 美团技术十年:让我们感动的那些人那些事

    时光荏苒 xff0c 美团十岁了 xff0c 美团技术团队也走过了十个春秋 2010年3月4日美团网上线的时候 xff0c 整个公司总共十来人 xff0c 在一套三居室的民房里起步 其中技术团队只有5个人 xff0c 现在有4位还在美团 今
  • 如何在Windows上轻松安全的将数据从HDD迁移到SSD?

    当你打算升级硬盘时 xff0c 如何将数据从HDD迁移到SSD xff1f 你可以使用一款免费的软件将所有数据从一个硬盘克隆到另一个硬盘 为什么要将数据从HDD迁移到SSD xff1f HDD xff08 机械硬盘 xff09 和SSD x
  • Ubuntu 16.04安装Python3.8

    bin sh install software properties common sudo apt install software properties common install PPA sudo add apt repositor
  • error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 解决方法

    错误原因 xff0c Debug工程引用了Release版本的库文件 解决方法
  • 关于wince OS开发面试问题的总结系列之Bootloader

    参考资料 xff1a 1 Windows CE 工程事件完全解析 by xff1a 李大为 2 Windos CE 实用开发技术 by xff1a 张冬泉 等 3 Windows Embedded CE 6 0 Fundamentals 4
  • Jacobian矩阵和Hessian矩阵

    1 Jacobian 转载自 xff1a http jacoxu com p 61 146 在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a
  • 打工与乘公交

    去一个公司打工就如同上了一辆公交车 在上车之前 xff0c 你应该清楚自己打算去哪里 xff0c 打算在哪里下车 有的公交车很豪华 xff0c 有的很破烂 xff0c 但是这并不是重点 xff0c 所有能开到目的地的车都是好车 上了车之后
  • 卡尔曼滤波器(从vchelp的算法论坛上看到的)

    卡尔曼滤波器 Kalman Filter 1 xff0e 什么是卡尔曼滤波器 xff08 What is the Kalman Filter xff09 在学习卡尔曼滤波器之前 xff0c 首先看看为什么叫 卡尔曼 跟其他著名的理论 xff