Kalman Filter 通俗讲解

article/2025/10/5 22:15:22

引言

Kalman Filter,很多人刚听到这个名词时,总是会下意识认为这就是个滤波器。我这里想要重点声明的是,Kalman Filter不是滤波,它是一种信息融合的过程。
那么Kalman Filter到底是什么?它在那些方面有着应用,它的基本原理又是什么。如果你参考国内的论坛或者教材上,你一定会发现,大部分都是一些复杂公式与枯燥抽象的说明。这里我们将通过尽量通俗易懂的讲解来给大家解释下什么叫Kalman Fiter。

先睹为快

正如我前面提到的,从定义及复杂公式去理解卡尔曼滤波,对咱们凡人来说基本是不可能的。我们将公式简化,先从下面的公式来开始讲解:

这里写图片描述
其中下标 k k k是指状态,这里我们可以把它看成间隔,比如 k = 1 k=1 k=1指1ms, k = 2 k=2 k=2指2ms。我们的目的就是要找到在状态 k k k X X X的估计。在公式中 Z k Z_k Zk就是真实测量值。我们要牢记,这些测量值并不可靠。(如果这些测量值是可靠的,那么我们就没必要学kalman filter了:))。 K k K_k Kk指卡尔曼增益(这是整个公式中的核心点)。 X k − 1 ^ \hat{X_{k-1}} Xk1^就是上一状态时的估计。
在上述公式中,我们唯一未知的量就是卡尔曼增益 K k K_k Kk。像测量值及上一状态估计,我们都已经知道了。当然了,求出卡尔曼增益并不简单,但是我们有方法来解决它。
我们从另一角度来思考,让我们假设卡尔曼增益为0.5,我们会得到什么呢?它就是个简单的平均!换句话说,我们应该找到对应于每个状态的更加智能化的卡尔曼增益系数。归根结底就是:

卡尔曼滤波器为每个结果状态找到最优的平均因子。 不知怎的,还记得一些关于过去的状态。

如何,Kalman Filter神奇吧!

分步指南

下面是分布指南,可以快速开始卡尔曼滤波。

Step1 构建模型

这是最重要的步骤。首先,你必须确保卡尔曼滤波的条件符合你的问题。
我们还记得卡尔曼滤波的两个典型方程(wiki):
x k = A x k − 1 + B u k + W k − 1 x_k = Ax_{k-1}+Bu_k+W_{k-1} xk=Axk1+Buk+Wk1
z k = H x k + v k z_k = Hx_k+v_k zk=Hxk+vk

第一个公式意味着每个 x k x_k xk可以通过一个线性随机方程来表示。任何一个 x k x_k xk都是它前一状态的的只加上控制信号 u k u_k uk及处理噪声 W k − 1 W_{k-1} Wk1的线性组合。大多数的情况下,并不需要控制信号 u k u_k uk

第二个公式告诉我们,任何测量值(这里我们并不确定它是否准确)是当前状态信号值及测量噪声的线性组合,我们默认该值服从高斯分布。

这两个公式中的处理噪声及测量噪声,我们都认为是统计独立的。

方程式中的系数 A , B A,B A,B H H H是一般形式的矩阵。但是在大多数的信号处理问题中,我们使用的模型中,这些系数都仅仅是数值。而且当这些值在状态间发生变化时,大多数的情况下,我们可以假设它们就是常数。

如果我们确定我们的系统符合这个模型(大多数的系统都是符合的),那么接下来,就只剩下估计噪声函数 W k − 1 W_{k-1} Wk1 v k v_k vk的均值和标准差。我们知道在现实生活中,没有哪个信号是纯高斯分布的,但是我们可以通过近似来进行假设。

这不是一个大问题,因为我们将看到卡尔曼滤波算法试图收敛到正确的估计,即使高斯噪声参数估计很差。

这里我们要始终牢记于心的是:“你估计噪声参数越准确,你就能获得更好的估计”

Step2 开始处理

如果你成功的将你的模型拟合到卡尔曼滤波器中,那么接下来的步骤就是决定必要的参数及你的初始值。

我们有两个不同的方程集合:时间更新(预测)及测量更新(校准)。两个方程集合都是应用在第 k k k个状态

这里写图片描述
我们在步骤一中建立模型,因此我们知道矩阵A,B和H。很可能,他们都是数值常量。并且他们极可能都是数值1.

我建议你们重新写下这些公式,并看看如何去简化这些公式。
.
上述公式中最痛苦的事儿就是确定R和Q了。R还相对比较容易找出,因为,通常来讲,我们对环境中的噪声还是比较确定的。但是寻找Q就并不明显了。在这个阶段,我们并不能给你一个指定的方法。

为了开始这个处理,我么需要知道 x 0 x_0 x0 P 0 P_0 P0的估计

Step3 迭代

在我们收集了我们需要的所有信息后,我们开始处理流程,现在我们可迭代估计。我们要牢记上一状态的估计将成为当前状态的估计的输入。
这里写图片描述
这里,先验估计指测量更新校准前的粗略估计。这里我们使用在测量更新公式中的先验值

在测量更新公式中,我们找到了在状态k时x的估计。并且找到了为了状态k+1估计所需要的值。

我们计算的卡尔曼增益,在下一个迭代步骤中并不需要。 这是一组方程中隐藏的,神秘的,最重要的部分。

我们在测量更新阶段评估的值也称为后验值。这也是说得通的。

一个简单的例子

如果小伙伴们在看到这里还有点稀里糊涂的,那么接下来我们找个例子来加深下理解。

现在,让我们努力去估计一个标量随机常数,例如来自某个信号源的“电压读数”。假设它有一个恒定的a V电压,但是我们读数会不准确,可能会读高了,也有可能读低了。我们假设测量噪声的的标准差为0.1 V。

现在我们来构建我们的模型:
这里写图片描述

就像我之前说的,我们可以把方程简化成非常简单的形式。

  • 首先,我们有一个一维的信号的问题,因此我们模型中的每个系数都是数值,而不是矩阵。
  • 我们并没有控制信号 u k u_k uk
  • 因为信号是一个常数,那么常数A就是1,因为我们已经知道下一个值等于先前的值。我们很幸运,在这个例子中我们有一个恒定的值,但是即使它具有其他任何线性性质,我们都可以将它假设成1.
  • 值H=1,因为我们知道测量值是由状态值和一些噪声组成的。你很少会遇到现实生活中,H与1不相同的情况

最后,我们假设我们得到了下面的测量值

TIME (ms)12345678910
VALUE (V)0.390.500.480.290.250.320.340.480.410.45
我们应该从某处开始,比如说k=0。我们应该找到或者假设某个初始状态。这里我们给出了一些初始值。我们假设$X_0=0$并且$P_0=1$,那么为什么我们不选择$P_0=0$呢?这很简单。如果我们这样选择,那么就意味着环境中不存在噪声,而这个假设将导致在k状态下X的所有结果估计值为0(保留初始状态),所以我们一般不取$P_0=0$ 我们来写时间更新和测量更新方程 ![这里写图片描述](https://img-blog.csdn.net/20180603164207725?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NjUyMTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

每一轮计算的步骤:
这里写图片描述


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

相关文章

卡尔曼(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 图形用户界面创建安卓工…

Android项目结构

Android项目结构 新建个空的安卓项目,打开,切换到project模式: 一、工程结构 1/ .gradle和.idea 这两个目录下都是AS自动生成的,无须关心,也不要手动编辑。 2/ app 项目中的代码、资源等几乎都在这里,…

Android项目工程目录简介

主工程目录: 一、.gradle 此文件夹是构建工具 Gradle 的配置文件夹,也会存储一些项目的构建缓存信息,在首次build项目时,会根据配置文件去下载这些文件,此文件夹是自动生成的文件夹,我们无需关心里面的内容…

Android创建项目

目录 创建Android项目 配置项目结构 创建安卓模拟器 模拟器运行 HelloWorld 应用 真机运行 HelloWorld 应用 创建Android项目 打开 Android studio 工具,选择Project,选择 New Project 由于现在是教程博客,所以我们随便选择 一个 空 Ac…