实现卡尔曼滤波器进行预测

Posted

技术标签:

【中文标题】实现卡尔曼滤波器进行预测【英文标题】:Implementing Kalman filter for prediction 【发布时间】:2016-04-29 21:34:57 【问题描述】:

我有人们将光标移向屏幕上的目标的数据(我实际上有很多数据)。例如:

运动总是在 ~9 厘米左右。因此,在上述情况下,个人超过了目标并在最后进行了纠正。这往往会发生。

我想要做的是使用卡尔曼滤波器来预测光标的位置,而不是 t+1,而是 t+15(所以提前 15 个时间步长)。此外,我认为我当前的实现存在错误,这就是我在上述情况下得到的:

你可以看到它在最后真的搞砸了,这让我怀疑我的实现。所以这是我的问题:

1) 有人可以查看我的代码,看看我是否犯了错误吗?有什么改进建议吗?

2) 我将如何修改我的代码,以便我可以预测未来的许多步骤(例如,15 步)而不是仅仅一步?在给定的迭代中,我基本上想预测 x(t+15) 而不是 x(t+1)。

非常感谢这里的任何帮助,我已经坚持了一段时间。

这是数据:http://s000.tinyupload.com/index.php?file_id=16556755793392871980

请注意,您需要除以 1000 才能得到厘米。

这是我的代码:

xp=position_data(:,1);
yp=position_data(:,2);

N=length(xp);

Q=eye(4);
motion=zeros(4,1);

H=[1 0 0 0
    0 1 0 0];
F=[1 0 1 0
    0 1 0 1
    0 0 1 0
    0 0 0 1];

x=zeros(4,1);
P = eye(4)*1000; %initial uncertainty

observed_x=xp+0.05*rand(N,1).*xp;
observed_y=yp+0.05*rand(N,1).*yp;

R=0.01^2;

pos=[observed_x,observed_y];

start=0;
jj=zeros(N,2); %%jj will be the final result


for k=start+1:length(observed_x)
    measurement=pos(k,:);
    y = measurement' - H * x;
    S = H * P * H' + R; % residual convariance
    K = P * H' * inv(S);    % Kalman gain
    x = x + K*y;
    I = eye(4); % identity matrix
    P = (I - K*H)*P;

    % predict x and P
    x = F*x + motion;
    P = F*P*F' + Q;
    jj(k,:)=x(1:2);
end

【问题讨论】:

【参考方案1】:

我没有检查你的卡尔曼滤波器的代码,但假设它是正确的,你所说的残差协方差和由此产生的增益不依赖于观察结果,而只依赖于原始设置和它有多长时间一直在运行。我喜欢将卡尔曼滤波器视为通过更新其均值和方差来跟踪未知量。均值取决于观测值,但方差不。

现实生活中发生的情况是,用户的光标在到达屏幕末端之前是非常可预测的,然后它会急剧变化,然后又变得可预测。没有一种增益/观察方差设置可以在所有三个区域都很好地工作。我会考虑尝试检测错误率突然增加然后急剧增加不确定性的时段,以便卡尔曼滤波器不再认为仅仅因为它一直沿着屏幕跟踪光标,剩余的不确定性非常小它将继续越过屏幕边缘。就此而言,在屏幕边缘继续进行预测是一个很好的提示,表明这些预测不会准确,您应该增加不确定性。

您还可以尝试使用您收集的所有数据来找到导致最小误差的初始不确定性设置 - 或者,如果您在预测开始超出屏幕末尾时重置不确定性,则初始和重置导致最小错误的不确定性设置。

【讨论】:

那么我将如何使用数据来初始化不确定性?我只是猜到了它并不断调整它直到它有点工作。没有意识到你可以定量地确定它。如果您有空闲时间查看代码,我将不胜感激。我不能告诉你我非常有信心它是正确的,但如果不是,我认为它大部分都在那里。也许那时您还可以看到我将如何更改它以预测更大的步骤。 您编写了一个程序来衡量不确定性 - 矩阵或当前值为 1000,对您的全部或部分测试数据集合运行卡尔曼滤波器,并返回一个值说明这有多好是,例如预测误差的平方和。您将该例程交给一个用于优化没有导数的函数的例程,并要求该最小化器找到最小值。但首先我会考虑检测突然变化——通过大量增加的错误或通过物理上不可能的预测——并在那时重新初始化不确定性。 好的,我想我明白你在说什么了。在检测到错误突然增加后,我将首先通过重新初始化不确定性来尝试它。感谢您的帮助。

以上是关于实现卡尔曼滤波器进行预测的主要内容,如果未能解决你的问题,请参考以下文章

卡尔曼滤波器中的 dt

卡尔曼预测和校正与起始值相同

在 R-Cran 中使用卡尔曼滤波器进行时间序列预测

Opencv Python卡尔曼滤波器预测结果查询

如何使用卡尔曼滤波器预测测量之间的 gps 位置

卡尔曼滤波器协方差在预测步骤中不会增加?