卡尔曼滤波matlab示例

卡尔曼滤波matlab示例

% 卡尔曼滤波实验
clc;
clear all;
close all;
%==过程移噪声和观测噪声的估计是否加噪=======
noise_flag=0;%如果加噪赋值1,否则赋值0
Q_N=100;% 对过程噪声方差Q估计的噪声方差
R_N=100;
Q_N_Mean=0;
R_N_Mean=0;
%============================================
N=20;
% 过程噪声方差Q
Q = 0.5;
% 观测噪声方差R
R = 100;
H=1;% 观测矩阵
A=1;% 转移矩阵
B=1;% 控制矩阵
u=ones(1,20);% 控制量
x(1)=0;% 初始x
p(1)=0;
I=eye(1,1);
for ii = 1:N-1
    x(ii+1)=x(ii)*A+B*u(ii)+sqrt(Q)*randn(1,1);
    % 真实运动情况为
    % 转移增量(来自于上一次运动)+控制增量(来自外部控制)+噪声(过程噪声)
end
for ii=1:N
    z(ii)=H*x(ii)+sqrt(R)*randn(1,1);
    % 观测情况为
    % 观测量(来自此时刻观测值)+噪声(观测噪声)
end
x_hat_prior(1)=x(1);
for k=1:N-1
    if noise_flag==1
    noiseQ=sqrt(Q_N)*randn(1,1)+Q_N_Mean;
    noiseR=sqrt(R_N)*randn(1,1)+R_N_Mean;
    else 
    noiseQ=0;
    noiseR=0;
  	end
    x_hat_prior(k+1)= A*x_hat_prior(k)+B*u(k);
    p_prior(k+1)=A*p(k)*A'+(Q+noiseQ);
    K(k+1)=(p_prior(k+1)*H')/(H*p_prior(k+1)+(R+noiseR));
    x_hat(k+1)=x_hat_prior(k+1)+K(k+1)*(z(k+1)-H*x_hat_prior(k+1));
    p(k+1)=(I-K(k+1)*H)*p_prior(k+1);
end
image=figure(1);
subplot(2,1,1);
plot(1:N,x,'g');
hold on;
plot(1:N,z,'b-.');
plot(1:N,x_hat,'r--');
legend('真实值','观测值','估计值');
hold off;
e_z=abs(x-z);
e_h=abs(x-x_hat);
subplot(2,1,2);
plot(1:N,e_z,'r');
hold on;
plot(1:N,e_h,'b');
legend('观测误差','估计误差');
hold off;

在这里插入图片描述
卡尔曼滤波是针对多数据来源的一种取舍方法,根据对数据来源中噪声大小去分析更应该偏向于哪种消息来源。一种是观测值,一种是计算值,都有噪声的情况下需要先明确目前各自噪声大小。再由计算式得出理论计算得来的先验估计,以及通过后验初始误差的协方差和过程噪声协方差得到下一步的先验误差协方差;以上是预测部分,接下来是校正,计算卡尔曼增益以及后验估计,并且更新后验误差的协方差;以上讲的很笼统,具体推到推荐视频:Kalaman filter—DR_CAN_https://space.bilibili.com/230105574?spm_id_from=333.788.b_765f7570696e666f.2
虽然大多数讲卡尔曼的文章给出解释很生动,但是这个是唯一让人听懂,明白的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值