我试图写估计并跟踪straigh线的算法: Y [k]的= B1 * X [k]的+ B2 [K]。 在我使用的真实物理系统中,我只能测量y [k],并控制输入是x [k](我输入x [k]并期望得到特定的y [k])。卡尔曼滤波器不收敛
的问题是,Y [k]和X [k]的关系不是恒定的:斜率b1为每迭代k恒定的,而是恒定B2 [K]是没有的。我假设的另一件事是:deltab2 [k] = b2 [k] -b2 [k-1],它对于每次迭代都是不变的。
我试图使用卡尔曼滤波器,具有状态矢量=(X [k]的,B2 [K],Delatb2 [K]),和测量= Y [k]的。它没有奏效 - 卡尔曼增益变成了实用零点,误差协方差矩阵没有收敛。我了解融合问题与系统的可观性有关。不过,让我的模型可观察,我有点麻烦。我怎样才能使我的算法工作?
% note - y[k] is beta here, x[k] is v.
A=[1 0 -1/b1;0 1 1;0 0 1];
H=[b1 1 0];
% varb2 = b2[k] variance
% varb2' = b2[k-1] variance
% varbeta = measurement noise variance
% covbbt = b2[k], b2[k-1] covariance - assumed to b2 0
Qk=varb2*[1/b1^2 -1/b1 -1/b1;-1/b1 1 1; -1/b1 1 1]+covbbt*[0 0 1/b1; 0 0 -1; 1/b1 -1 -2]+varb2t*[0 0 0; 0 0 0; 0 0 1]+varbeta*[1 0 0; 0 0 0; 0 0 0];
Rk=varbeta;
P=Qk;
x=[5,handles.b(2),0].'; %Assuming the initial drift is 0
% b1 is assumed to be 200, b2[k=1] assumed to be -400
%% the algorithm
v=5;
while(get(handles.UseK,'Value'))
%get covariances
x_est=A*x
P_est=A*P*A.'+Qk
sample_vector = handles.s_in1.startForeground();
I = mean(sample_vector(:,2));% average of the 200 samples
Q = mean(sample_vector(:,1));% average of the 200 samples
beta=unwrap(atan2(I,Q)); % measurment of beta
K=P*H.'*inv(H*P*H.'+Rk) %kalman gain
x=x_est+K*(beta-H*x_est)
P=P_est-K*H*P_est
vo=v;
v=x(1);
outputSingleScan(handles.s_output1,v);
end
您的过程模型与您的描述不符。你的代码是从你的描述中估计'x [k]',但是在你的描述中它听起来像'x [k]'。如果'x [k]'真的处于你的状态,那么'H'不会评估'mx + b'。评估'x [2] * x [1] + x [3]'不会是一个线性矩阵运算。 –
我会说清楚 - x [k]没有给出。我想估计正确的x [k],所以它会得到我想要的y [k]。当v和b2是我的状态向量的两个元素时,H正在评估beta [k] = b1 * v [k] + b2 [k]。 – Shaked