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

2023-05-16

一、前言

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

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

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

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

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

满足上述条件就可以使用卡尔曼滤波器。
2、问题描述

定义一个随机离散时间过程的状态向量 ,该过程用一个离散随机差分方程描述:
xk=Axk−1+Buk−1+wk−1

其中n维向量 xk为k时刻的系统状态变量,n维向量xk−1 是k-1时刻的系统状态变量。A是状态转移矩阵或者过程增益矩阵,是n×n 阶方阵,它将k-1时刻状态和当前的k时刻状态联系起来。B是可选的控制输入 u∈Rl的增益,在大多数实际情况下并没有控制增益,所以 Buk−1这一项很愉快的变成零了。 wk−1是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=Axk−1+wk−1

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

其实用矩阵的形式写开上面的方程就很好理解了:
xk=Axk−1+wk−1→⎡⎣⎢⎢⎢⎢xyvxvy⎤⎦⎥⎥⎥⎥k=⎡⎣⎢⎢⎢⎢10000100Δt0100Δt01⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢xyvxvy⎤⎦⎥⎥⎥⎥k−1+wk−1=⎡⎣⎢⎢⎢⎢x+Δt⋅vxy+Δt⋅vyvxvy⎤⎦⎥⎥⎥⎥k−1+wk−1

    这里简要说一下状态转移矩阵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̂ k−1+Buk−1

P̂ k⎯⎯⎯=AP̂ k−1AT+Q

2、更新:

x̂ k=x̂ k⎯⎯⎯+Kk(zk−Hx̂ k⎯⎯⎯)

Kk=P̂ k⎯⎯⎯HTHP̂ k⎯⎯⎯HT+R

P̂ k=(I−KkH)P̂ k⎯⎯⎯

先来解释一下公式中各个变量的含义:
x̂ k⎯⎯⎯

:表示k时刻先验状态估计值,这是算法根据前次迭代结果(就是上一次循环的后验估计值)做出的不可靠估计。

x̂ k
、x̂ k−1

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

A
:表示状态转移矩阵,是n×n

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

B
:表示可选的控制输入 u∈Rl

的增益,在大多数实际情况下并没有控制增益。

uk−1

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

P̂ k⎯⎯⎯
:表示k时刻的先验估计协方差,这个协方差矩阵只要确定了一开始的P̂ 0 ,后面都可以递推出来,而且初始协方差矩阵P̂ 0

只要不是为0,它的取值对滤波效果影响很小,都能很快收敛。

P̂ k
、P̂ k−1

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

Q

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

Kk

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

zk

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

H
:表示量测矩阵,是m×n

阶矩阵,它把m维测量值转换到n维与状态变量相对应。

R

:表示测量噪声协方差,它是一个数值,这是和仪器相关的一个特性,作为已知条件输入滤波器。需要注意的是这个值过大过小都会使滤波效果变差,且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');

 

结果如下图:


原文:https://blog.csdn.net/u013453604/article/details/50301477  
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

  • linux中用gcc编译源代码的四个步骤(转载)

    在Linux下进行C语言编程 xff0c 必然要采用GNU GCC来编译C源代码生成可执行程序 一 GCC快速入门 Gcc指令的一般格式为 xff1a Gcc 选项 要编译的文件 选项 目标文件 其中 xff0c 目标文件可缺省 xff0c
  • 随笔之ros多线程

    nt main int argc char argv ros init argc argv 34 convert to mono 34 ros NodeHandle nh ros Publisher image pub 61 nh adve
  • 【FreeRTOS 消息队列】消息队列传递变量

    消息队列创建及运行 xff0c 参阅安富莱电子demo span class token keyword static span QueueHandle t xQueue1 span class token operator 61 span
  • 在校大学生如何规划自己的程序员之路

    近况 九月份 有很多 不甘和后悔 也有 很多的收获 会 不甘 没能拿到网易转正的意向书 会 后悔 腾讯的项目没能顺利的结项 不过 好在 自己都没有全权押宝 抓着秋招的尾巴 投了能投的公司 即使 七八月份 六十多天没有任何收获 也还是 坚持下
  • 不要停下来更新

    1 又换平台了 知识库切换到了 yuque 有诸多几点原因 之前的平台太过于垂直 圈子太小众做好了其实也不会怎么样 需要一个笔记平台可以记录自己的学习点滴需要一个文档系统 形成自己的弹药库可以进行分享和私密记录 1 1长期主义 主要的原因还
  • 我的创作流

    2021年09月19日21 37 07 创作流 虽然我创作的 肯定不咋地 但是 还是 想写一下自己的创作流规划 对 xff0c 这仅仅是个 规划而已 正确 吸引人的 创作应该 是 总分总的 更吸引读者 但是 我自己写的东西 主要还是用来 复
  • 我,22届双非本科,150+场面试 拿到了20+offer

    文章目录 秋招的喜怒哀乐和酸甜苦辣万千应届生中的普通背景实习拿到的offer秋招目前收到的 意向 分享我自己个人的复习准备艰难求职路基础不牢地动山摇简历挂是常态面试不要慌 xff0c 稳住就能赢 秋招备战计划第一弹 今天就开始备战秋招思维导
  • 【业界冥灯】今年校招太难了我面试过的大厂都逃不过被制裁的命运

    今年应届生的校招 真是太难了 卷死我了 家人们 大家可能不清楚 我这几个月 究竟 经历了啥 尝试录制了一个视频版 到B站 发现自己 好紧张 话都说不清楚 还是要努力 练习 进步啊 视频版 指路 第一次 被熟人 认出来 是在 滴滴 橙心优选
  • Docker镜像仓库

    一 搭建私有镜像仓库 常见镜像仓库服务 镜像仓库 xff08 Docker Registry xff09 有公共的和私有的两种形式 公共仓库 例如Docker官方的Docker Hub xff0c 国内也有一些云服务商提供类似于Docker
  • 35岁被大厂踢出豪门,褪去这层皮你还剩什么

    很多人 他们在大厂里边混得很好 他们大厂里边这个位置很高 但是突然有一天 晋升不上去了 领导空降了 项目解散了 某一个东西调岗了 给他打击很大准备跳槽 别到那一天 xff0c 这是一个常态 这个忽然有一天 xff0c 这件事情是你在大厂里边
  • 【密码学课程设计】HBU-paperOline 2020-06-06

    HBU paperOline 项目介绍 HBU paperOline 项目是基于SpringBoot2的一整套后端管理平台 xff0c 提供整套公共微服务服务模块 xff1a 集中权限管理 xff08 单点登录 xff09 内容管理 人事办
  • 一个并不极简的人做的极简清单【2021 年终总结】

    文章目录 很久没更文 不是自闭就是懒 极简生活 物品清单 软件清单 消费主义洗了脑 淘汰了一些设备 新的一年 一定要极简了 很久没更文 不是自闭就是懒 很长时间没有更文 的确是没有像以前那样可以做到 日更或者周更 还有一部分原因是我的确写了
  • 一个实习生的经验总结,3次实习4个坑,全是经验

    一个实习生的经验总结 xff0c 3次实习4个坑 xff0c 全是经验 文章目录 一个实习生的经验总结 xff0c 3次实习4个坑 xff0c 全是经验职业发展刚毕业就职业危机站在风口前等风来尽早做足准备实习很重要 xff0c 但是不行尽快
  • 拖更的这段日子+这并不友好的环境+不能再犯懒了

    拖更的这段日子 43 这并不友好的环境 43 不能再犯懒了 我很懒 我一直在拖更 停更了有一段时间 一直没有机会再打开电脑去记录这些事情 如果非要说一个原因的话那便是懒 去年的这个时期可以保持日更文章的时候 是因为 每天早上 六点就会从床上
  • 我的2021年度书单(主要教你面试怎么装B)

    我的2021年度书单 xff08 主要教你面试怎么装B xff09 文章目录 我的2021年度书单 xff08 主要教你面试怎么装B xff09 技术之内 数据密集型应用系统设计 数据结构与算法之美 大型网站技术架构 凤凰架构 凤凰项目 计
  • 毕业半年年终总结

    毕业半年年终总结 如果说2021年主要的内容是求职和实习 那么2022年一年主要的内容便是毕业和工作 匆匆忙忙 本科毕业了 6月份的时候参加完毕业答辩 xff0c 也就顺利的毕业了 实际上中途也有过一些插曲 xff0c 比如毕业设计是制作某
  • 221228代码屎山看法

    今天逛v站有人在提问 公司的项目代码太恶心了怎么办 xff1f 这的确是一个 老生常谈的问题 刚好今天上午也有同事在抱怨和吐槽历史的代码各种不合理 xff0c 维护起来极其的恶心 论坛里有人提出了 你不能用现在的标准去衡量以前的产出 的观点
  • 我不看好web3.0 但是或许 我就像十六年前不看好 web2.0那批人一样?

    我不看好web3 0 但是或许 我就像十六年前不看好 web2 0那批人一样 xff1f 最近一直被推荐系统刷到 web3 0 的话题 说实话我对 web3 0 目前基本上也是完全不了解 xff0c 主观的偏见还是认为 xff0c 脱离了中
  • 2022最后一天盘点

    今天是今年最后的一天工作日 xff0c 对于我来说就是今年的最后一天 xff0c 因为放假了我就不需要思考了 xff08 当然公司后端程序员要保持24小时oncall xff09 1 阳完之后 还是有些 咳嗽 xff0c 公司此起彼伏的咳嗽
  • VSCode如何快速搭建C/C++环境

    1 前言 说明下如何在VSCode下面搭建C C 43 43 环境以及运行 2 下载 点击该链接 xff0c 进行ming64安装包下载 xff1a VSCode安装请自行百度 xff0c 这里不在赘述 3 安装 1 将下载完成后的安装包

随机推荐