【SLAM】卡尔曼滤波(Kalman Filter)

2023-11-08

卡尔曼滤波(Kalman filter)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。


卡尔曼滤波器的原理解释如下:
首先,我们先要引入一个离散控制过程的系统。该系统可用一个线性随机微分方程(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)
推导过程:
e(k|k-1)=X(k)-X(k|k-1)=A( x(k)-x(k-1|k-1) ) + W(k)
P(k|k-1)=E{ ( X(k) - X(k|k-1) ) ( X(k) - X(k|k-1) )’}
=E{ ( AX(k-1)+BU(k)+W(k)-AX(k-1|k-1)-BU(k) ) ( AX(k-1) + BU(k) + W(k) - AX(k-1|k-1) - BU(k) )’}
=E{ ( A( X(k-1) - X(k-1|k-1) ) + W(k) ) ( A( X(k-1) - X(k-1|k-1) )+W(k) )’}
=E{ A( X(k-1) - X(k-1|k-1) ) ( X(k-1)-X(k-1|k-1) )’A’+ W(k)W(k)’}
=A E{ ( X(k-1) - X(k-1|k-1) ) ( X(k-1) - X(k-1|k-1) )’} A’+ E{ W(k)W(k)’}
=A P(k-1|k-1) A’+ Q
备注:因W与X及其估计值无关,所以相乘项略去。

式(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)。这样,算法就可以自回归的运算下去。
公式(4)(5)推导:
令e(k|k)=X(k)-X(k|k)
代入(1)(3)式和Z(k)的表达式,得e(k)=( I - Kg(k)H )e(k|k-1)-Kg(k)V(k)
P(k|k)=E{ e(k|k) e(k|k)’}
=( I-Kg(k)H ) P(k|k-1) (I-Kg(k)H)’+Kg(k)RKg(k)’
P(k|k)对Kg(k)求微分使得并使求微分后的方程等于0,即此时的Kg(k)可使P(k|k)=0,得:
Kg(k)=P(k|k-1) H’/ (H P(k|k-1) H’+ R)
从而也得到(5)式。

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

*以上内容部分节选自http://blog.chinaunix.net/uid-26694208-id-3184442.html


一个小例子
假设我们有能力测量电源的电压值,但是这个测量被0.1伏RMS白噪声(例如我们的模数转换器不是很准确)损坏。 下面是真实电压和测量电压的图表。
这里写图片描述
并有如下假设
A = 1; % the state does not change
B = 0; % there is no control input
H = 1; % our voltage measurement, zk, is of the state directly
Q = 0.00001; % let’s assume a small process variance
R = 0.01;
x(1) = 0;
p(1) = 1; % if we’re certain about xhat(1)=0 then P(1)=0
其中,x初始值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,x会逐渐的收敛。但是对于p,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的x(0|0)是系统最优的,从而使算法不能收敛。

由此我们可以简化上一节中的五个方程。
X(k|k-1)=X(k-1|k-1) ……….. (6)
P(k|k-1)=P(k-1|k-1) +Q ……… (7)
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)

以下是此例子的卡尔曼滤波matlab程序:

%-------------------------------------------------------------------------
% DESC: Simulation of measured voltage measurements with 0.1 volt RMS white 
%       noise (actual voltage should be -0.37727 volts).
% The Kalman filter is used to estimate the optimal voltage value.
%-------------------------------------------------------------------------

clear all; clc;

N=50; 
x(1)=0;  %初始估计状态
p(1)=1;  %初始估计协方差
Q=10^-6;  %过程噪声的协方差
R=10^-2;  %观测噪声的协方差
t=1:N; 

%---------------------NOISY MEASUREMENT-----------------------------------
voltage = [-0.46687,-0.36375,-0.39117,-0.49361,-0.2589,-0.37881,-0.32365,...
    -0.44891,-0.44283,-0.34583,-0.36659,-0.19245,-0.40478,-0.15601,-0.22642,...
    -0.57178,-0.54532,-0.43462,-0.39585,-0.37638,-0.29358,-0.4495,-0.44942,...
    -0.39739,-0.37932,-0.34938,-0.27144,-0.3151,-0.55233,-0.30754,-0.29612,...
    -0.31364,-0.24626,-0.34456,-0.44457,-0.3922,-0.62217,-0.32994,-0.36558,...
    -0.43638,-0.44274,-0.48534,-0.38204,-0.33934,-0.41031,-0.42726,-0.38087,...
    -0.39475,-0.473,-0.24802;];
%-------------------------------------------------------------------------

for i=2:N 
    y(i)=x(i-1); %预测的状态
    p1(i)=p(i-1)+Q; %预测的协方差
    kg(i)=p1(i)/(p1(i)+R); %卡尔曼增益
    x(i)=y(i)+kg(i)*(voltage(i)-y(i)); %更新的状态
    p(i)=(1-kg(i))*p1(i); %更新的协方差 
end 

plot(t,x,'r');
hold on 
plot([0 50],[-0.37727 -0.37727],'k');
plot(voltage,'-b');
axis([0 50 -0.7 0]);
xlabel('time');
ylabel('voltage');

优化结果如下图所示
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SLAM】卡尔曼滤波(Kalman Filter) 的相关文章

  • C++ 简单工厂模式

    文章目录 介绍 场景分析 二 代码展示 简单工厂的优点和缺点 优点 缺点 总结 介绍 简单工厂模式是属于创建型模式 工厂模式 抽象工厂模式 单例模式 建造者模式 又称之为静态工厂模式 它不属于23中设计模式之一 在简单工厂中可以根据参数的不

随机推荐

  • Python SSH 的远程连接并执行命令和下载文件 - 千月的python linux 系统管理指南学习笔记(23)

    在运维工作中 我们经常使用 ssh 工具远程登陆主机来执行命令 对系统进行维护 在python的自动化运维中 要执行系统命令 最方便的还是借助于 python 的 ssh 功能编写日常脚本 简化工作 下面我们说下这个工具 import pa
  • 使用NLP预测电影类型 - 多标签分类

    Introduction 上周 我对这篇关于构建多标签图像分类模型的精彩文章很感兴趣 我的数据科学家开始探索将这个想法转化为自然语言处理 NLP 问题的可能性 那篇文章展示了计算机视觉技术来预测电影的类型 所以我必须找到一种方法将该问题陈述
  • podman容器启动脚本

    Podman是一个无守护进程的容器引擎 用于在Linux系统上开发 管理和运行OCI容器 与Docker不同 Podman可以在无 root 模式下运行 安装 sudo apt install podman 或者 sudo yum inst
  • vue框架采用的模式:MVVM模式

    Vue 框架采用的模式是MVVM模式 响应式布局 MVVM模式 Model View ViewModel 与MVC模式相比 不再局限于数据单向绑定 而是能够实现数据双向绑定 同步刷新 原理 View层和Model层是通过ViewModel层
  • 【电路设计】肌电信号采集电路分析

    最近在开发肌电信号的采集 表面肌电信号是非常微弱的生物信号 正常人体表面肌电信号赋值为0 1 5mV 主要能量频段集中在10 150Hz 电路主要是根据原始信号 设计相应的放大电路 滤波电路 详细可以看这个链接
  • JAVA消息(第一篇)JMS 很重要!!!!包教包会!!不闹!!!下一篇-AMQP(wire-level protocol)

    如果看完 进入第二篇AMQP 首先大致讲一下 java 消息模块 消息 个人理解分为两种 1 同步消息 RPC调用 2 异步消息 本篇讲解部分 一 同步消息java提供了多种方案 最新比较常用的方式就是spring Http invoker
  • 关于vue使用recorder.js录音功能

    关于vue使用recorder js录音功能 1 引入外部js文件 import HZRecorder from utils HZRecorder js js文件内容 export function HZRecorder stream co
  • 资源变现小程序开通微信官方小商店教程

    前提条件非个人注册的小程序 登录小程序的微信公众后台 点击左侧菜单设置 gt 基本信息下面的 gt 服务类目 点击服务类目详情 点击添加类目 商家自营 gt 家用电器 添加好后 刷新浏览器 这个时候左侧菜单会看到交易组件 点击交易组件会看到
  • idea-代码格式化快捷键设置

    idea默认格式化快捷键是 Ctrl Alt L 有时会因其它软件快捷键的冲突导致失灵 设置方法如下 1 File gt Settings 2 Keymap gt Code 3 Code gt Reformat Code 4 右击Refor
  • openGL之API学习(七十四)opengl版本的历史沿革

    OpenGL源于SGI公司为其图形工作站开发的IRIS GL 在跨平台移植过程中发展成为OpenGL SGI在1992年7月发布1 0版 后成为工业标准 由成立于1992年的独立财团OpenGL Architecture Review Bo
  • rust换源

    在 HOME cargo 目录下建一个config文件 windows默认是C Users user name cargo config文件输入 source crates io registry https github com rust
  • 算法(二)

    目录 0 前言 1 海明码的使用 2 理解海明码需要明白的知识 a 奇偶校检法 b 异或运算 3 海明码的原理 a 海明码原理的概述 b 多个校检位的设计 c 校检位个数的计算 d 海明码的总结 4 举例 a 计算校检码的个数 b 计算每一
  • Unity编辑器 - 使用GL绘制控件

    Unity编辑器 使用GL绘制控件 控件较为复杂时 可能造成界面卡顿 在EditorGUI中也可以灵活使用GL绘制来提升性能 以绘制线段为例 using UnityEngine using UnityEditor public class
  • 【数据结构】树的基础知识及三种存储结构

    个人主页 阿然成长日记 点击可跳转 个人专栏 数据结构与算法 C语言进阶 不能则学 不知则问 耻于问人 决无长进 文章目录 一 树的概念与定义 二 树的有关名词 三 树的存储结构 1 双亲表示法 2 孩子表示法 3 孩子兄弟表示法 又叫二叉
  • c语言6种内部排序,数据结构6种内部排序算法的比较

    1 需求分析 1 输入数据的形式为 伪随机数产生程序产生 且每次输入数不少于100个 至少要用5组不同的输入数据 2 输出的形式为 输出关键字参加的比较次数和关键字的移动次数 关键字交换计为3次移动 的数据 3 程序能达到的功能 对起泡排序
  • docker 简单安装 redis

    1 redis的简单安装 1 1 docker 寻找 redis镜像 docker search redis 1 2 docker 拉取 redis镜像 docker pull redis 1 3 运行创建Redis 1 4 进入容器 1
  • SQL留存率问题

    什么是留存率 留存率 retention rate 通常用来衡量用户或客户的忠诚度和粘性 留存率指的是在特定时间段内 有多少人保持了对某个产品 服务 平台或应用程序的使用并继续付费或进行其他有价值的操作 通常情况下 留存率会作为一个百分比表
  • redis 连接数据库_如何连接到Redis数据库

    redis 连接数据库 介绍 Introduction Redis is an open source in memory key value data store Whether you ve installed Redis locall
  • Adblock Plus 下载

    作用 下载人数 全球超过5000万人都在使用adblock plus 这个chrome插件完全免费 能够屏蔽整个互联网广告的插件你见过吗 那就是Adblock Plus Adblock Plus牛在哪里 在谷歌开发者商店里面有4000万以上
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要