精华内容
下载资源
问答
  • 5包括一维的CV,CA和多项式运动模型。并进行了多次蒙特卡洛的性能比较含一个pdf格式的文档分析说明网上程序众多,坚持一条“去其糟粕,批判吸收”。最好能自己编写,别人的始终不如自己编写的,切记
  • 一维kalman滤波代码,有详细的代码注释。通过简单的例子入门kalman滤波计算方法
  • 卡尔曼滤波的算法,有两个程序。同时有对应的说明和论文。
  • 参考:《卡尔曼滤波原理及应用MATLAB仿真》 原理介绍 假设我们要研究的对象是一个房间的温度。根据经验判断,这个房间的温度大概在25℃左右,可能受空气流通、阳光等因素影响,房间内温度会小幅度地波动。我们以分钟为...

    参考:《卡尔曼滤波原理及应用MATLAB仿真》

    原理介绍

    假设我们要研究的对象是一个房间的温度。根据经验判断,这个房间的温度大概在25℃左右,可能受空气流通、阳光等因素影响,房间内温度会小幅度地波动。我们以分钟为单位,定时测量房间温度,这里的1分钟,可以理解为采样时间。假设测量温度时,外界的天气是多云,阳光照射时有时无,同时房间不是100%密封的,可能有微小的与外界空气的交换,即引入过程噪声W(k),其方差为Q,大小假定为Q=0.01(假如不考虑过程噪声的影响,即真实温度是恒定的,那么这时候Q=0)。相应地,A=1,F=1,Q=0.01,状态X(k)是在第k分钟时的房间温度,是一维的。那么该系统的状态方程可以写为
    X(k)=X(k-1)+W(k)
    现在用温度计开始测量房间的温度,假设温度计的测量误差为±0.5℃,从出厂说明书上我们得知该温度计的方差为0.25。也就是说,温度计第k次测量的数据不是100%准确的,它是有测量噪声V(k)的,并且其方差R=0.25,因此测量方程为Z(k)=Xk)+V(k)。
    该系统的状态和观测方程为
    X(k)=AX(k-1)+W(k-1)
    Z(k)=HX(k)+V(k)
    式中,X(k)是一维变量温度;A=1;F=1;H=1;W(k)和V(k)的方差为QR
    模型建好以后,就可以利用 Kalman滤波了。假如要估算第k时刻的实际温度值,首先要根据第k-1时刻的温度值来预测k时刻的温度。
    (1)假定第k-1时刻的温度值测量值为23.9℃,房间真实温度为24.0℃,该
    测量值的偏差是0.1℃,即协方差P(k-1)=0.1^2。
    (2)在第k时刻,房间的真实温度是24.1℃,温度计在该时刻测量的值为
    24.5℃,偏差为0.4℃。我们用于估算第k时刻的温度有两个温度值,分别是k-1时刻23.9℃和k时刻的24.5℃,如何融合这两组数据,得到最逼近真实值的估计?
    首先,利用k1时刻温度值预测第k时刻的温度,其预计偏差为P(k|k-1)=P(k-1)+Q=0.02,计算 Kalman增益
    K=P(k|k-1)/(P(k|k-1)+R)=00741,那么这时候利用k时刻的观测值,得到温度的估计值为X(k)=23.9+0.0741×(24.1-23.9)=23.915℃。可见,与23.9℃和24.5℃相比较, Kalman估计值23.915℃更接近真实值24.1℃。此时更新k时刻的偏差P(k)=(1-K*H)P(k|k-1)=0.0186。最后由X(k)=23.915℃和P(k)=0.0186,可以继续对下一时刻观测数据Z(k+1)进行更新和处理。
    (3)这样, Kalman滤波器就不断地把方差递归,从而估算出最优的温度值。X(0)和P(0)分别为滤波器初始值。

    MATLAB仿真程序

    % 程序说明:Kalman滤波用于一维温度测量的实例
    function Kalman_main
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    N=120;%采样点个数,时间单位为分钟
    CON=25;%室内温度理论值,房间温度在25摄氏度左右
    
    %对状态和测量初始化
    Xexpect=CON*ones(1,N);%期望温度是25摄氏度,但会收到噪声影响
    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);%初始化测量值24.9,可作为滤波器的初始估计状态
    
    %噪声
    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:N
        %第一步:随时间推移,房间真实温度波动变化
        X(k)=F*X(k-1)+G*W(k-1);  %状态方程
        %第二步:随时间推移,获取实时数据
        Z(k)=H*X(k)+V(k); %观测方程
        %第三步:Kalman滤波
        X_pre=F*Xkf(k-1);  %状态估计         
        P_pre=F*P(k-1)*F'+Q; %协方差预测       
        Kg=P_pre*inv(H*P_pre*H'+R); %kalman增益
        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:N
        Err_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');
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    

    仿真图

    在这里插入图片描述
    误差

    结论

    从仿真结果可以看出,kalman滤波与温度计测量的值相比,大大降低了偏差,使得状态尽可能逼近真实值。

    展开全文
  • 带高斯白噪声的Kalman滤波Matlab代码,每一步都有详细的注释,和kalman滤波的五个公式对应。并有高斯白噪声的产生函数,function G = CreateGauss(E,D,M,N) %产生均值为E,方差为D,MxN的高斯白噪声矩阵
  • Kalman 滤波 matlab源码

    2011-06-24 09:58:23
    针对Kalman滤波算法给出了Matlab编程代码
  • Kalman滤波在视频图像目标跟踪中的应用
  • 卡尔曼滤波算法。使用STm32跑的,亲测可以用,效果很好,算法源码
  • 交互多模型Kalman滤波在目标跟踪中的应用 MATLAB仿真实验
  • 卡尔曼滤波MATLAB实现

    2019-04-29 09:13:49
    详细介绍了卡尔曼滤波原理,对卡尔曼滤波进行了MATLAB仿真设计
  • 采用kalman滤波算法,对含噪声的语音信号进行降噪,能够取得较好的效果。
  • kalman滤波_MATLAB

    2017-08-20 13:09:48
    MATLAB实践编写各种kalman滤波算法
  • 二维Kalman滤波

    2019-03-05 20:17:38
    本程序仿真了2D直角坐标下目标运动的kalman跟踪,并对其性能进行分析。
  • matlab实现的人体跟踪,包括文档讲解卡尔曼滤波的人体跟踪。 matlab实现的人体跟踪,包括文档讲解卡尔曼滤波的人体跟踪。
  • kalman滤波matlab仿真

    2011-03-05 16:52:08
    本文件用matlab 语言,对kalman滤波的方法进行仿真,画出来原始曲线,观察值,和跟踪曲线,会对初学者有很大的帮助!
  • 条件 设定的条件为两个传感器,每个...%Project: 不相关 双通道 二维 kalman滤波 %Author: Jace %Data: 2021/09/12 %--------------------准备--------------------- close all; clear all; clc; %---------------

    条件

    设定的条件为两个传感器,每个传感器独立观测一个状态量,但两个状态量之间存在耦合(A矩阵非对角线上不为0)的情况下,对两个传感器对应的局部滤波进行融合(使用的是最简单的算法):
    在这里插入图片描述
    两个传感器下就是:
    在这里插入图片描述

    代码

    %Project: 不相关&双通道&二维&滚动窗检测器
    %Author: Jace
    %Data: 2021/09/15
    %--------------------准备---------------------
    close all;
    clear all;
    clc;
    %------------------初始化参数---------------------
    N=50;%设定采样点数,即持续时长
    
    %噪声相关参数
    Q=[0.01,0.0;0.0,0.05];%设定系统噪声
    R1=0.28;%设定局部观测1噪声
    R2=0.25;%设定局部观测2噪声
    w=sqrt(Q)*randn(2,N);
    v1=sqrt(R1)*randn(1,N);
    v2=sqrt(R2)*randn(1,N);
    
    %系统模型参数
    A=[0.8,0.1;0.5,0.7];%状态转移矩阵
    H1=[1,0];%局部量测1量测矩阵
    H2=[0,1];%局部量测2量测矩阵
    
    %----------------初始化分配空间-------------------------
    %真实状态值初始化
    x=zeros(2,N);%物体真实状态值(分配空间),2*N维矩阵
    x(:,1)=[10;20];%物体初始真实状态值
    
    %误差协方差初始化
    p1=[1,0;0,1];%局部滤波1误差协方差初始值
    p2=[1,0;0,1];%局部滤波2误差协方差初始值
    p=[1,0;0,1];%全局滤波误差协方差初始值
    
    %两个传感器量测值初始化
    z1=zeros(1,N);%量测值1
    z1(1)=H1*x(:,1);%观测1真实值初始值,第一列的列向量取出第一行,成为标量
    z2=zeros(1,N);%量测值2
    z2(1)=H2*x(:,1);%观测2真实值初始值,第一列的列向量取出第二行,成为标量
    
    %各滤波器估计值初始化
    xkf1=zeros(2,N);%局部估计状态1
    xkf1(:,1)=x(:,1);%局部估计状态1初始化为第一列的列向量
    
    xkf2=zeros(2,N);%局部估计状态2
    xkf2(:,1)=x(:,1);%局部估计状态2初始化为第一列的列向量
    
    xkf=zeros(2,N);%全局估计状态
    xkf(:,1)=x(:,1);%全局估计状态初始化为第一列的列向量
    
    %估计误差协方差记录(用来将估计误差协方差的对角线数值记录在一组行向量中)
    err_p2=zeros(N,2);%局部2估计误差P记录
    err_p2(1,1)=p(1,1);%局部2估计误差P矩阵关于局部滤波1的估计误差初始值
    err_p2(1,2)=p(2,2);%局部2估计误差P矩阵关于局部滤波2的估计误差初始值
    
    err_p1=zeros(N,2);%局部1估计误差P记录
    err_p1(1,1)=p(1,1);%局部1估计误差P矩阵关于局部滤波1的估计误差初始值
    err_p1(1,2)=p(2,2);%局部1估计误差P矩阵关于局部滤波2的估计误差初始值
    
    err_p=zeros(N,2);%全局估计误差协方差P记录
    err_p(1,1)=p(1,1);%全局估计误差协方差P矩阵关于第一参数的估计误差初始值
    err_p(1,2)=p(2,2);%全局估计误差协方差P矩阵关于第二参数的估计误差初始值
    
    I=eye(2);%2*2单位矩阵
    %----------------kalman迭代过程------------------------
    for k=2:N
        %系统模型
        x(:,k)=A*x(:,k-1)+w(k);%系统状态模型
        z1(k)=H1*x(:,k)+v1(k);%量测1模型,标量
        z2(k)=H2*x(:,k)+v2(k);%量测2模型,标量
        %估计误差协方差预测更新
        p_pre1=A*p1*A'+Q;%局部滤波1的P预测更新
        p_pre2=A*p2*A'+Q;%局部滤波2的P预测更新
        %增益矩阵预测更新
        Kk1=p_pre1*H1'/(H1*p_pre1*H1'+R1);%局部滤波1的K预测更新
        Kk2=p_pre2*H2'/(H2*p_pre2*H2'+R2);%局部滤波2的K预测更新
        %状态值预测更新
        x_pre1=A*xkf1(:,k-1);%局部滤波1的x预测更新
        x_pre2=A*xkf2(:,k-1);%局部滤波2的x预测更新
        %状态值量测更新
        xkf1(:,k)=x_pre1+Kk1*(z1(k)-H1*x_pre1);%局部滤波1的x量测更新
        xkf2(:,k)=x_pre2+Kk2*(z2(k)-H2*x_pre2);%局部滤波2的x量测更新
        %估计误差协方差量测更新
        p1=(I-Kk1*H1)*p_pre1;%局部滤波1的p量测更新
        p2=(I-Kk2*H2)*p_pre2;%局部滤波2的p量测更新
        
        %两个局部滤波不相关条件下的简单全局融合
        p=inv(inv(p1)+inv(p2));%融合后的估计误差协方差
        xkf(:,k)=p*(inv(p1)*xkf1(:,k)+inv(p2)*xkf2(:,k));%融合后的状态估计值
        
        %估计误差协方差中的对角元素(均方误差)记录
        err_p1(k,1)=p1(1,1);%1局部滤波中第1个状态估计误差均方值
        err_p1(k,2)=p1(2,2);%1局部滤波中第2个状态估计误差均方值
        
        err_p2(k,1)=p2(1,1);%2局部滤波中第1个状态估计误差均方值
        err_p2(k,2)=p2(2,2);%2局部滤波中第2个状态估计误差均方值
        
        err_p(k,1)=p(1,1);%融合后全局滤波中第1个状态估计误差均方值
        err_p(k,2)=p(2,2);%融合后全局滤波中第2个状态估计误差均方值
        
    end
    %--------------------------误差计算--------------------------------
    %初始化
    messure_err_x1=zeros(1,N);
    messure_err_x2=zeros(1,N);
    kalman_err_x1=zeros(1,N);
    kalman_err_x2=zeros(1,N);
    kalman_err_all1=zeros(1,N); 
    kalman_err_all2=zeros(1,N);
    for k=1:N
        messure_err_x1(k)=abs(z1(k)-x(1,k));%局部滤波器1的测量误差
        messure_err_x2(k)=abs(z2(k)-x(2,k));%局部滤波器2的测量误差
        kalman_err_x1(k)=abs(xkf1(1,k)-x(1,k));%1个局部滤波器对第1个状态量估计偏差
        kalman_err_x2(k)=abs(xkf2(2,k)-x(2,k));%2个局部滤波器对第2个状态量估计偏差
        kalman_err_all1(k)=abs(xkf(1,k)-x(1,k));%融合后全局滤波器第1个量估计偏差
        kalman_err_all2(k)=abs(xkf(2,k)-x(2,k));%融合后全局滤波器第2个量估计偏差
    end
    %噪声图
    figure;
    subplot(2,2,1)
    plot(w(1,:));xlabel('采样时间');ylabel('噪声');
    title('第1状态值过程噪声');
    subplot(2,2,2)
    plot(w(2,:));xlabel('采样时间');ylabel('噪声');
    title('第2状态值过程噪声');
    subplot(2,2,3)
    plot(v1);xlabel('采样时间');ylabel('噪声');
    title('第1状态值第1传感器量测噪声');
    subplot(2,2,4)
    plot(v2);xlabel('采样时间');ylabel('噪声');
    title('第2状态值第2传感器量测噪声');
    
    %局部滤波器1
    figure;
    t=2:N;
    plot(t,x(1,t),'-k.',t,z1(t),'-b.',t,xkf1(1,t),'-g.',t,xkf(1,t),'-r.');
    legend('第1状态值','第1量测值','局部滤波器1估计值','全局滤波器估计值');
    xlabel('采样时间');ylabel('位置');
    title('局部滤波器1跟踪状态');
    
    %局部滤波器2
    figure;
    t=2:N;
    plot(t,x(2,t),'-k.',t,z2(t),'-b.',t,xkf2(2,t),'-g.',t,xkf(2,t),'-r.');
    legend('第2状态值','第2量测值','局部滤波器2估计值','全局滤波器估计值');
    xlabel('采样时间');ylabel('位置');
    title('局部滤波器2跟踪状态');
    
    %局部滤波器1误差
    figure;
    hold on,box on;
    plot(messure_err_x1,'-b.');
    plot(kalman_err_x1,'-g.');
    plot(kalman_err_all1,'-r.');
    legend('量测','局部滤波器1估计','全局估计');
    xlabel('采样时间');ylabel('误差');
    title('局部滤波器1误差');
    
    %局部滤波器2误差
    figure;
    hold on,box on;
    plot(messure_err_x2,'-b.');
    plot(kalman_err_x2,'-g.');
    plot(kalman_err_all2,'-r.');
    legend('测量位置','局部滤波器2估计','kalman全局估计');
    xlabel('采样时间');ylabel('误差');
    title('局部滤波器2误差');
    
    %1状态值估计误差均方值
    figure;
    hold on,box on;
    plot(err_p1(:,1),'-g.');
    plot(err_p(:,1),'-r.');
    legend('局部滤波器1均方差','全局均方差');
    xlabel('采样时间');ylabel('误差均方值');
    title('第1状态值估计误差均方值');
    
    %2状态值估计误差均方值
    figure;
    hold on,box on;
    plot(err_p2(:,2),'-g.');
    plot(err_p(:,2),'-r.');
    legend('局部滤波器2均方差','全局均方差');
    xlabel('采样时间');ylabel('误差均方值');
    title('第2状态值估计误差均方值');
    

    结果及分析

    追踪效果

    在这里插入图片描述

    估计误差

    在这里插入图片描述
    能够看得出来,绿色的全局误差实际上是要比红色的局部滤波的误差稍稍低一些的,如果看的不清楚,还可以参考均方误差

    均方误差

    在这里插入图片描述
    绿色的全局估计的均方误差是比红色的局部滤波的均方误差稍低。
    但是两个量测值是不相关的,为何融合会使得整体的误差变低?
    在这里插入图片描述
    由于状态量之间的耦合,使得公共状态的估计误差协方差发生变化,因此不相关的状态量的估计误差也会有一些改善。
    估计误差协方差:
    在这里插入图片描述

    展开全文
  • 实现KALMAN滤波算法通过跟踪估计物体运动轨迹-kalman滤波.rar 非常好得KALMAN滤波算法,通过跟踪,估计物体运动轨迹,和大家一起分享。 所含文件: Figure2.jpg KALMAN滤波算法,通过跟踪,...
  • 基于cv模型的kalman 滤波matlab程序,从模拟数据到画图,易于入门
  • 卡尔曼滤波matlab代码样例 %Z=[(1:100);];%观测值 Z=ones(100,2); for j=1:100 Z(j,2)=1; Z(j,1)=j; end mu=[0,1];%数学期望 sigma=[0.5 0;0 0.1];%协方差矩阵 noise=mvnrnd(mu,sigma,100)%生成100个样本
  • 关于Kalman滤波的仿真程序,便于理解,包括距离和速度的显示与滤波前后的对比
  • Kalman滤波用于自由落体运动目标跟踪问题。进行的MAtalb仿真
  • kalman 滤波 MATLAB

    2009-10-06 09:52:55
    文件包里包含若干个MATLAB源程序 关于kalman 滤波 的 运行成功 很适合研究者
  • Kalman滤波在船舶GPS导航定位系统中的应用的MATLAB程序,用卡尔曼滤波进行滤波,得到真是轨迹、滤波轨迹和预测轨迹。
  • 卡尔曼滤波MATLAB实现。包括代码及详细说明,画出了各种不同的曲线。
  • kalman滤波的仿真,kalman滤波基础及matlab仿真,matlab源码
  • 基于卡尔曼滤波算法,估计直线行驶小车的状态,即位置和速度。
  • Kalman滤波的一个实例给出了Matlab源码
  • kalman滤波MATLAB实现

    2009-10-29 13:41:00
    短小精悍,牛人之作。用结构体实现的kalman算法,非常精妙,希望对大家有所帮助
  • 完整的kalman滤波实现跟踪算法,能够很好的实现跟踪,有兴趣的朋友可以下载下来看看

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,148
精华内容 859
关键字:

kalman滤波matlab

matlab 订阅