转自:https://blog.csdn.net/zhangquan2015/article/details/79264540

卡尔曼滤波应用及其matlab实现

2018年02月11日 20:32:18 Joeyos 阅读数 21935

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/zhangquan2015/article/details/79264540

Github个人博客:https://joeyos.github.io

线性卡尔曼滤波

卡尔曼滤波在温度测量中的应用

X(k)=AX(k-1)+TW(k-1)
Z(k)=H*X(k)+V(k)

房间温度在25摄氏度左右,测量误差为正负0.5摄氏度,方差0.25,R=0.25。Q=0.01,A=1,T=1,H=1。

假定快时刻的温度值、测量值为23.9摄氏度,房间真实温度为24摄氏度,温度计在该时刻测量值为24.5摄氏度,偏差为0.4摄氏度。利用k-1时刻温度值测量第k时刻的温度,其预计偏差为:
P(k|k-1)=P(k-1)+Q=0.02
卡尔曼增益k=P(k|k-1) / (P(k|k-1) + R)=0.0741

X(k)=23.9+0.0741*(24.1-23.9)=23.915摄氏度。

k时刻的偏差为P(k)=(1-K*H)P(k|k-1)=0.0186。
最后由X(k)和P(k)得出Z(k+1)。

matlab实现为:

% 程序说明:Kalman滤波用于温度测量的实例
function main
N=120;
CON=25;%房间温度在25摄氏度左右
Xexpect=CON*ones(1,N);
X=zeros(1,N);
Xkf=zeros(1,N);
Z=zeros(1,N);
P=zeros(1,N);
X(1)=25.1;
P(1)=0.01;
Z(1)=24.9;
Xkf(1)=Z(1);
Q=0.01;%W(k)的方差
R=0.25;%V(k)的方差
W=sqrt(Q)*randn(1,N);
V=sqrt(R)*randn(1,N);
F=1;
G=1;
H=1;
I=eye(1);
%%%%%%%%%%%%%%%%%%%%%%%
for k=2:NX(k)=F*X(k-1)+G*W(k-1);  Z(k)=H*X(k)+V(k);X_pre=F*Xkf(k-1);           P_pre=F*P(k-1)*F'+Q;        Kg=P_pre*inv(H*P_pre*H'+R); e=Z(k)-H*X_pre;            Xkf(k)=X_pre+Kg*e;         P(k)=(I-Kg*H)*P_pre;
end
%%%%%%%%%%%%%%%%
Err_Messure=zeros(1,N);
Err_Kalman=zeros(1,N);
for k=1:NErr_Messure(k)=abs(Z(k)-X(k));Err_Kalman(k)=abs(Xkf(k)-X(k));
end
t=1:N;
figure('Name','Kalman Filter Simulation','NumberTitle','off');
plot(t,Xexpect,'-b',t,X,'-r',t,Z,'-k',t,Xkf,'-g');
legend('expected','real','measure','kalman extimate');
xlabel('sample time');
ylabel('temperature');
title('Kalman Filter Simulation');
figure('Name','Error Analysis','NumberTitle','off');
plot(t,Err_Messure,'-b',t,Err_Kalman,'-k');
legend('messure error','kalman error');
xlabel('sample time');
%%%%%%%%%%%%%%%%%%%%%%%%%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51


卡尔曼滤波在自由落体运动目标跟踪中的应用

%%%%%%%%%%%%%
% 卡尔曼滤波用于自由落体运动目标跟踪问题
%%%%%%%%%%%%%%
function main
N=1000; %仿真时间,时间序列总数
%噪声
Q=[0,0;0,0];%过程噪声方差为0,即下落过程忽略空气阻力
R=1; %观测噪声方差
W=sqrt(Q)*randn(2,N);%既然Q为0,即W=0
V=sqrt(R)*randn(1,N);%测量噪声V(k)
%系数矩阵
A=[1,1;0,1];%状态转移矩阵
B=[0.5;1];%控制量
U=-1;
H=[1,0];%观测矩阵
%初始化
X=zeros(2,N);%物体真实状态
X(:,1)=[95;1];%初始位移和速度
P0=[10,0;0,1];%初始误差
Z=zeros(1,N);
Z(1)=H*X(:,1);%初始观测值
Xkf=zeros(2,N);%卡尔曼估计状态初始化
Xkf(:,1)=X(:,1);
err_P=zeros(N,2);
err_P(1,1)=P0(1,1);
err_P(1,2)=P0(2,2);
I=eye(2); %二维系统
%%%%%%%%%%%%%
for k=2:N%物体下落,受状态方程的驱动X(:,k)=A*X(:,k-1)+B*U+W(k);%位移传感器对目标进行观测Z(k)=H*X(:,k)+V(k);%卡尔曼滤波X_pre=A*Xkf(:,k-1)+B*U;%状态预测 P_pre=A*P0*A'+Q;%协方差预测Kg=P_pre*H'*inv(H*P_pre*H'+R);%计算卡尔曼增益Xkf(:,k)=X_pre+Kg*(Z(k)-H*X_pre);%状态更新P0=(I-Kg*H)*P_pre;%方差更新%误差均方值err_P(k,1)=P0(1,1);err_P(k,2)=P0(2,2);
end
%误差计算
messure_err_x=zeros(1,N);%位移的测量误差
kalman_err_x=zeros(1,N);%卡尔曼估计的位移与真实位移之间的偏差
kalman_err_v=zeros(1,N);%卡尔曼估计的速度与真实速度之间的偏差
for k=1:Nmessure_err_x(k)=Z(k)-X(1,k);kalman_err_x(k)=Xkf(1,k)-X(1,k);kalman_err_v(k)=Xkf(2,k)-X(2,k);
end
%%%%%%%%%%%%%%%
%画图输出
%噪声图
figure
plot(V);
title('messure noise')
%位置偏差
figure
hold on,box on;
plot(messure_err_x,'-r.');%测量的位移误差
plot(kalman_err_x,'-g.');%卡尔曼估计位置误差
legend('测量误差','kalman估计误差')
figureplot(kalman_err_v);
title('速度误差')
figure
plot(err_P(:,1));
title('位移误差均方值')
figure
plot(err_P(:,1));
title('速度误差均方值')
%%%%%%%%%%%%%%%%%%%%%%%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73


卡尔曼滤波在船舶GPS导航定位






%  Kalman滤波在船舶GPS导航定位系统中的应用
function main
clc;clear;
T=1;%雷达扫描周期
N=80/T;%总的采样次数
X=zeros(4,N);%目标真实位置、速度
X(:,1)=[-100,2,200,20];%目标初始位置、速度
Z=zeros(2,N);%传感器对位置的观测
Z(:,1)=[X(1,1),X(3,1)];%观测初始化
delta_w=1e-2;%如果增大这个参数,目标真实轨迹就是曲线
Q=delta_w*diag([0.5,1,0.5,1]) ;%过程噪声均值
R=100*eye(2);%观测噪声均值
F=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1];%状态转移矩阵
H=[1,0,0,0;0,0,1,0];%观测矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for t=2:NX(:,t)=F*X(:,t-1)+sqrtm(Q)*randn(4,1);%目标真实轨迹Z(:,t)=H*X(:,t)+sqrtm(R)*randn(2,1); %对目标观测
end
%卡尔曼滤波
Xkf=zeros(4,N);
Xkf(:,1)=X(:,1);%卡尔曼滤波状态初始化
P0=eye(4);%协方差阵初始化
for i=2:NXn=F*Xkf(:,i-1);%预测P1=F*P0*F'+Q;%预测误差协方差K=P1*H'*inv(H*P1*H'+R);%增益Xkf(:,i)=Xn+K*(Z(:,i)-H*Xn);%状态更新P0=(eye(4)-K*H)*P1;%滤波误差协方差更新
end
%误差更新
for i=1:NErr_Observation(i)=RMS(X(:,i),Z(:,i));%滤波前的误差Err_KalmanFilter(i)=RMS(X(:,i),Xkf(:,i));%滤波后的误差
end
%画图
figure
hold on;box on;
plot(X(1,:),X(3,:),'-k');%真实轨迹
plot(Z(1,:),Z(2,:),'-b.');%观测轨迹
plot(Xkf(1,:),Xkf(3,:),'-r+');%卡尔曼滤波轨迹
legend('真实轨迹','观测轨迹','滤波轨迹')
figure
hold on; box on;
plot(Err_Observation,'-ko','MarkerFace','g')
plot(Err_KalmanFilter,'-ks','MarkerFace','r')
legend('滤波前误差','滤波后误差')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算欧式距离子函数
function dist=RMS(X1,X2);
if length(X2)<=2dist=sqrt( (X1(1)-X2(1))^2 + (X1(3)-X2(2))^2 );
elsedist=sqrt( (X1(1)-X2(1))^2 + (X1(3)-X2(3))^2 );
end
%%%%%%%%%%%%%%%%%%%%%%%%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

卡尔曼滤波在视频目标跟踪中的应用

帧间差法目标检测

% 目标检测函数,这个函数主要完成将目标从背景中提取出来
function detect
clear,clc;
%计算背景图片数目
Imzero = zeros(240,320,3);
for i = 1:5%将图像文件读入矩阵ImIm{i} = double(imread(['DATA/',int2str(i),'.jpg']));Imzero = Im{i}+Imzero;
end
Imback = Imzero/5;
[MR,MC,Dim] = size(Imback);
%遍历所有图片
for i = 1 : 60%读取所有帧Im = (imread(['DATA/',int2str(i), '.jpg']));imshow(Im); %显示图像Im,图像对比度低Imwork = double(Im);%检测目标[cc(i),cr(i),radius,flag] = extractball(Imwork,Imback,i);if flag==0 %没检测到目标,继续下一帧图像continueendhold onfor c = -0.9*radius: radius/20 : 0.9*radiusr = sqrt(radius^2-c^2);plot(cc(i)+c,cr(i)+r,'g.')plot(cc(i)+c,cr(i)-r,'g.')endpause(0.02)
end
%目标中心的位置,也就是目标的x,y坐标
figure
plot(cr,'-g*')
hold on
plot(cc,'-r*')


http://www.taodudu.cc/news/show-3010936.html

相关文章:

  • Tiny语言编译器简单介绍
  • Tiny6410之重定位代码到SRAM+4096
  • 框架复习(一):不如写个tiny-Spring?(完整版)
  • 关于RTX51-Tiny,一种适用于51的RTOS
  • Tiny-DSOD: Lightweight Object Detection for Resource-Restricted Usages
  • TinyOS论文11:Sentomist
  • Linux输入子系统框架
  • RTX51tiny 复杂应用---时钟、温度显示、按键解析
  • Tiny4412裸机程序之代码在DDR SDRAM中运行
  • Tiny web
  • tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】
  • tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示
  • Tiny Core Linux 安装配置
  • tiny4412 裸机程序 六、重定位代码到IRAM+0x8000
  • AIoT应用创新大赛-基于TencentOS Tiny 的遥控小车
  • tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
  • tiny4412 裸机程序 八、重定位到DRAM及LCD实验
  • tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
  • Tiny4412裸机程序之代码重定位初体验
  • wps字体颜色怎么改
  • ubuntu14.04 wps字体缺失问题
  • Ubuntu18.04安装WPS字体缺失的解决方案
  • ubuntu上wps字体缺失错误解决
  • 解决Linux上WPS字体缺失问题
  • Ubuntu下配置WPS字体
  • 解决WPS字体的问题
  • wps字体
  • wps的linux文字显示模糊,WPS字体模糊不清晰怎么回事
  • Qt - WPS文本编辑器(WPS字体格式)
  • 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件

卡尔曼滤波matlab程序实现相关推荐

  1. ukf实测信号的预测 matlab,ukf(无迹卡尔曼滤波)算法的matlab程序.

     ukf(无迹卡尔曼滤波)算法的matlab程序. function [x,P]=ukf(fstate,x,P,hmeas,z,Q,R) % UKF   Unscented Kalman Filt ...

  2. ukf(无迹卡尔曼滤波)算法的matlab程序.

     ukf(无迹卡尔曼滤波)算法的matlab程序. function [x,P]=ukf(fstate,x,P,hmeas,z,Q,R) % UKF   Unscented Kalman Filt ...

  3. 基于自适应无迹卡尔曼滤波算法(AUKF)锂电池SOC估计,噪声系数自适应 Matlab程序

    基于自适应无迹卡尔曼滤波算法(AUKF)锂电池SOC估计,噪声系数自适应 Matlab程序 仿真模型建模数据mat Sci一篇参考文献 ID:77100657373800632张徳帅123

  4. fcm算法的MATLAB实现,FCM算法的matlab程序(初步)

    FCM算法的matlab程序 1.采用iris数据库 iris_data.txt 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0 ...

  5. matlab 流程计算方法,吸波材料LLG公式计算复磁导率的过程及matlab程序

    看到一篇paper,利用Landau-Lifshitz-Gilbert 公式计算片状颗粒的复磁导率.(JAP 107,033913, 2010) http://scitation.aip.org/co ...

  6. matlab图像定位分割,車牌定位matlab程序:通過hsv彩色分割方式定位車牌

    最近看了<基於數字圖像處理的車牌識別研究>這篇論文,對車牌識別知識講的很仔細,推薦. 1.(摘自<基於數字圖像處理的車牌識別研究>) 通過對大量車牌圖像的分析,可以發現對於具有 ...

  7. matlab dfp法,DFP算法及Matlab程序.docx

    DFP算法及Matlab程序 作业二 用DFP算法求解,取,.一.求解:求迭代点x1令,得的极小值点,所以得:于是,由DFP修正公式有下一个搜索方向为求迭代点x2令,得的极小值点于是得:,所以:,因H ...

  8. matlab程序eX2_2是什么意思,第2章 MATLAB程序设计

    第2章MATLAB程序设计基础 Matlab以矩阵为运算单元,除非特殊需要,矩阵不必事先定义维数大小.Matlab还提供了丰富的矩阵运算函数,如求逆矩阵的inv函数,求方阵行列式的det函数,求矩阵特 ...

  9. 不用工具箱的神经网络matlab程序_MATLAB中的神经网络工具箱(2)函数命令及模型搭建...

    前面介绍了神经网络工具箱GUI的使用,它功能强大可以直接生成脚本.但是函数命令的灵活性是GUI所不及的.也应该有所了解. 神经网络函数命令 1.网络创建函数 函数名称 功能 fitnet 创建函数拟合 ...

最新文章

  1. Linux - CentOS 6.3 (x86_64)安装过程详细图解
  2. 1.3 继承(extends)
  3. antlr4例子_ANTLR和网络:一个简单的例子
  4. 计算机五个盘,电脑分盘分几个盘合适,您知道吗?
  5. 《达芬奇密码》中的yinhui
  6. 利用msfvenom渗透win7
  7. matlab dll 通达信,通达信DLL插件实战篇,怎样制作我们想要的函数
  8. Jenkins+Gitlab+Ansible自动化部署(六)
  9. java fact函数_Fact 定义一个类Fact表示无符号有理数(分数) 联合开发网 - pudn.com...
  10. Freetype的使用
  11. 在计算机桌面如何切换成大图标,win7系统桌面图标怎么设置大小 win7电脑桌面图标大小更改方法...
  12. 面向异构众核超级计算机的大规模稀疏计算性能优化研究
  13. 5G NR 下行同步SSB(2)-- PSS和SSS的用途
  14. PHP远程文件包含(RFI)并绕过远程URL包含限制
  15. Python 与金融科技5|批量抓取并保存上证50的交易数据
  16. 基于Multisim的自动售货的电路课程设计
  17. 爱奇艺龙勇:如何搭建自己的React Native框架-CSDN公开课-专题视频课程
  18. 3G到底有多快 三家运营商3G网速大比拼
  19. 批量将XPS转成Word的免费方法
  20. 兰卡斯特大学计算机专业世界排名,2019上海软科世界一流学科排名计算机科学与工程专业排名兰卡斯特大学排名第101-150...

热门文章

  1. 第五章第二十九题(显示日历)(Display calendars)
  2. 团队作业(2)项目选题
  3. 拓扑排序基本题目(一) OpenJ_Bailian - 4084
  4. Qt编写可视化大屏电子看板系统10-改造QCustomPlot
  5. 《非Pad勿扰》风靡平板电脑界
  6. 茶饮品牌搅局咖啡市场,咖啡加盟领域风起云涌
  7. 想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗
  8. ProM安装以及配置
  9. 搭建无线监控云存储服务器,mac 篇二:自建docker视频录像机NVR存储-家用摄像头云存储服务zoneminder...
  10. 空间大战java_回忆S60(塞班)年代的JAVA游戏:有没有哪一款是你在课堂偷偷玩的?...