卡尔曼滤波的理解以及参数调整

2023-05-16

一、前言

卡尔曼滤波器是一种最优线性状态估计方法(等价于“在最小均方误差准则下的最佳线性滤波器”),所谓状态估计就是通过数学方法寻求与观测数据最佳拟合的状态向量。

在移动机器人导航方面,卡尔曼滤波是最常用的状态估计方法。直观上来讲,卡尔曼滤波器在这里起了数据融合的作用,只需要输入当前的测量值(多个传感器数据)和上一个周期的估计值就能估计当前的状态,这个估计出来的当前状态综合考量了传感器数据(即所谓的观察值、测量值)和上一状态的数据,为当前最优估计,可以认为这个估计出来的值是最可靠的值。由于我们在SLAM中主要用它做位置估计,所以前面所谓的估计值就是估计位置坐标了,而输入的传感器数据包括码盘推算的位置、陀螺仪的角速度等(当然可以有多个陀螺仪和码盘),最后输出的最优估计用来作为机器人的当前位置被导航算法以外的其他程序所调用。

列举一下卡尔曼滤波的优点:采用递归方法解决线性滤波问题,只需要当前的测量值和前一个采样周期的估计值就能够进行状态估计,不需要大量的存储空间,每一步的计算量小,计算步骤清晰,非常适合计算机处理。

二、问题描述与定义

1、前提

首先明确卡尔曼滤波器的前提假设:

  • 信息过程的足够精确的模型,是由白噪声所激发的线性、离散和有限维动态系统(可以是时变的);
  • 每次测量信号都包含着附加的白噪声分量。

满足上述条件就可以使用卡尔曼滤波器。

2、问题描述

定义一个随机离散时间过程的状态向量 ,该过程用一个离散随机差分方程描述:

xk=Axk1+Buk1+wk1

其中n维向量 xk 为k时刻的系统状态变量,n维向量 xk1 是k-1时刻的系统状态变量。A是状态转移矩阵或者过程增益矩阵,是 n×n 阶方阵,它将k-1时刻状态和当前的k时刻状态联系起来。B是可选的控制输入 uRl 的增益,在大多数实际情况下并没有控制增益,所以 Buk1 这一项很愉快的变成零了。 wk1 是n维向量,代表过程激励噪声,它对应了 xk 中每个分量的噪声,是期望为0,协方差为Q的高斯白噪声, wk ~ N(0,Q)
再定义一个观测变量 ,得到观测方程:
zk=Hxk+vk

其中观测值 zk 是m阶向量,状态变量 xk 是n阶向量。H是 m×n 阶矩阵,代表状态变量 xk 对测量变量 zk 的增益。观测噪声 vk 是期望为0,协方差为R的高斯白噪声, vk ~ N(0,R)

3、举例

如果对上面两个公式不太明白,我举一个例子说明:
在目标跟踪的应用中,假设质点坐标为 (x,y) 是直接观测得到的,质点在x、y轴方向速度分别为 vx vy ,那么系统状态变量 xk=(x,y,vx,vy)T ,系统观测变量 zk=(x¯,y¯)T ,系统没有控制输入,所以状态方程就成了:

xk=Axk1+wk1

它的状态转移矩阵A根据运动学公式确定:
A=10000100Δt0100Δt01

其实用矩阵的形式写开上面的方程就很好理解了:
xk=Axk1+wk1xyvxvyk=10000100Δt0100Δt01xyvxvyk1+wk1=x+Δtvxy+Δtvyvxvyk1+wk1

  • 这里简要说一下状态转移矩阵A的确定:
    (1) 在标量卡尔曼滤波中,比如测量值是温度、湿度,一般认为下一个时刻该温度或者湿度维持不变,这种情况下状态转移矩阵通常就是标量1。
    (2) 在导航和目标跟踪中卡尔曼滤波常被用来做位置估计,比如匀速直线运动(CV)和匀加速直线运动(CA):
    ACV=100T10001,ACA=100T10T22T1

    在前面的举例中x,y方向上的运动就被微分近似为匀速直线运动。
    (3) 若被估计的过程或观测变量与过程的关系是非线性的,此时不能够直接应用卡尔曼滤波(因为不满足上一节提到的卡尔曼滤波适用的前提必须是线性系统),这个时候扩展卡尔曼滤波(EKF)应运而生,它用雅克比矩阵将期望和方差线性化,从而将卡尔曼滤波扩展到非线性系统,但是EKF由于考虑了泰勒级数的展开,运算量大大增加。

该过程的观测方程为

zk=Hxk+vk

它的观测矩阵H也是要指定的,它的目的是将m维的测量值转换到n维与状态变量相对应,由于直接观测的量是位置 zk=(x¯,y¯)T ,我们只需要取状态变量的前两个元素就够了,所以H设计成如下:
H=[10010000]

用矩阵形式写开就是
zk=Hxk+vk[x¯y¯]k=[10010000]xyvxvy+vk=[xy]k+vk

  • 我再举一个简单例子:
    一个运动目标的状态变量 xk=(x(k),x˙(k),x¨(k))T ,其中第一项是目标在k时刻的位置,这里假设为一维坐标,第二项为k时刻的速度,第三项为k时刻的加速度,雷达仅能观测到目标的位置即 x(k) ,那么它的状态转移矩阵就该设计成:
    A=100Δt10Δt22Δt1

    它的观测矩阵就该设计成:
    H=[100]

    到了这里怎么设计矩阵A和H应该有思路了吧。

三、算法流程

接下来就开始介绍卡尔曼滤波最核心的五个更新方程了

1、预测:

x^k¯=Ax^k1+Buk1

P^k¯=AP^k1AT+Q

2、更新:

x^k=x^k¯+Kk(zkHx^k¯)

Kk=P^k¯HTHP^k¯HT+R

P^k=(IKkH)P^k¯

先来解释一下公式中各个变量的含义:
x^k¯ :表示k时刻先验状态估计值,这是算法根据前次迭代结果(就是上一次循环的后验估计值)做出的不可靠估计。

x^k x^k1 :分别表示k时刻、k-1时刻后验状态估计值,也就是要输出的该时刻最优估计值,这个值是卡尔曼滤波的结果。

A :表示状态转移矩阵,是n×n 阶方阵,它是算法对状态变量进行预测的依据,状态转移矩阵如果不符合目标模型有可能导致滤波发散,它的确定请参看第二节中的举例。

B :表示可选的控制输入 uRl的增益,在大多数实际情况下并没有控制增益。

uk1 :表示k-1时刻的控制增益,一般没有这个变量,可以设为0。

P^k¯ :表示k时刻的先验估计协方差,这个协方差矩阵只要确定了一开始的 P^0 ,后面都可以递推出来,而且初始协方差矩阵 P^0 只要不是为0,它的取值对滤波效果影响很小,都能很快收敛。

P^k P^k1 :分别表示k时刻、k-1时刻的后验估计协方差,是滤波结果之一。

Q :表示过程激励噪声的协方差,它是状态转移矩阵与实际过程之间的误差。这个矩阵是卡尔曼滤波中比较难确定的一个量,一般有两种思路:一是在某些稳定的过程可以假定它是固定的矩阵,通过寻找最优的Q值使滤波器获得更好的性能,这是调整滤波器参数的主要手段,Q一般是对角阵,且对角线上的值很小,便于快速收敛;二是在自适应卡尔曼滤波(AKF)中Q矩阵是随时间变化的。

Kk:表示卡尔曼增益,是滤波的中间结果。

zk :表示测量值,是m阶向量。

H :表示量测矩阵,是m×n 阶矩阵,它把m维测量值转换到n维与状态变量相对应。

R <script type="math/tex" id="MathJax-Element-60">R</script>:表示测量噪声协方差,它是一个数值,这是和仪器相关的一个特性,作为已知条件输入滤波器。需要注意的是这个值过大过小都会使滤波效果变差,且R取值越小收敛越快,所以可以通过实验手段寻找合适的R值再利用它进行真实的滤波。

四、算法实现

以下是一段卡尔曼滤波与平滑滤波的对比

clear
clc;
N=300;
CON = 25;%房间温度,假定温度是恒定的
%%%%%%%%%%%%%%%卡尔曼滤波%%%%%%%%%%%%%%%%%%%%%%
x = zeros(1,N);
y = 2^0.5 * randn(1,N) + CON;%加过程噪声的测量值

x(1) = 1;
p = 10;

Q = cov(randn(1,N));%过程噪声协方差
R = cov(randn(1,N));%观测噪声协方差
for k = 2 : N
x(k) = x(k - 1);%预估计k时刻状态变量的值
p = p + Q;%对应于预估值的协方差,由于状态变量是标量,状态转移矩阵A为数值1
kg = p / (p + R);%kalman gain
x(k) = x(k) + kg * (y(k) - x(k));
p = (1 - kg) * p;
end


%%%%%%%%%%%平滑滤波%%%%%%%%%%%%%%%%%%%%%%%%

Filter_Wid = 10;
smooth_res = zeros(1,N);
for i = Filter_Wid + 1 : N
tempsum = 0;
for j = i - Filter_Wid : i - 1
tempsum = tempsum + y(j);
end
smooth_res(i) = tempsum / Filter_Wid;
end
% figure(1);
% hist(y);
t=1:N;
figure(1);
expValue = zeros(1,N);
for i = 1: N
expValue(i) = CON;
end
plot(t,expValue,'r',t,x,'g',t,y,'b',t,smooth_res,'k');
legend('real temperature','kalman result','measured value','smooth result');
axis([0 N 20 30])
xlabel('Sample Time');
ylabel('Room Temperature');
title('Smooth Filter VS Kalman Filter');

结果如下图:
这里写图片描述

五、引用

[1] 王学斌, 徐建宏, 张章. 卡尔曼滤波器参数分析与应用方法研究[J]. 计算机应用与软件, 2012, 29(6):212-215.


本文word文档下载:
http://download.csdn.net/download/u013453604/9359335

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

卡尔曼滤波的理解以及参数调整 的相关文章

  • LiDAR 3 MEMS激光雷达

    与传统机械雷达相比 xff0c MEMS Micro Electro Mechanical Systems 激光雷达使用微型的MEMS mirror反射光线 xff0c 用微机电执行器代替电机 xff0c 有些厂商也称MEMS激光雷达为固态
  • Docker在CentOS上硬盘使用被占满的问题(备忘)

    摘录至 https github com yeasy docker practice blob master image rm md centosrhel 的用户需要注意的事项 在CentOS上 xff0c 遇到过这个问题 没有细究过 正好
  • ZooKeeper集群安装后无法启动ZooKeeper JMX enabled by default

    ZooKeeper做三节点集群 xff0c 启动后报错如下 xff1a root 64 centos conf zkServer sh start ZooKeeper JMX enabled by default Using config
  • Simulink建模:一阶滤波模型

    本文研究一阶滤波算法的Simulink模型及其代码生成 文章目录 1 一阶滤波算法2 Simulink建模2 1 对公式的理解2 2 建模过程2 3 模型配置 3 模型更新及代码生成3 1 模型更新3 2 代码生成 4 总结 1 一阶滤波算
  • CubeMX配置:FreeRTOS及串口配置

    本文通过CubeMX配置F103RCT6的FreeRTOS和串口 文章目录 1 引入2 配置过程2 1 配置时钟过程2 2 配置FreeRTOS过程2 3 配置串口过程 3 生成工程代码4 测试串口5 总结 1 引入 拿到一个STM32控制
  • Simulink建模:PID控制-串级PID

    本文研究串级PID控制的概念 应用场景以及Simulink模型实现 文章目录 1 问题引入2 串级PID控制3 Simulink建模3 1 建模前的理解3 2 建模过程3 3 代码生成 4 总结 1 问题引入 在之前的博客 Simulink
  • ROS导航中 的位姿描述

    转载出处 xff1a http blog csdn net u013453604 article details 47320237 补充 xff1a turtlebot包如果没有安装成功或者文件夹做了改动运行不起来需要重装就需要uninst
  • Git托管:将本地项目代码上传(push)到自己的Git repository

    首先下载并安装git版本控制软件 xff0c 我安装的是Git 1 9 2 preview20140411 xff0c 这里是我上传的有需要的可以download然后安装即可 http download csdn net detail u0
  • strstr函数用法小结

    strstr 函数原型 xff1a char strstr char str1 char str2 功能就是找出在字符串str1中第一次出项字符串str2的位置 也就是说字符串sr1中要包含有字符串str2 xff0c 找到就返回该字符串位
  • WebSphere宕机问题解决方法总结

    Websphere参数调整 涉及性能的参数 xff1a 1 数据源连接池连接数 2 线程池 xff1a default 参数 ORB THREAD POOL参数 Webcontainer 参数 3 jvm 堆最大最小值 xff0c 线程池调
  • 使用GreenDao存储list集合数据

    转载请注明出处 xff1a From李诗雨 http blog csdn net cjm2484836553 article details 78279493 不诗意的女程序猿不是好厨师 点击下载Demo源代码 xff1a 源码 不知道为什
  • catkin简析

    题记 xff1a 转载一篇catkin总结不错的原创 xff1a http blog csdn net zyh821351004 article details 50388429 catkin简析 catkin 编译支持传入cmake的宏定
  • Package name is not valid解决

    刚刚新建项目 xff0c 将com打成con xff0c 提示 Package name is not valid xff0c 在eclipse中有些单词不能命名
  • 路由器与交换机

    在工作中 xff0c 不管是办公上网还是设备调试 xff0c 经常都会用到路由器与交换机 xff0c 那他们二者的区别是什么呢 xff1f 笔者之前也没太搞明白 恰好出差周末闲来无事 xff0c 特来梳理一下并共享 xff0c 希望对那些跟
  • 用数据驱动思想来设计游戏

    游戏由两部分组成 xff0c 逻辑和数据 这是一种对游戏的有效划分 逻辑部分定义游戏引擎的核心原则和算法 xff0c 数据部分则提供其内容 和行为的具体细节 在最初的游戏开发的过程中 xff0c 大家总是喜欢将逻辑和数据都写入代码中 xff
  • 架构师之路:一个架构师需要掌握的知识技能

    Java团长 2017 04 15 21 30 没有设计的思想 xff0c 你就不能成为一名架构师 架构师是一个能撸的了一手好代码 xff0c 画的了一个漂亮的UML 原型 xff0c 写的了一篇技术文档 xff0c 更加能解决好项目关键技
  • 【Python】Windows下PyCharm安装Numpy包及无法安装问题解决方案

    step1 打开pycharm安装目录 xff0c 路径如下图 xff1a step2 在上个界面 xff0c 按 shift 43 右键 xff0c 打开命令窗口 xff0c 检查pip版本是否为最新 xff0c 如下图 xff1a st
  • 【python/tensorflow】pycharm 2019,python 3.6.2, win7 64bit系统,安装tensorflow出错,错误如下,解决办法给出!

    D aWork PycharmProjects Pro3 test venv Scripts python exe D aWork PycharmProjects Pro3 test test 1 py Traceback most rec
  • 【C++】基于 OpenCV 的人脸识别(强烈推荐)

    xfeff xfeff 原文网址 xff1a http www jianshu com p 96be2417cc98 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库 它包含成千上万优化过的算法 xff0c 为各种计算机视觉应
  • 【matlab】雷达截面积(Radar Cross Section,RCS)(MATLAB部分仿真+Code)

    xfeff xfeff 一 RCS定义 任何具有确定极化的电磁波照射到目标上时 xff0c 都会产生各个方向上的折射或散射 其中散射波分为两部分 xff1a 一 是由与接收天线具有相同极化的散射波组成 xff1b 二 是散射波具有不同的变化

随机推荐

  • 【Get深一度】自适应波束形成算法 之 算法篇【二】(Adaptive Beamforming Algorithm)

    神器镇楼 xff01 一 自适应波束形成阶段划分 xff1a 自适应阵列信号处理的概念最早由 Van Atta 于 20 世纪 60 年代末提出 本文总结了前30 年的研究成果 xff0c 将自适应阵列信号处理划分为三个阶段 xff1a 6
  • 使用adb指令往机顶盒上安装应用

    转载请注明出处 From李诗雨 https blog csdn net cjm2484836553 article details 82970881 不诗意的女程序猿不是好厨师 已有一个机顶盒端应用的apk 想通过adb指令将其安装到机顶盒
  • 多摄像机标定和去畸变

    Table of Contents xff11 kalibr多摄像机标定 1 1 系统安装 xff0c 环境配置 xff1a 实测Ubuntu 16 04 1 2 多摄像机标定 2 OpenCV双目标定 3 Matlab多摄像机标定 4 利
  • 【Get深一度】信号处理(三)——3db带宽

    1 3db带宽定义 3dB 带宽指幅值等于最大值的二分之根号二倍时对应的频带宽度 这个3分贝是多大呢 xff1f 由10log xff08 1 2 xff09 61 3 0103 xff0c 可知 xff0c 这时的输出功率是输入功率的1
  • Matlab中set-gca函数的使用

    Matlab坐标修改gca 1 坐标轴删除 set gca xtick 去掉x轴的刻度 set gca ytick 去掉y轴的刻度 set gca xtick ytick 同时去掉x轴和y轴的刻度 2 Matlab中 坐标轴刻度 的不同风格
  • 【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法

    meshgrid 函数用来生成网格矩阵 xff0c 可以是二维网格矩阵 exp1 1 生成 二维 网格 xff0c 用法为 xff1a x y 61 meshgrid a b a 和b是一维数组 xff0c 如a 61 1 2 3 b 61
  • 【matlab】./和/ .*和* 有什么区别

    matlab中 与 有什么区别 点运算是处理元素之间的运算直接 在矩阵计算中只能处理符合矩阵运算法则的运算矩阵计算和作图都是点运算在对数值计算时 xff0c 和 其实是没有区别的 例 xff1a 对于矩阵A 61 a b c d xff0c
  • 【matlab】 GMSK的调制与解调【附详尽注释】

    简介code 1 简介 MSK调制是调制指数为0 5的二元数字频率调制 xff0c 具有很好的特性 xff0c 如恒包络 相对窄的带宽 并可以相干检测 MSK 最小频移键控 信号在任一码元间隔内 xff0c 其相位变化为 2 xff0c 而
  • 【matlab】利用matlab在图形中绘制箭头、标注、圈圈 - 很帅很酷炫

    转载声明 xff1a 感谢 xff1a MyBear 尊重原作者劳动 xff1a http www 360doc com content 14 0527 21 1054746 381542462 shtml 一 二维箭头 1 xff0e 调
  • 【杂谈】甘于平凡?还是思索求生?

    前言 不觉然 xff0c 已19年 xff0c 不知不觉 xff0c 求学生涯至此告一段落 有感觉 xff0c 岁月的痕迹开始发酵 xff0c 身体抑或精神 xff0c 今不如往 思考下 xff0c 互联网浪潮之下 xff0c 之后 xff
  • 匈牙利算法-看这篇绝对就够了!

    本文讲述的是匈牙利算法 xff0c 即图论中寻找最大匹配的算法 xff0c 暂不考虑加权的最大匹配 xff08 用KM算法实现 xff09 xff0c 文章整体结构如下 xff1a 基础概念介绍 算法的实现 好的 xff0c 开始 xff0
  • 面试的一般流程及其常见的问题

    又是一年毕业季 xff0c 也要踏上求职之路 xff0c 在这段时间也关注很多求职方面的消息 下面是一些面试的一般流程及其常见的问题 xff1a 面试职位 xff1a XXXX 开始语 xff1a 你好 xff0c 首先祝贺你通过了前几个环
  • 构建库函数(STM32)

    一 定义外设的各基地址 xff0c 参考存储器映射 span class token comment 由存储器的映射可知 xff0c 片上外设基地址0x4000 0000 span span class token macro proper
  • PID控制器原理概述

    PID控制 PID概述 xff1a 控制框图 xff1a 增量式PID和位置式PID特点 xff1a PID控制参数整定口诀 xff1a 注 xff1a 本文部分内容摘自 先进PID控制MATLAB仿真 xff08 第4版 xff09 刘金
  • PyQt5 事件处理机制

    PyQt5 事件处理机制 PyQt为事件处理提供了两种机制 xff1a 高级的信号与槽机制 xff0c 以及低级的事件处理机制 信号与槽可以说是对事件处理机制的高级封装 常见事件类型 xff1a 键盘事件 xff1a 按键按下和松开 鼠标事
  • PyQt5 实现串口接数据波形显示工具

    PyQt5 实现串口接数据波形显示工具 工具简述主程序代码Qt Designer设计UI界面程序运行效果 工具简述 基于PyQt5开发UI界面使用QtDesigner设计 xff0c 需要使用到serial模块 xff08 串口库 xff0
  • ROS CMakeLists.txt的编写学习

    调用ROS中的函数 xff0c cmakelists的编写学习过程 如有错误 xff0c 请留言指教 多谢 A 首先要了解的 CMakeLists txt是CMake的构建系统构建软件包的输入文件 任何兼容的CMake都包含了描述如何构建代
  • 【Node】Buffer 与 Stream

    node 为什么会出现 Buffer 这个模块 在最初的时候 xff0c JavaScript 只运行在浏览器端 xff0c 对于处理 Unicode 编码的字符串很容易 xff0c 但是对于处理二进制以及非 Unicode 编码的数据便无
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin span class hljs symbol tf
  • 卡尔曼滤波的理解以及参数调整

    一 前言 卡尔曼滤波器是一种最优线性状态估计方法 xff08 等价于 在最小均方误差准则下的最佳线性滤波器 xff09 xff0c 所谓状态估计就是通过数学方法寻求与观测数据最佳拟合的状态向量 在移动机器人导航方面 xff0c 卡尔曼滤波是