卡尔曼滤波实例 附matlab代码

2023-05-16

本章有两个实例,看过关于卡尔曼滤波哔哩哔哩视频的应该知道DR_can,其中实例包括他第四节的excel转换成的matlab代码,还有一个温度的实例。具体的详细步骤在代码段有,不做过多说明。

【卡尔曼滤波器】5_直观理解与二维实例【包含完整的EXCEL代码】_哔哩哔哩_bilibiliKalman Filter 卡尔曼滤波器第5期。一个并不简单的简单例子。EXCEL程序下载链接:https://pan.baidu.com/s/1GdJe2eWIlaQrk2nrjemRCQ 提取码:txn3https://www.bilibili.com/video/BV1dV411B7ME?spm_id_from=333.999.0.0

卡尔曼滤波的五大公式

预测:

xhat_表示先验估计,xhat表示后验估计,带有_的先验估计,不带的后验估计

xhat_(k)=A*xhat(k-1)+B*u(k-1)

Pk_=A*Pk*A'+Q

更新

Kk=Pk_*H'*(H*Pk*H'_+R);

xhat(k)=xhat_(k)+Kk(Zk-H*xhat_(k))

Pk=(I-Kk*H)Pk_;

例题1:

clc
close all

%%首先需要实际值和测量值   需要考虑噪声信号(噪声信号符合高斯分布  期望为0)
delta_t=0.01;   
t=0:delta_t:30;
N = length(t);

A=[1 1;0 1];
H=eye(2);
x_real=zeros(2,N);
x_real(:,1)=[0;1];%首先给出一个相应的估计值
z=zeros(2,N);
w=zeros(2,N);
v=zeros(2,N);
%%噪声信号
for i=1:N
    w(:,i)=1*randn(2,1);
    v(:,i)=1*randn(2,1);
end
%%实际值
for i=2:N
    x_real(:,i)=A*x_real(:,i-1)+w(:,i);
end
%%观测值
for i=1:N
    z(:,i)=H*x_real(:,i)+v(:,i);
end

%%kalman_filter  根据上述得观测值来不断更新  
xhat=zeros(2,N);
xhat(:,1)=[0;1];%首先给出一个相应的估计值
xhat_=zeros(2,N);
Q=[0.1 0;0 0.1];
R=eye(2);
Pk=eye(2);
Pk_bar=zeros(2);
 for i=2:N
    xhat_(:,i)=A*xhat(:,i-1);
    Pk_bar=A*Pk*A'+Q;
    Kk=Pk_bar*H'*inv(H*Pk_bar*H'+R);
    xhat(:,i)= xhat_(:,i)+ Kk*(z(:,i)-H* xhat_(:,i));%最优估计值
    Pk=(eye(2)-Kk*H)*Pk_bar;
end

 

例题2:

%%温度估计卡尔曼

N=100;
dealt=0.01;
%%噪声信号
Q=0.001;%白噪声的方差,过程噪声,加入到了状态转移的过程,均值为0,方差为Q,衡量噪声的大小。
W=sqrt(Q)*randn(1,N);
R=0.25;%测量噪声的方差,均值为0
V=sqrt(R)*randn(1,N);

%%系统矩阵
A=1;%状态转移矩阵,理论方程应该是各个时刻温度恒定的;
G=1;%噪声驱动矩阵
H=1;%观测矩阵,即从状态空间到观测空间的映射。
E=eye(1);%系统1维

%%初始化
x_real=zeros(1,N);
x_real(1,1)=30;
z_obser=zeros(1,N);
z_obser(1)=29.6;

%%估计值和观测值
for i=2:N
    x_real(i)=A*x_real(i-1)+G*W(i);
    z_obser(i)=H* x_real(i)+V(i);
end

xhat_=0;
xhat=zeros(1,N);
% xhat(1)=x_real(1);估计值可以取实际值为初始化的值也可以使用观测值作为初始化的值,两个比较一下还是使用观测值
xhat(1)=z_obser(1);
Pk_bar=0;
Pk=zeros(1,N);
Pk(1)=0.001;%初始值的协方差
E=eye(1);
%%kalman
for i=2:N
   xhat_= A*xhat(i-1);
   Pk_bar=A*Pk(i-1)*A'+Q;
   K=Pk_bar*H'*inv(H*Pk_bar*H'+R);
   xhat(i)= xhat_+K*(z_obser(i)-H*xhat_);%%这个值是最有估计值
   Pk(i)=(E-K*H)*Pk_bar;
end
%误差计算:
error_mea=zeros(1,N);%%测量误差
error_kal=zeros(1,N);%%kalman误差

for k=1:N
    error_mea(k)=abs(z_obser(k)-x_real(k));%测量值和实际值的真实误差
    error_kal(k)=abs(xhat(k)-x_real(k));
end
error_mea;
error_kal;
%%绘图
t=1:N;
figure
plot(t,error_mea,'-b.',t,error_kal,'-r');
xlabel('t');
ylabel('error');
legend('error_mea','error_kal');

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卡尔曼滤波实例 附matlab代码 的相关文章

  • 以虎贲T710为核心的高性能AI开发板-BU99开发板

    文章目录 虎贲T710BU99开发板BU99开发板简介BU99开发板主要优势BU99开发板参数介绍BU99开发板配件 虎贲T710 虎贲T710采用8核CPU架构 xff0c 由4颗2 0GHz的Arm Cortex A75及4颗1 8GH
  • stm32 将int转换成char[]

    int a int i 61 0 j 61 0 char b 61 char a u8 c 4 for i 61 4 i gt 61 0 c j 43 43 61 b i 进行倒序 xff0c 不然显示出来是反的 xff1b USART1W
  • rabbitmq_management

    rabbitmq management是管理后台的插件 我们要开启这个插件才能通过浏览器访问登录页面 进入到sbin目录下 xff1a rabbitmq plugins enable rabbitmq management 开启服务 xff
  • freeRTOS调度

    freeRTOS调度策略 背景 嵌入式的设备开发通常有两种模式 xff1a 裸机开发和OS开发 像功能较为强大的SOC通常都会先一直linux或其他OS然后进行业务逻辑的开发 xff1b 而单片机则有很多简单的应用场景直接使用裸机开发的模式
  • 给树莓派安装Ubuntu mate(20.04LTS)并安装ROS(noetic)

    1 准备好基础的硬件设施 xff0c 然后去下载Ubuntu mate的镜像Ubuntu mate并烧录 PS xff1a 来自2022 7 8的我对曾经帖子的吐槽 xff0c 当时不知道装ROS有小鱼的一键安装 xff0c 如果安装到RO
  • VScode结合docker的ROS开发环境配置

    目录 软件安装VSCODEdocker docker image构建与运行VSCODE配置ROS插件配置clangd配置 软件安装 VSCODE 存在三种安装方式 xff0c 如下 xff1a 在vscode官网下载需要的版本直接进行安装
  • 李开复辞职前后的故事

    这些故事出自即将发售的 世界因你不同 xff1a 李开复自传 一书 xff0c 由李开复本人和北京青年报记者范海涛合写而成 以下为故事部分节选 xff1a 今天 xff0c 我开得很慢 xff0c 仿佛是让自己的心情在辽阔的天空下能够更加安
  • Gazebo仿真环境加载模型错误,卡在启动页面:Spawn service failed. Exiting 解决办法

    编写的功能包加载的世界模型文件路径如下 xff1a ganahe 64 ganahe Nitro AN515 51 catkin ws src autoNav uav ganahe models pwd home ganahe catkin
  • 集成sdk的正确姿势

    其实集成sdk很简单 xff0c 但是大部分人都有过集成sdk的经历 xff0c 而且一般都很痛苦 因为sdk分很多 xff0c 百度地图sdk xff0c 付费sdk xff0c 分享sdk等等 下面就介绍 一下本人集成sdk的一些技巧
  • http协议简析及C++实现HTTP请求

    http是超文本传输协议 xff0c 无状态协议 不同批次无法相互识别 xff0c 无连接协议 xff0c 工作在应用层 xff0c 用于完成从万维网服务器传输超文本到本地浏览器的传输协议 xff0c 完成了文档的快速传输 xff0c 还能
  • Error: Can‘t resolve ‘fs‘ in (Webpack 5.72.0)

    具体报错 xff1a ERROR in node modules handlebars lib index js 17 11 24 Module not found Error Can 39 t resolve 39 fs 39 in 39
  • 步进电机和伺服电机优缺点

    步进电机和伺服电机优缺点 步进电机和伺服电机优 缺点 xff1a 1 低频特性 步进电机在低速运行时会出现低频振动现象 xff0c 电机运行平稳性略逊于伺服电机 交流伺服电机运转非常平稳 xff0c 即使在低速时也不会出现振动现象 2 矩频
  • 十一种通用滤波算法

    十一种通用滤波算法 1 限幅滤波法 又称程序判断滤波法 A 方法 xff1a 根据经验判断 xff0c 确定两次采样允许的最大偏差值 设为A 每次检测到新值时判断 xff1a 如果本次值与上次值之差 lt 61 A xff0c 则本次值有效
  • HALCON:Optical Flow(光流法)

    HALCON xff1a Optical Flow xff08 光流法 xff09 光流法基本原理 光流概念由 Gibson 在 1950 年首先提出来 xff0c 它是一种简单实用的图像运动表达方式 xff0c 通常定义为一个图像序列中图
  • docker-环境搭建

    环境搭建 http www dockone io article 9120 https blog csdn net cloud xy article details 52470265 Docker版本 docker版本分为docker ee
  • 接口测试工具Postman接口测试图文教程

    Postman接口测试工具使用 一 前言 在前后端分离开发时 xff0c 后端工作人员完成系统接口开发后 xff0c 需要与前端人员对接 xff0c 测试调试接口 xff0c 验证接口的正确性可用性 而这要求前端开发进度和后端进度保持基本一
  • 内存的静态分配和动态分配的区别

    内存的静态分配和动态分配的区别主要是两个 xff1a 一是时间不同 静态分配发生在程序编译和连接的时候 动态分配则发生在程序调入和执行的时候 二是空间不同 堆都是动态分配的 xff0c 没有静态分配的堆 栈有2种分配方式 xff1a 静态分
  • Python用pip安装第三方库问题汇总

    1 pip 升级包的时候 xff0c 出现 xff1a Cannot uninstall xxx It is a distutils installed project 的解决方法 xff1b ERROR Cannot uninstall
  • 麻将胡牌算法思路(任意赖子)

    看网上算法穷举 xff0c 枚举 xff0c 剔除特殊情况等等很乱 xff0c 感觉还是写一套通用的逻辑比较好 这个算法前后修改了几次 xff0c 最终在三星s4这种老的安卓机上计算一次时间在0 04s左右 总体思路 xff1a 首先需要一
  • STM32HAL库 ADC结构体应避免直接拷贝赋值

    对ADC1的结构体AdcHandle1赋值并初始化后 xff0c 想要继续初始化ADC2的AdcHandle2 xff0c 想着大部分是一样的 xff0c 可以直接拷贝AdcHandle1 xff0c 也就是 AdcHandle2 61 A

随机推荐