傻瓜也能懂的卡尔曼滤波器

百科   2024-10-02 07:50   山东  

最近我在学卡尔曼滤波的时候偶然被别人推荐了这篇文章,觉得写的相当适合初学者。我自己翻译了一下放出来,希望能帮到被卡尔曼困扰的同学。原作者写这篇文章的目的是让初学者能够手动建立出来一个卡尔曼滤波器并且通过实际计算感受卡尔曼滤波器的用处,所以并没有对卡尔曼滤波的实际原理有过多涉及。只是在最后面用那幅图表示了一下卡尔曼滤波能够对读取电压时候的噪音进行修正且在迭代了10次后能够收敛于真实值。这篇文章对刚学到这部分而马上要实际使用的学生来说这个可以算是一个手把手的教程。但确实满足不了想要对卡尔曼滤波有一个直观深入的理解的读者。

原链接:http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies#

这里感谢作者Bilgin Esme。

傻瓜也能懂的卡尔曼滤波器

当我刚开始做《信号处理—最优滤波器》这门课的作业的时候,我对自己说的是:“它能有多难?”。很快我就发现我错的有多么离谱了。

这作业简直就是噩梦!啥都看不懂。那些方程里充斥着各种荒谬复杂的上下角标以及矩阵和转置矩阵,完全看不懂!

因此,我决定首先全力以赴地把卡尔曼滤波整明白。本篇文章便是我多日心血的结晶,也反映了我这种“数学困难型”人才的学习曲线有多慢。

如果你能坦然承认你并不是完全了解卡尔曼滤波器,你会发现这篇学习材料很有启发性。

希望你看得开心

刚刚说过,通过卡尔曼滤波器的定义和复杂方程来达到完全理解的目的是基本不可能的(起码对我们凡人是这样的)。

大多数情况下,我们能够获得如下状态矩阵相关的方程,这个就非常适合入门了。

卡尔曼滤波器的状态矩阵方程

下角标上的k是状态。此处我们将其视为离散时间间隔,比如说k=1 代表 1ms, k=2 代表2ms.

我们的目的是找到信号  的估值  ,。并且希望能对所有的k值都能找到对应的估值。

另外此处的  是实际测量值,记住我们对该值并不完全信任,否则我们也不用费这么多事了。  称为卡尔曼增益(也是最重要的量),  是前一状态下的信号估值。

现在我们有了测量值,前一状态的信号估值。该方程中唯一未知的量就是卡尔曼增益  了。对于每个状态,我们都需要计算对应的。这事不简单,但好在我们有所需的计算工具。

另一方面,假设  等于0.5,我们会发现该式变成了一个简单的求平均值公式。换句话说,随着状态的变化,我们的  值将越来越“聪明”。

重点是:卡尔曼滤波能够为所有的状态找到对应的最优平滑系数。还同时保留部分之前状态的影响。

是不是很强?

手把手环节

快速教你构建一个简单的卡尔曼滤波器

第一步:建立模型

此步最为关键,你必须确保卡尔曼滤波器适用于你要解决的问题

我们记得卡尔曼滤波器的两个方程如下

式1表达的是每个  都可以通过一个线性随机方程估计出来。任意  都是其前一时刻的值与过程噪音的线性组合(这个很难概念化)。请记住,大部分情况下该式没有控制信号  项。

式2告诉我们任何测量值  (无法确定精确与否的测量值)都是信号值与测量噪声的线性组合。这两个分量符合高斯分布。

进程噪声与测量噪声互相统计独立。

A B H 是一般形式的矩阵。但在大多数信号处理问题中,这些量仅为数值。而且虽然这些值在状态变换时会改变,大多数情况下我们都可以假设他们为定值。

如果我们十分确定我们的系统符合此模型,那么唯一剩下要做的事就是估计噪音函数  和  的平均值以及标准差。我们知道,在实际生活中没有信号满足高斯分布,但我们可以近似其为高斯分布。

该近似问题不大,因为我们将看到卡尔曼滤波器算法会逐渐向正确的(噪音函数的)估计值收敛,即使高斯噪声参数估计不佳。(译者的理解是即使实际的噪音完全不符合高斯分布,卡尔曼滤波器也能正确的将其近似出来)

唯一需要记住的是:你估计出来的噪音参数越好(越接近实际),你估计的(输出真实值)就越好。


第二步:开始卡尔曼滤波

如果你的模型适用于卡尔曼滤波器,那么接下来的步骤就是决定一些必要的参数以及初始值。

卡尔曼滤波器包含的方程可分为两个方程集:时间更新方程组(用于预测)以及测量更新方程组(用于修正)。这两个方程组在滤波器运行的每一步(每个状态)下都会执行。

卡尔曼滤波的两个步骤

建模部分已经在步骤一完成了,所以矩阵A,B和H已知。这些矩阵很可能是一个常数,而且大部分情况下会等于1。

笔者建议读者在其等于一的情况下重写一遍这些方程,看看它们能被简化到什么程度。(不做也没事,后面有)

剩下的最让人难受的部分就是决定R和Q的值了。R的值还是很容易找的,因为一般情况下我们对环境中的噪音还是能够确认的。(起码能用仪器测一下)。但是找Q的值就没那么直观了。因为我们的教程比较初级,所以我也没法给你一个具体的方法。

为了使滤波器能够运行,我们需要知道x0和P0的估计值。


第三步:迭代

在获得了滤波器运行所需的所有信息后,我们就可以估值迭代了。记住:前一状态的估值将成为当前状态的输入。





此处  是预估值,从某种角度来说是第二部分运行前对x的一个粗略估计值。


同时  叫做预估误差协方差。在第二步“测量更新”中我们将会用到这两个预估值。

其为在时间k时的x的估计值。(也是我们最想获得的值)。同时,我们得到了用于k+1时刻计算的Pk值。



下一次迭代不会用到我们求得的卡尔曼增益  的值,该值隐藏而神秘,并且是这些方程集的最重要的部分。

我们在第二步“测量更新”中求得的值也叫做后部值(posterior values)。这个名称也很说得通。

举个简单的例子:

现在让我们来求一个标量随机常值,比如说对一个信号进行“电压测量”。因此我们假设该信号的电压为常值a伏,但当然由于噪音干扰,我们的测量值会上下偏离a。我们假设测量噪音的标准偏差为0.1伏。

现在我们来建立模型

就像我保证过的,我们将此方程化到简化形式。

  1. 首先,我们的问题是一维的,因此模型中的每个实值都是一个数值而不是矩阵

  2. 我们没有控制信号  ,也就不带他玩了。

  3. 由于信号为常值,常数A为1,因为我们已经知道了下一个值会和当前值相等(Xk+1=Xk)。在这个例子中我们幸运的有一个常值,但即使它是任何其他有线性性质的值,我们也能简单的假设其值为1。

  4. H的值为1,因为我们知道测量值是由状态值和噪音组成的,现实生活中很少会遇到H不等于1的情况。

最后让我们假设我们的实际测量值如下

那么首先我们需要从某个地方开始,比如说k=0处。我们需要找到或假设一些初始状态。此处我们将直接给出这些值:我们假设x0为零,P0为1。

为什么我们不假设P0=0?很简单,那么做的话就等于说环境中没有噪音,之后的所有xk的值都会是零(停留在初始值)。因此P0的值需要是非零值。

然后写出时间更新和测量更新方程组。

现在我们来计算每一次迭代的值

此处我展示了前两部的完整过程,同理可得其他值。表格中的其他值是用计算机算法算的,如果你试着把它的算法写出来,你就会发现卡尔曼滤波器应用起来多简单。

表格的右半部分表明卡尔曼滤波器算法会向电压的真实值收敛。此处我写出了前十次迭代的值,它收敛的趋势是清晰可见的。在迭代50次或更多后它会收敛的更好。

为了使收敛所需的步数更少,你应该:

  1. 更加优美地为系统建模

  2. 更加精确地估计噪音

那么整个过程到这里就结束了,唯一要做的是就是收集我们计算出的的值。就是这样。

文章转发自:FPGA之家

加入知识星球智能制造与自动化,加入会员可下载此公众号发布文章中的相关资料(行业报告、MES、数字化技术方案、自动化教程、自动化行业标准化资料VASS\SICAR\戴姆勒等、C#上位机开发、node-red开发、人工智能教程等)。

会员下载区

今天的文章,如果你感觉有价值,请记得一键三连:点赞加关注,留言,转发朋友圈,分享收藏,点击在看之后,一定记着加我个人微信:ZIDHXB。

往期精彩回顾




汽车行业Sicar控制标准资料有偿获取
博途PLC与FactoryIO联合仿真教程限时分享
PLC程序动态加密—分级催款可远程授权程序与授权软件分享
SIEMENS/西门子杯,六部十层电梯程序分享
FactoryIO与博途联合三色物料气缸分拣站程序分享
多台排水泵按累计运行时间切换和先启先停切换多模式控制PLC程序分享
倍福PLC视频教程及资料免费分享(36G)
三菱PLC编写的贪吃蛇与俄罗斯方块程序分享
库卡EthernetKRL备选软件包分享(版本V3.1.3)
精美博途Wincc界面程序模板分享
TIA_Portal_v18虚拟机分享
西门子博途V19全家桶与最新授权下载
大众VASS05标准Step7v5.5软件虚拟机分享
TIA_Portal_v19虚拟机分享
西门子SCL编程实例—扫雷游戏分享
西门子TIA博途软件入门到精通教程免费分享
西门子S7-1500博途PLC(基础+高级)视频教程分享
西门子TIA博途-SCL高级编程多套视频资料免费分享-限时删除
西门子TIA博途高级语言SCL视频资料分享
三菱FX3U系列plc精讲视频分享(40讲+240讲) 49GB
西门子smart200视频教程分享
两套西门子WinCC视频教程分享(9.5G)
PLC、触摸屏工控小游戏样例合集分享
EPLAN电气设计制图视频教程分享-限时删除
都有哪些好用电工仿真软件?学习电路图变得如此简
67本自动化书籍免费领取啦!!!
最新西门子授权工具EKB2022版分享
立体仓库穿梭车程序分享
威纶触摸屏视频教程(66讲)分享
博途TIA V16-V17全套软件与组件分享
标准化编程之-博途TIA程序设计编程规范
西门子SCL编程练习:排水泵根据运行时间先起先停控制
如何使用C#编写程序读写西门子PLC?
VASS标准—PLC安全程序架构讲解
VASS05标准—KUKA机器人培训课件
大众VASS_05标准——PLC程序架构
大众VASS05生画面遇到的问题总结
SEW_MOVIPRO变频器在VASS05标准中的应用
SEW_MOVIFIT变频器在VASS05标准中的应用
KUKA机器人高级编程(下)第3-4章(计时器\运动编程)
西门子博途SCL案例_仓储系统出料优先级控制程序实战练习
西门子TIA博途SCL高级教程—伺服V90速度控制
西门子TIA博途SCL高级教程—伺服V90定位控制
西门子TIA博途SCL高级视频教程—模拟量在工程中的应用
博途TIA Portal——SCL间接寻址PEEK和POKE指令的使用案例
西门子SCL高级语言教程—冒泡排序和选择排序
西门子SCL编程实例—字与位的转换Word_To_Bit
西门子博途WINCC脚本VBS教程4_脚本操作画面内对象的属性
如何使用C#编写程序读写西门子PLC?
C#上位机通过TCP/IP协议和KUKA机器人通讯
不外传的28条PLC编程规范及建议,赶紧收藏
win10家庭版安装西门子博途软件时提示“管理员已阻止你运行此应用”解决方法
西门子SCL编程-数据堆栈存储与操作在项目中的使用
博途实现程序动态加密—分级催款密钥授权管理系统程序实现
分享几个PROFINET网络故障诊断与分析案例
工控的面向对象编程
SiCar自动化标准平台架构
特斯拉EPLAN 电气图纸和结构标准
SICAR标准-VALVE_1_TO_8_3POS_FB夹具控制功能块
西门子PLC信号分析软件Winplc Analyzer 使用方法
PROFINET设备的GSD文件及其描述语言GSDML
大众标准VASS06软件环境设置
ABB机器人编程与应用中级篇
PLC编程算法—FIFO堆栈程序的实现
大众VASS06 项目库标准程序结构.
C#利用S7netplus读写西门子PLC数据
吉利KUKA_KRC4系列机器人现场应用规范和技术要求
TESLA特斯拉—PLC 逻辑编程规范
TESLA特斯拉—SCADA 设计规范
多台排水泵按累计运行时间切换和先启先停切换多模式控制PLC程序分享
西门子S7-200SMART编码器线速度测量算法
西门子S7-200SMART一阶RC低通滤波算法原理与实现
博途S7-1500SCL与FactoryIO仿真实现一阶RC低通滤波器皮带机速度平滑控制
Node-Red与ModbusTCP设备通信——写数据
Node-Red与ModbusTCP设备通信——读数据
大众汽车PLC-VASS05标准视频教程
你知道制造业10大系统集成:SCADA、MES、PLM、ERP、SCM、WMS、APS、QMS、CRM、EAM的关系吗?
西门子S7-300 SCL编程实现数组队列搜索、插入、删除、改动功能

智能制造与自动化
每天学习一点点,时间会给你一个不可思议的礼物。定期分享智能制造与自动化知识点,分享比收获更让人幸福。 智能制造、自动化、数字化、机器人、工业互联网 PLC\MES\SCADA\EPLAN\ 西门子\三菱\施耐德\KUKA\
 最新文章