N=200%取200个数
w(1)=0
w=randn(1,N)%产生一个1×N的行向量,第一个数为0,w为过程噪声(其和后边的v在卡尔曼理论里均为高斯白噪声)
x(1)=0%状态x初始值
a=1%a为状态转移阵,此程序简单起见取1
for k=2:N
x(k)=a*x(k-1)+w(k-1) %系统状态方程,k时刻的状态等于k-1时刻状态乘以状态转移阵加噪声(此处忽略了系统的控制量)
end
V=randn(1,N)%测量噪声
q1=std(V)
Rvv=q1.^2
q2=std(x)
Rxx=q2.^2%此方程未用到Rxx
q3=std(w)
Rww=q3.^2%Rvv、Rww分别为过程噪声和测量噪声的协方差(此方程只取一组数方差与协方差相同)
c=0.2
Y=c*x+V%量测方差,c为量测矩阵,同a简化取为一个数
p(1)=0%初始最优化估计协方差
s(1)=0%s(1)表示为初始最优化估计
for t=2:N
p1(t)=a.^2*p(t-1)+Rww%p1为一步估计的协方差,此式从t-1时刻最优化估计s的协方差得到t-1时刻到t时刻一步估计的协方差
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv)%b为卡尔曼增益,其意义表示为状态误差的协方差与量测误差的协方差之比(个人见解)
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1))%Y(t)-a*c*s(t-1)称之为新息,是观测值与一步估计得到的观测值之差,此式由上一时刻状态的最优化估计s(t-1)得到当前时刻的最优化估计s(t)
p(t)=p1(t)-c*b(t)*p1(t)%此式由一步估计的协方差得到此时刻最优化估计的协方差
end
t=1:N
plot(t,s,'r',t,Y,'g',t,x,'b')%作图,红色为卡尔曼滤波,绿色为量测,蓝色为状态
%整体来说,此卡尔曼程序就是一个循环迭代的过程,给出初始的状态x和协方差p,得到下一时刻的x和p,循环带入可得到一系列的最优的状态估计值,此方法通常用于目标跟踪和定位。
%本人研究方向与此有关,有兴趣可以交流下。
状态预测(位置、速度等)的准不准,影响了目标之间能否正确匹配(目标编号)。
上图是多目标跟踪的一个例子,有效跟踪范围为x=0到x=200之间, 红线 表示卡尔曼滤波的 初始化 及 更新 阶段, 绿线 表示 预测 阶段。
当t=1时,
当t=2时,
当t=3时,
当t=4时,
当t=5时,
当t=6时,
由上述分析可知,卡尔曼滤波算法对多目标的状态进行估计,匈牙利算法对多目标进行匹配,实现多目标跟踪。
参考 https://www.pianshen.com/article/9795849360/
公式中 A和H为转移矩阵
clc% 清屏
clear all%删除workspace变量
close all%关掉显示图形窗口
ts=0.001%仿真时间
M=3000%Gen
%Continuous Plant
a=25b=133
sys=tf(b,[1,a,0])%传递函数
dsys=c2d(sys,ts,'z')%离散化
[num,den]=tfdata(dsys,'v')
A1=[0 10 -a]
B1=[0b]
C1=[1 0]
D1=[0]
[A,B,C,D]=c2dm(A1,B1,C1,D1,ts,'z')
Q=1%Covariances of w
R=1%Covariances of v
P=B*Q*B'%Initial error covariance
x=zeros(2,1)%Initial condition on the state
ye=zeros(M,1)
ycov=zeros(M,1)
u_1=0u_2=0
y_1=0y_2=0
for k=1:1:M
time(k)=k*ts
w(k)=0.10*rands(1)%Process noise on u
v(k)=0.10*rands(1)%Measurement noise on y
u(k)=1.0*sin(2*pi*1.5*k*ts)%正弦信号
u(k)=u(k)+w(k)
y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2
yv(k)=y(k)+v(k)
%Measurement update
Mn=P*C'/(C*P*C'+R)
P=A*P*A'+B*Q*B'
P=(eye(2)-Mn*C)*P
x=A*x+Mn*(yv(k)-C*A*x)
ye(k)=C*x+D%Filtered value
errcov(k)=C*P*C'%Covariance of estimation error
%Time update
x=A*x+B*u(k)
u_2=u_1u_1=u(k)
y_2=y_1y_1=ye(k)
end
figure(1)
plot(time,yv,'k:',time,y,'r','linewidth',2)
xlabel('时间(s)')ylabel('y,yv')
grid on
legend('噪声信号','理想信号')
figure(2)
plot(time,y,'r',time,ye,'k:','linewidth',2)
xlabel('时间(s)')ylabel('y,ye')
grid on
legend('理想信号','滤波信号')
figure(3)
plot(time,errcov,'k','linewidth',2)
grid on
xlabel('时间(s)')ylabel('误差协方差')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)