- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有人们将光标移向屏幕上的目标的数据(我实际上有很多数据)。例如:
移动始终在 ~9cm 左右。所以在上面的例子中,个人超过了目标并在最后纠正了它。这往往会发生。
我想要做的是使用卡尔曼滤波器来预测光标的位置,而不是在 t+1,而是在 t+15(因此提前 15 个时间步)。此外,我认为我当前的实现有一个错误,这就是我在上述情况下得到的结果:
你可以看到它在最后确实变得一团糟,这让我怀疑我的实现。所以这是我的问题:
1) 有人可以看看我的代码,看看我是否犯了错误吗?有什么改进建议吗?
2) 我将如何修改我的代码,以便我可以预测 future 的许多步(例如,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
最佳答案
我没有检查你的卡尔曼滤波器的代码,但是,假设它是正确的,你所谓的残差协方差,以及由此产生的增益,不依赖于观察,而只依赖于原始设置和它有多久一直在运行。我喜欢将卡尔曼滤波器视为通过更新其均值和方差来跟踪未知量。均值取决于观察结果,但方差不。
现实生活中发生的事情是,用户的光标在到达屏幕末尾之前是相当可预测的,然后它会急剧变化,然后再次变得可预测。没有一种增益/观察方差设置可以在所有三个区域中正常工作。我会考虑尝试检测错误率突然增加然后不确定性急剧增加的时期,以便卡尔曼滤波器不再认为仅仅因为它一直沿着屏幕一直跟踪光标剩余的不确定性很小它将继续越过屏幕边缘。就此而言,让预测继续超出屏幕边缘是一个很好的提示,表明这些预测不会准确,您应该增加不确定性。
您还可以尝试使用您收集的所有数据来找到导致最小错误的初始不确定性设置 - 或者,如果您在预测开始超出屏幕末尾时重置不确定性,则初始和重置导致最小错误的不确定性设置。
关于algorithm - 实现卡尔曼滤波器进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36947785/
为了帮助人们理解我要问的问题,我选择完全改写它。我希望这能解决问题。 我正在以 1 秒的速率收集 GPS 数据(纬度/经度)。了解此数据可能不是 100% 准确,并且偶尔有一个(1 个或多个)数据点偏
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我正在关注 Matlab编码器kalman教程在 Matlab帮助。使用时 codegen ,出现如下错误: /usr/bin/ld: cannot find -lstdc++ collect2: l
我是一名优秀的程序员,十分优秀!