卡尔曼滤波(Kalman Filtering)——(6)MATLAB仿真(保姆级)

一、卡尔曼滤波的实际应用

  在这里依旧以前面提到的测量硬币为例进行MATLAB仿真。现有一枚硬币为了这枚硬币的直径,我们进行了多次测量,但是所使用的的尺子存在一定误差,人进行测量的过程中存在测量误差,而且由常识可以估算硬币的直径得到估计值。所以测量所得到的值与估计值哪一个更接近真实值呢?
已知:硬币直径真实值为50mm;
   首次估计误差为40mm;
   过程误差方差为4e-4;
   尺子的误差方差为3。

二、流程图

  由前面几篇博客对卡尔曼滤波公式进行了仔细的推导,一共得到了五大公式。卡尔曼滤波的过程就是对系统进行预测加矫正的过程,两者循环迭代使系统逐渐趋近于真实值。下面就是卡尔曼滤波过程的流程图。

三、执行过程

  一、由k-1次估计的硬币直径 x ^ k − 1 \hat{x}_{k-1} x^k1 去估计第k次系统的状态值(直径) x ^ k − , x ^ k − = A x ^ k − 1 + B u k − 1 \hat{x}_{k}^{-}, \hat{x}_{k}^{-}=A \hat{x}_{k-1}+B u_{k-1} x^k,x^k=Ax^k1+Buk1, 对应于本例中系统无输入 u k − 1 = 0 u_{k-1} = 0 uk1=0 A = H = I ; Q = 4 e − 4 ; R = 3 A = H= I;Q = 4e-4;R = 3 A=H=IQ=4e4;R=3。则 x ^ k − = x ^ k − 1 = 40 m m \hat{x}_{k}^{-}=\hat{x}_{k-1}=40mm x^k=x^k1=40mm

  二、由上一次的误差协方差 P k − 1 P_{k-1} Pk1 和过程噪声Q预测新的误差 P k − , P k − = P_{k}^{-}, P_{k}^{-}= Pk,Pk= A P k − 1 A T + Q A P_{k-1} A^{T}+Q APk1AT+Q, 对应于本例中 P k − = 5 P_{k}^{-}=5 Pk=5

  三、计算卡尔曼增益, K k = P k − H T ( H P k − H T + R ) − 1 K_{k}=P_{k}^{-} H^{T}\left(H P_{k}^{-} H^{T}+R\right)^{-1} Kk=PkHT(HPkHT+R)1, 对应于本例中 K k = K_{k}= Kk= 5 / ( 5 + 3 ) , K k = 0.625 5/\left(5+3\right), \quad K_{k}=0.625 5/(5+3),Kk=0.625

  四、 进行校正更新, x ^ k = x ^ k − + K k ( z k − H x ^ k − ) \hat{x}_{k}=\hat{x}_{k}^{-}+K_{k}\left(z_{k}-H \hat{x}_{k}^{-}\right) x^k=x^k+Kk(zkHx^k), 对应于上例中 x ^ k = 40 + 0.625 ∗ \hat{x}_{k}=40+0.625 * x^k=40+0.625 ( z k − 40 ) (z_{k}-40) (zk40), 此 x ^ k \hat{x}_{k} x^k 即为 k \mathrm{k} k 时刻的最优直径。

  五、为下一步估计 k + 1 \mathrm{k}+1 k+1 时刻的最优温度值的迭代进行更新操作, 级更新 P k P_{k} Pk 值, P k = ( I − K k H ) P k − , P_{k}=\left(I-K_{k} H\right) P_{k}^{-}, \quad Pk=(IKkH)Pk, 对应于上例中的 ( 1 − K k ) ∗ 5 = 1.875 \left(1-K_{k}\right) * 5=1.875 (1Kk)5=1.875

方法kalman 公式对应本例kalman 公式
先验估计 x ^ k − = A x ^ k − 1 + B u k − 1 \hat{x}_{k}^-=A \hat{x}_{k-1}+B u_{k-1} x^k=Ax^k1+Buk1 x ^ k − = x ^ k − 1 \hat{x}_{k}^{-}=\hat{x}_{k-1} x^k=x^k1
先验误差协方差矩阵 P k − = A P k − 1 A T + Q P_{k}^{-}=A P_{k-1} A^{T}+Q Pk=APk1AT+Q P k − = P_{k}^{-}= Pk= P k − 1 + Q P_{k-1} +Q Pk1+Q
卡尔曼增益 K k = P k − H T H P k − H T + R K_{k}=\frac{P_{k}^{-} H^{T}}{H P_{k}^{-} H^{T}+R} Kk=HPkHT+RPkHT K k = P k − P k − + R K_{k}=\frac{P_{k}^{-} }{P_{k}^{-}+R} Kk=Pk+RPk
后验估计 x ^ k = x ^ k − + K k ( z k − H x ^ k − ) \hat{x}_{k}=\hat{x}_{k}^{-}+K_{k}\left(z_{k}-H \hat{x}_{k}^{-}\right) x^k=x^k+Kk(zkHx^k) x ^ k = x ^ k − + K k ( z k − x ^ k − ) \hat{x}_{k}=\hat{x}_{k}^{-}+K_{k}\left(z_{k}- \hat{x}_{k}^{-}\right) x^k=x^k+Kk(zkx^k)
更新误差协方差矩阵 P k = ( I − K k H ) P k − P_{k}=\left(I-K_{k} H\right) P_{k}^{-} Pk=(IKkH)Pk P k = ( I − K k ) P k − P_{k}=\left(I-K_{k} \right) P_{k}^{-} Pk=(IKk)Pk

四、程序代码

本次程序运行环境为WIN7+MATLAB R2018a

% Kalman filter example 
%% 系统描述:
% 1.硬币直径真实值为50mm;
% 2.开始时,硬币直径的估计为40mm,估计误差为5mm;
% 3.尺子的测量误差为3mm;
%% 变量初始化
close all;

% intial parameters
% 计算连续n_iter次数
n_iter = 100;
% size of array. n_iter行,1列
sz = [n_iter, 1];
% 硬币直径的真实值
x = 50;
% 过程方差,反应连续两个次直径方差。更改查看效果
Q = 4e-4;
% 测量方差,反应尺子的测量精度。更改查看效果
R = 3;
% z是尺子的测量结果,在真实值的基础上加上了方差为3的高斯噪声。
z = x + sqrt(R)*randn(sz);
%% 对数组进行初始化
% 对直径的后验估计。即在k次,结合尺子当前测量值与k-1次先验估计,得到的最终估计值
xhat = zeros(sz); 
% 后验估计的方差
P = zeros(sz); 
% 直径的先验估计。即在k-1次,对k时刻直径做出的估计
xhatminus = zeros(sz);
% 先验估计的方差
Pminus = zeros(sz);
% 卡尔曼增益,反应了尺子测量结果与过程模型(即当前时刻与下一次直径相同这一模型)的可信程度
K = zeros(sz); 
% intial guesses
xhat(1) = 40; %直径初始估计值为40mm
P(1) =10; % 误差方差为10
%% kalman 方程
for k = 2:n_iter
    % 时间更新(预测) 
    % 用上一次的最优估计值来作为对本次的直径的预测
    xhatminus(k) = xhat(k-1);
    % 预测的方差为上一次直径最优估计值的方差与过程方差之和
    Pminus(k) = P(k-1)+Q;
    
    % 测量更新(校正)
    % 计算卡尔曼增益
    K(k) = Pminus(k)/( Pminus(k)+R );
    % 结合当前时刻尺子的测量值,对上一次的预测进行校正,得到校正后的最优估计。该估计具有最小均方差
    xhat(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k));
    % 计算最终估计值的方差
    P(k) = (1-K(k))*Pminus(k);
end
%% 作图
FontSize = 14;
LineWidth = 3; % 线宽
figure();
plot(z,'r-*'); %画出尺子的测量值
hold on;
plot(xhat,'b-','LineWidth',LineWidth) %画出最优估计值
hold on;
plot(x*ones(sz),'g-','LineWidth',LineWidth); %画出真实值
grid on;

legend('尺子的测量结果', '后验估计', '真实值');
title('kalman 滤波','fontsize',FontSize);
xl = xlabel('次数');
yl = ylabel('直径(mm)');
set(xl,'fontsize',FontSize);
set(yl,'fontsize',FontSize);
hold off;
set(gca,'FontSize',FontSize);% gca:坐标轴序号

figure();
valid_iter = 2:n_iter; % Pminus not valid at step 1
% 画出最优估计值的方差
plot(valid_iter,P(valid_iter),'LineWidth',LineWidth);
grid on;

legend('后验估计的误差估计');
title('最优估计值的方差','fontsize',FontSize);
xl = xlabel('次数');
yl = ylabel('次数^2');
set(xl,'fontsize',FontSize);
set(yl,'fontsize',FontSize);
set(gca,'FontSize',FontSize);

五、仿真结果

在这里插入图片描述

在这里插入图片描述

参考文献

MATLAB官方文档
二维图绘制官方文档

  • 21
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 卡尔曼滤波是一种用于实时估计动态系统状态的算法。它在许多领域中被广泛应用,如航空航天、导航、机器人等。卡尔曼滤波算法通过结合系统的测量数据和模型预测值,来动态地更新系统的状态估计。它的核心思想是将已有的信息与新的观测结果进行加权平均,从而得到对系统真实状态更准确的估计。 在Matlab中,我们可以通过编写卡尔曼滤波仿真程序来实现对系统状态的估计。首先,我们需要定义系统的状态方程和观测方程,以及系统的初始状态和噪声模型。然后,使用kalman函数来进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 具体而言,我们可以按照以下步骤来编写卡尔曼滤波Matlab仿真程序: 1. 定义系统的状态方程和观测方程,并初始化系统状态和滤波器的状态估计。 2. 定义系统的噪声模型,包括过程噪声和观测噪声的协方差矩阵。 3. 生成系统的真实状态序列和对应的观测数据。 4. 使用kalman函数进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 5. 计算滤波器的误差协方差矩阵,评估滤波器性能。 6. 绘制真实状态序列、观测数据和滤波器估计值的曲线图,以及滤波器误差的方差曲线图。 在编写程序时,我们还可以尝试不同的参数设置和噪声模型,以及对结果进行分析和优化。 总之,通过在Matlab中编写卡尔曼滤波仿真程序,我们可以更好地理解卡尔曼滤波的原理和应用,并对其进行调试和优化,从而实现更准确的状态估计。 ### 回答2: 卡尔曼滤波是一种用于估计状态变量的方法,它通过将测量观测值与先验估计进行加权平均,来获得更准确的状态估计值。这种滤波方法常用于控制系统中,尤其是在传感器测量带有噪声的情况下。 卡尔曼滤波的原理主要包含两个步骤:预测和更新。在预测步骤中,使用系统的状态转移方程预测下一时刻的状态变量;而在更新步骤中,根据已有的观测值和预测值之间的误差,计算卡尔曼增益,从而对预测值进行修正,得到更准确的状态估计。 Matlab是一种广泛使用的科学计算与数据分析工具,提供了丰富的数学函数和工具箱,可以方便地进行卡尔曼滤波仿真。在Matlab中,可以使用kalman函数来实现卡尔曼滤波。具体步骤如下: 1. 定义系统的状态转移方程、观测方程和噪声协方差矩阵。 2. 初始化系统的状态向量和协方差矩阵。 3. 通过循环迭代,对每个时刻进行滤波。 4. 在预测步骤中,使用状态转移方程进行状态的预测。 5. 在更新步骤中,计算观测值与预测值之间的误差,并计算卡尔曼增益。 6. 根据卡尔曼增益修正预测值,得到更准确的状态估计。 7. 更新协方差矩阵,并记录滤波结果。 Matlab还提供了一些用于可视化和分析滤波结果的函数,如plot函数和mean函数等。 通过使用Matlab进行卡尔曼滤波仿真,我们可以观察到滤波结果与真实值的接近程度,评估滤波算法的性能并进行参数调整,以获得更准确的状态估计。这对于控制系统的设计和实际应用具有重要意义。 ### 回答3: 卡尔曼滤波是一种最优化的滤波方法,用于估计系统的状态。它通过融合系统的测量值和预测值,提供对未知状态的最优估计。卡尔曼滤波的原理是基于贝叶斯定理,它假设系统的状态满足线性动力学方程,并且状态的噪声满足高斯分布。在卡尔曼滤波中,有两个主要的步骤:预测步骤和更新步骤。 预测步骤是根据上一个时刻的状态估计值,预测当前时刻的状态估计值和协方差矩阵。更新步骤是通过测量值,根据预测的状态估计值和当前测量值之间的差异,进行状态的修正和协方差矩阵的更新。 Matlab中提供了卡尔曼滤波仿真工具箱,可以通过设置系统模型、测量模型、协方差矩阵以及初始状态值等参数,实现对状态的估计。 随书程序是指在教科书中附带的示例程序。卡尔曼滤波的随书程序是指通过Matlab编写的卡尔曼滤波的代码示例。这些示例程序可以帮助读者理解卡尔曼滤波的原理和应用,并且可以通过修改参数和增加噪声等操作,进行仿真实验,观察估计结果的变化。 通过使用Matlab编写随书程序,读者可以更好地理解卡尔曼滤波算法,掌握卡尔曼滤波的实现方法,并且可以在实际应用中进行调试和参数优化。 总之,卡尔曼滤波原理和应用的随书程序是一种辅助学习和实验的工具,通过使用Matlab编写,可以更好地理解卡尔曼滤波算法,并且可以进行仿真实验,优化参数,提高对系统状态的估计精度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值