|
小弟最近学习卡尔曼滤波,手头上正好有角度摆(陀螺仪和加速度计)。
下面是我的建模方程:
[x1(t+1); x2(t+1)] = [1, -T; 0, 1][x1(t); x2(t)] + [Ts; 0]ugyro(t) + w(t)
z(t) = [1; 0][x1(t); x2(t)] + v(t)
x1 = 角度
x2 = 陀螺仪的漂移
下面是我写的MATLAB代码,大家不要喷我。
%两个状态变量:1、为角度;2、为陀螺仪的误差。
n=300;
x1=4;
for i=1:n
real_value(i)=x1;
end
R=100; %测量方差
w=sqrt(R)*randn(1,n);%观测噪声
yuce=zeros(2,n);
A=[1,-0.02;0,1];
B=[0.02;0];
C=[1,0];
y=w+x1;%测量方程
X=[0;0];%初始状态
P0=[0.005,0.005;0.005,0.005];
Q=[0.5,0;0,0.01];
P1=zeros(2,2);
%---------------------------
for i=1:n;
tempx=X; %迭代
%-----------------------
xdot=A*tempx+B; %预测
P1=A*P0*A'+Q; %预测
%----------------------
K=P1*C'*inv(C*P1*C'+R); %用于修正
%------------------------
x=xdot+K*(y(i)-C*xdot); %修正
P0=P1-K*C*P1;
%----------迭代-----------
X=x; %迭代,最优估计值作为下一次的迭代值
yuce(1,i)=x(1);
end
figure
plot(y,'b'); %加入噪声后的角度值
hold on
plot(real_value,'k'); %真实角度值
hold on
plot(yuce(1,:),'r'); %滤波后的角度值
title('角度大小');
现在比较困惑我的是其中的Q(过程噪声)和R(测量噪声)的选取问题。网上也没有找到关于这方面的信息。
我自己关于R(测量噪声)的想法是:用加速度计测量出一组数据,直接拉到MATLAB求取方差,但是不知道这个对不对。
还有关于Q的选取就更加没有头绪了,有的人说用经验选取,是不是给一个很小的Q值,然后看滤波效果,然后不断调整呢?这个也太麻烦了,也有说用自适应的。 |
|