40行MATLAB代码实现卡尔曼滤波-简单易懂

这篇具有很好参考价值的文章主要介绍了40行MATLAB代码实现卡尔曼滤波-简单易懂。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

最近学习了卡尔曼滤波,体会到了数据融合下进行最优估计的思想。如果你也是小白,可以通过这个例子自己动手感受数据融合。

学习资料参考B站大神DR_CAN博士,连接:【卡尔曼滤波器】直观理解与二维实例

2 案例

基于上述视频中Excel的例子,使用MATLAB编写了一个简单的卡尔曼滤波器,40行代码,简单易懂。

这是一个给匀速行走的人定位的例子,

卡尔曼滤波matlab代码,MATLAB建模,MATLAB教程,MATLAB仿真,matlab,线性代数,矩阵,Powered by 金山文档

假设人作匀速直线运动,根据匀速运动数学模型,就可以得到位置和速度信息(X)。但路上有各种因素,所以这个模型并非理想的,存在一定的误差W

另外通过卫星(Global Positioning System,GPS)也可以得到人的位置和速度信息(Z),也存在一定的观测误差V

其中,W和V相互独立,并且都满足均值为0的正态分布。

使用卡尔曼滤波的目的就是:根据上面两种不够精确的方法得到的数据给出一个比较准确的估计

更新公式如下:

卡尔曼滤波matlab代码,MATLAB建模,MATLAB教程,MATLAB仿真,matlab,线性代数,矩阵,Powered by 金山文档

3 代码实现

代码如下:

close all
clear
clc

%%
Q = [1 0;0 1]; %过程误差,Q矩阵
R = [0.1 0;0 0.1]; %观测误差,R矩阵
A = [1 1;0 1]; %A矩阵
H = [1 0;0 1]; %H矩阵
I = [1 0;0 1]; %单位矩阵
epoch = 30;
P = [1 0;0 1];
X = ones(epoch, 2); %生成位置和速度矩阵
X(1,:) =  [0 1];  %初始的实际位置和速度(从位置0开始,假定以匀速1运动)
Xa = ones(epoch, 2);  %用a表示头上的小帽子,后验
Xa(1,:) = [0 1];
Xa_ = ones(epoch, 2);  %先验
Xa_(1,:) = [0 1];  %初始化先验
Z = ones(epoch, 2); %测量的位置和速度
Z(1,:) = [0 1]; %初始测量的位置和速度
for k = 2:epoch
    %更新误差
    w1 = normrnd(0,sqrt(Q(1,1))); %位置过程误差
    w2 = normrnd(0,sqrt(Q(2,2))); %速度过程误差
    W = [w1 w2];
    v1 = normrnd(0,sqrt(R(1,1))); %观测位置过程误差
    v2 = normrnd(0,sqrt(R(2,2))); %观测速度过程误差
    V = [v1 v2];
    %更新实际位置、实际速度
    X(k,:) = (A*X(k-1,:)'+ W')';
    %更新测量位置、测量速度
    Z(k,:) = (H*X(k,:)' + V')';
    %预测
    P_ = A*P*A' + Q;
    Xa_(k,:) = (A*Xa(k-1,:)')'; %先验
    %校正
    K = P_*H'*inv((H*P_)*H' + R);
    P = (I -  K*H)*P_;
    Xa(k,:) = (Xa_(k,:)' + K*(Z(k,:)' - H*Xa_(k,:)'))';
end
%通过以下三个值比较平均绝对误差。mae_Xa 小于mae_Xa_和mae_Z,说明融合有效
mae_Xa = sum(abs(Xa(:,1)-X(:,1)));
mae_Xa_ = sum(abs(Xa_(:,1)-X(:,1)));
mae_Z = sum(abs(Z(:,1)-X(:,1)));
plot(1:epoch, X(:,1), 'r*-', 1:epoch, Z(:,1), '-b*', 1:epoch, Xa_(:,1), '-g*', 1:epoch, Xa(:,1), '-k*','LineWidth',2)

hold on
xlabel step
ylabel 位置
legend('实际位置', '测量位置', '先验估计位置', '后验估计位置')

结果分析

下面分析几种情况

4.1 过程误差标准差为1,测量误差标准差为0.1

这种情况下,可以想象男孩蒙着眼在家里运动,连自己都不清楚自己在哪个位置,但他老爸坐在沙发上看着他,说他在电视机旁。老爸是旁观者,并且睁着眼,所以观测误差很小

这种场景下,老板的测量位置应该很接近实际位置。而男孩因为是蒙着眼运动,很难根据自己先前的估计位置继续估计自己现在的位置。

通过下图也可以看出,绿色的先验估计位置曲线偏离红色的实际位置,而蓝色的测量位置很接近实际位置。黑色曲线为后验估计位置,这个位置就是先验估计位置和测量位置数据融合得到的结果,也非常贴近实际位置。

卡尔曼滤波matlab代码,MATLAB建模,MATLAB教程,MATLAB仿真,matlab,线性代数,矩阵,Powered by 金山文档

4.2 过程误差标准差为0.1,测量误差标准差为1

这种情况下,测量位置准确率低,偏离实际位置较远。但需要注意的是,过程标准差小,不意味着先验估计位置就足够准确,先验估计位置由上一步的后验估计位置计算得到,包含了过程误差和测量误差。

卡尔曼滤波matlab代码,MATLAB建模,MATLAB教程,MATLAB仿真,matlab,线性代数,矩阵,Powered by 金山文档

文章就写到这,留一个问题:为什么卡尔曼估计结果(后验估计位置)并不总是最接近实际位置?文章来源地址https://www.toymoban.com/news/detail-760356.html

到了这里,关于40行MATLAB代码实现卡尔曼滤波-简单易懂的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【状态估计】粒子滤波器、Σ点滤波器和扩展/线性卡尔曼滤波器研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 扩展卡尔曼滤波 2.2 线性卡尔曼滤波 

    2024年02月09日
    浏览(28)
  • 【状态估计】基于线性卡尔曼滤波器和粒子滤波器无人机估计地形高度(Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文模

    2024年02月16日
    浏览(28)
  • 使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及文章 本文

    2024年02月10日
    浏览(39)
  • 【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 IEEE14节点  ​ 2.2 IEEE30节点  ​  2.3 

    2024年02月07日
    浏览(28)
  • 卡尔曼滤波器原理讲解及其matlab实现

    目录 一:卡尔曼滤波器的信号模型[1-2] 二:其他方程及变量介绍 三:卡尔曼滤波器递推公式 四:matlab仿真[3] 参考文献: 引言:在进行一些信号处理的过程中,我们通常会采集到一些数据,但是实际测量到的数据是受到噪声干扰了之后的,故与真实的数据有一些偏差。因此

    2023年04月08日
    浏览(28)
  • 滤波算法 | 无迹卡尔曼滤波(UKF)算法及其MATLAB实现

    本文接着分享位姿跟踪和滤波算法中用到的一些常用程序,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~) 本文分享无迹卡尔曼滤波(UKF)算法的一些基本公式和MATLAB程序。 首先简单介绍一下UKF滤

    2023年04月15日
    浏览(31)
  • 基于卡尔曼滤波检测GNSS 数据中的智能手机位移附matlab代码

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信       无

    2024年04月25日
    浏览(25)
  • 卡尔曼滤波原理及c++代码实现

    最近重新看到了卡尔曼滤波,想把这部分的原理整理写下来。供需要的人理解和学习。 一键三连,点赞收藏关注! 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法,“optimal recursivedata processing algorithm(

    2024年02月07日
    浏览(28)
  • 扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)

           上次分享了一个扩展卡尔曼滤波估计SOC的代码,得到了很多小伙伴的支持,今天再分享一个很好用的扩展卡尔曼滤波估计SOC的程序。使用MATLAB语言完成程序的编写。         有关EKF的推导及原理请看我写的另一个博客:基于扩展卡尔曼滤波的SOC估计(附MATLAB代码)文章

    2024年02月06日
    浏览(43)
  • 卡尔曼滤波器的定义,实例和代码实现

    卡尔曼滤波器(Kalman filter)是一种高效的递归滤波器, 能够从一系列包含噪音的测量值中估计动态系统的状态. 因为不需要存储历史状态, 没有复杂计算, 非常适合在资源有限的嵌入式系统中使用. 常用于飞行器的导引, 导航及控制, 机械和金融中的时间序列分析, 轨迹最佳化等. 卡

    2024年03月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包