我试着去理解卡尔曼滤波器是如何工作的,因为多维变量太混乱了,一开始我从一维的例子开始。
我发现有3个不同的来源解释温度计的情况,但所有这些情况实现的方程略有不同,我没有得到重点。
我实现了解决方案2,但我的kalman滤波器并没有真正工作(它高度适应测量结果,并没有真正考虑其上的噪声)。
所以,在我浪费更多时间尝试解决方案1或3(我刚刚读到)之前:有人能为一维kalman滤波器提供一个清晰的解释和/或代码示例吗?
解决方案1

// x_est: current estimate;           p: current estimate error;
// a:     constant of the system;    kg: kalman gain
// z:     current observation;

// Predict
x_est   =   a * x_est
p       =   a * p * a

// Update
kg      =   p  / (p  + r)
x_est   =   x_est + kg * (z - x_est)
p       =   (1 - kg) * p

作者(这里)只是解释说,我们只改变当前值,因为不需要温度计来考虑最后一个值。
所以他简化了:
p[k] = (1 - kg) * p[k-1]p = (1 - kg) * p
x_est[k] = x_est[k-1] + kg * (z - x_est[k-1])x_est = x_est + kg * (z - x_est)
……等等。。。
我不明白为什么这是可能的。我认为Kalman滤波器的一个主要部分是考虑当前观测z是否有用(通过Kalman增益)因此,对于高kalman增益kg * (z - x_est[k-1])来说,deltaz - x_est[k-1]的“大块”被添加到新的估计中。如果一个人总是计算当前值,这整件事难道不是变得毫无意义了吗?
解决方案2
# q: process variance / process noise
# r: error in measurement

x_est = x_est
p     = p + q;

k     = p / (p + r);
x_est = x_est + k * (z – x_est);
p     = (1 – k) * p;

这几乎是一样的,但是作者甚至没有解释为什么x[k-1]和p[k-1]可以改变为x和p。
解决方案3
# Q: process variance / process noise
# R: error in measurement

# prediction
x_est_kminus1[k] = x_est[k - 1]
p_kminus1[k]        = p[k - 1] + Q

# update
kg[k]     = p_kminus1[k] / (p_kminus1[k] + R)
x_est[k] = x_est_kminus1[k] + kg[k] * (z[k] - x_est_kminus1[k])
p[k]     = (1 - kg[k]) * p_kminus1[k]

在这个解决方案中,作者对x_estx_est本身和x_est_kminus1)和pp本身和p_kminus1)有两个不同的列表。
是否需要两个列表,否则p[k]将被计算两次(在预测和更新步骤中)?

最佳答案

所有这些解都是一般方程的特例,我们得看看每一个解的特例。
真方程
让我们从1d情况下的适当的一般方程开始:

# prediction
x[k] = a * x[k - 1]
p[k] = a * p[k - 1] * a + q
# update
y = z - h * x[k]
kg = p * h / (h * p * h + r)
x[k] = x[k] + kg * y
p[k] = (1 - kg * h) * p[k]

x-状态
p-误差(协方差)
a-状态转换
q-转换错误
z-测量
h-状态到测量转换
y-我们根据预测预期测量的值与实际测量值之间的差异
kg-卡尔曼增益
r-测量误差
模型的所有参数(aqrhk)基本上也可以有一个指数a,并且随着系统的发展而变化。但在简单的情况下,它们都可以看作常数。
解与真方程的区别
只有解决方案1实现a,这很好。a == 1告诉你从一个步骤到另一个步骤的状态是如何变化的,如果你假设温度是静止的,那么q就像在溶液2和3中一样。
解决方案1没有qa == 1是我们可以估计过程误差的地方。同样,如果这个过程是关于系统是静止的(q = 0),那么我们可以设置h
您的任何解决方案都没有h = 1,这是观察转换(如何从测量到状态)。如果您是根据温度测量值来估算温度,则h
h可能与1不同的一个例子是,如果您测量的不是您感兴趣的估计值,例如使用湿度测量值来估计温度。那么T(humidity) = h * humidity就是线性变换k。我强调线性,因为上面是线性卡尔曼滤波方程,它们只适用于线性(在数学意义上)系统。
当前和上一步问题
k - 1x_est的比较以及拥有x_est_kminus1k的问题纯粹是一个实现的问题。在这方面,你们所有的解决办法都是一样的。
你对解决方案1中k - 1x_est[k]的思考已经停止只有预测阶段需要考虑当前和上一步(因为它是基于上一步的当前状态预测),而不是更新步骤更新步骤作用于预测。
从可读性的角度来看,解3最接近数学方程。基本上,预测步骤还没有给出predicted_x_est[k],而是更像predicted_x_est[k]然后更新步骤在这个x_est[k]上运行,并给出实际的p
然而,正如我所说,所有实现都是等价的,因为当它们被编程时,您可以看到在预测步骤之后,不再需要过去了。因此,您可以安全地为xr使用一个变量,而无需保留列表。
关于卡尔曼增益
你写道:
所以对于一个高的Kalman增益kg*(z-x_est[k-1])来说
增量z-x_est[k-1]被添加到新的估计中。这不是全部吗
如果一个人总是计算当前的值,事情就变得毫无意义了?
在这些情况下,卡尔曼增益只能在0到1之间什么时候最大当x_est(测量误差)为0时,这意味着我们无限信任我们的测量然后方程简化为
x_est = x_est + z - x_est

这意味着我们放弃我们的预测值(右边的q),并将我们的更新估计值设置为我们的测量值当我们无限地相信我们所测量的东西时,这是一件有效的事情。
适应测量
我实现了解决方案2,但我的卡尔曼滤波器并没有真正工作(它
高度适应测量,没有真正考虑
上面有噪音)。
调整卡尔曼滤波器是很棘手的,需要对系统有深入的了解,并对rq进行适当的估计。记住,r是过程(状态演化)的错误,q是我们测量的错误。如果你的卡尔曼滤波器太适应测量值,这意味着:
r太大
太小
或者两者的结合。你必须玩弄价值观才能找到有效的价值观。

关于python - 卡尔曼滤波器(一维):几种方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33384112/

10-13 07:04