最近我在学卡尔曼滤波的时候偶然被别人推荐了这篇文章,觉得写的相当适合初学者。我自己翻译了一下放出来,希望能帮到被卡尔曼困扰的同学。原作者写这篇文章的目的是让初学者能够手动建立出来一个卡尔曼滤波器并且通过实际计算感受卡尔曼滤波器的用处,所以并没有对卡尔曼滤波的实际原理有过多涉及。只是在最后面用那幅图表示了一下卡尔曼滤波能够对读取电压时候的噪音进行修正且在迭代了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伏。
现在我们来建立模型
就像我保证过的,我们将此方程化到简化形式。
首先,我们的问题是一维的,因此模型中的每个实值都是一个数值而不是矩阵
我们没有控制信号 ,也就不带他玩了。
由于信号为常值,常数A为1,因为我们已经知道了下一个值会和当前值相等(Xk+1=Xk)。在这个例子中我们幸运的有一个常值,但即使它是任何其他有线性性质的值,我们也能简单的假设其值为1。
H的值为1,因为我们知道测量值是由状态值和噪音组成的,现实生活中很少会遇到H不等于1的情况。
最后让我们假设我们的实际测量值如下
那么首先我们需要从某个地方开始,比如说k=0处。我们需要找到或假设一些初始状态。此处我们将直接给出这些值:我们假设x0为零,P0为1。
为什么我们不假设P0=0?很简单,那么做的话就等于说环境中没有噪音,之后的所有xk的值都会是零(停留在初始值)。因此P0的值需要是非零值。
然后写出时间更新和测量更新方程组。
现在我们来计算每一次迭代的值
此处我展示了前两部的完整过程,同理可得其他值。表格中的其他值是用计算机算法算的,如果你试着把它的算法写出来,你就会发现卡尔曼滤波器应用起来多简单。
表格的右半部分表明卡尔曼滤波器算法会向电压的真实值收敛。此处我写出了前十次迭代的值,它收敛的趋势是清晰可见的。在迭代50次或更多后它会收敛的更好。
为了使收敛所需的步数更少,你应该:
更加优美地为系统建模
更加精确地估计噪音
那么整个过程到这里就结束了,唯一要做的是就是收集我们计算出的的值。就是这样。
文章转发自:FPGA之家
加入知识星球智能制造与自动化,加入会员可下载此公众号发布文章中的相关资料(行业报告、MES、数字化技术方案、自动化教程、自动化行业标准化资料VASS\SICAR\戴姆勒等、C#上位机开发、node-red开发、人工智能教程等)。
今天的文章,如果你感觉有价值,请记得一键三连:点赞加关注,留言,转发朋友圈,分享收藏,点击在看之后,一定记着加我个人微信:ZIDHXB。