卡尔曼滤波(一)

2024-08-22 10:18
文章标签 卡尔曼滤波

本文主要是介绍卡尔曼滤波(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、理论部分

卡尔曼滤波使用的准则是线性最小方差估计(LMMSE),因此,经典卡尔曼滤波适用于线性高斯系统,系统模型如下:

            

WV分别代表过程噪声和量测噪声,数学期望为0,方差分别为QRX代表系统状态。本文假定已有一定的线性系统基础,因此不对上图中公式做具体介绍。并且本文着重介绍公式的由来、公式为什么是这种形式,至于其中的物理意义之类的就不多说了。

首先给出卡尔曼滤波的5条公式:

                        

正式计算时每个循环中都顺序执行上述公式,即可实现卡尔曼滤波,下面说下由来。

首先,第四个公式代表卡尔曼滤波的校正,等式右边由两项组成,第一项代表由上一时刻的最优估计值递推估计的本时刻状态值,即:本时刻的经验估计值。第二项代表估计值与观测值之间的误差,两项相加,代表,由本时刻观测值与估计值之间的误差对估计值进行修正,K为修正作用的大小。这种形式,从物理意义上来说,是比较合理的,通过使用系统的经验估计值以及观测值,综合得出系统的估计值。

举个例子,上一时刻房间温度最优值为26度,由于温度变化缓慢,则可以根据经验估计本次温度也为26度,即四式右边第一项,而此时温度计读数为28度,那么本时刻温度应该是多少?不知道温度计精度的情况下,可以对两个数据求平均,为27度,即T=26+0.5*28-26=27。这里0.5就是本例子中的修正系数,那么假如温度计精度很高,将修正系数增大一些,比如增大到0.9,那么结果T=26+0.9*28-26=27.8,可以看到滤波结果很接近温度计读数,增大到1则滤波结果就是温度计读数,相反,如果温度计精度很差,那么减小修正系数,则可以使滤波结果更接近等式右边第一项得估计值。因此,合理调整K的大小,可以得到很好的滤波结果,卡尔曼的精髓就在于,能够动态调整K的大小,得到最优的估计解。

那么如何得到K呢?引入正交投影定理的概念 

            

用图表示更加形象一些

             

X为待估计状态,这里假设x的估计解有x=Az+b的形式,定理内容为:状态x在观测z上的正交投影就是xz上的线性最小方差估计,由定理可以得出 

                                                                       

这里E为求数学期望。

由此可以得到K的求解公式  

                     

                 

全部带入即可求得修正系数K的表达式为

       

可以看到,K的求解又引入了P(k+1|k)项,继续计算 

                     

这里,又引入了P(k|k) 

               

作变形 

                  

至此,卡尔曼滤波的公式推导完毕,过程看似全部都是密密麻麻的公式,实际上就是利用:过程噪声、观测噪声的数学期望为0,以及正交投影定理的两个公式,代入一步步写出即可,并不需要其他高端的知识。

公式中P代表方差,P(k+1|k)k时刻转移至k+1时刻的方差,为预测方差P(k|k)为估计方差,^为估计值,~为误差值。

2、实践部分

以一个例子说明卡尔曼滤波的用法。Kalman滤波在船舶GPS定位系统中的应用。

假定用GPS观测船舶的位置,可以观测到横向和纵向的位置值。船舶沿某方向匀速直线行驶,将由海风海浪引起的随机加速度认为是和观测不相关的随机白噪声,初始位置为(-100m200m),水平速度2m/s,垂直速度20m/sGPS观测周期为1秒,系统方程为

                   

代码:

function main

clc;

clear;

close all;

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-3;

Q=delta_w*diag([0.5,1,0.5,1]) ;

R=50*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:N

    X(:,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);

% Xkf(:,1) = [-50,2,110,20];

P0=eye(4);

for i=2:N

    Xn=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:N

    Err_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,:),'-g');

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)<=2

    dist=sqrt( (X1(1)-X2(1))^2 + (X1(3)-X2(2))^2 );

else

    dist=sqrt( (X1(1)-X2(1))^2 + (X1(3)-X2(3))^2 );

end

%------------------------------------------------------------------%

                 

 

 

这篇关于卡尔曼滤波(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095985

相关文章

无迹卡尔曼滤波算法(C语言代码)

无迹卡尔曼滤波(Unscented Kalman Filter, UKF)是一种非线性状态估计算法,它通过无迹变换来处理非线性系统,相比扩展卡尔曼滤波(EKF),UKF在处理非线性系统时更具鲁棒性。下面是一个简单的无迹卡尔曼滤波器的C语言实现示例。这个实现展示了如何定义UKF并进行状态估计。 #include <stdio.h>#include <math.h>#include <strin

MATLAB代码|中心差分卡尔曼滤波(CDKF)的滤波例程,无需下载,直接复制到MATLAB上面就能运行

文章目录 CDKF介绍代码运行结果各模块解析初始化系统模型设置CDKF循环绘图 另有关于EKF和CDKF的对比程序:EKF+CDKF两个滤波的MATLAB程序,估计三轴位置,带中文注释—— https://blog.csdn.net/callmeup/article/details/136610153。 CDKF介绍 中心差分卡尔曼滤波(Central Differe

卡尔曼滤波实现一阶马尔可夫形式的滤波|价格滤波|MATLAB代码|无需下载,复制后即可运行

一节马尔可夫 一阶马尔可夫噪声是一种具有马尔可夫性质的随机过程。在这种噪声中,当前时刻的状态只与前一时刻的状态有关,与更早的状态无关。 一阶马尔可夫噪声可以用一个状态转移矩阵表示,矩阵的每个元素表示从一个状态转移到另一个状态的概率。 滤波模型 状态量的迭代模型如下: 观测量为X的第一维,所以观测方程也就是取X的第一维。 运行结果 应用背景为价格滤波,所以对比X真值和滤波值的第一维

卡尔曼滤波公式通俗理解

本文需要配合博客卡尔曼滤波详解进行理解 1.简单介绍 参考卡尔曼滤波详解 上面可简化理解为 2.主要过程 主要过程还是参考卡尔曼滤波详解 3.实例 这里以线性运动为例 3.1 前期定义状态和变量 3.1.1分析运动情况 已知线性运动上一状态和当前状态的关系,假设没有噪声干扰,为 { x ′ = x + v x Δ t y ′ = y + v y Δ t \begin{

【逐行注释】容积卡尔曼滤波的MATLAB例程(三维CKF),无需下载,可直接复制代码到MATLAB上运行

文章目录 CKF完整源代码与注释程序运行结果绘图部分误差的统计特性计算与输出部分 CKF CKF全称为容积卡尔曼滤波,相比于UKF(无迹卡尔曼滤波),拥有更合理的理论推导和鲁棒性,且在理论上比UKF的精度更高。 另有: 与EKF的对比程序:https://blog.csdn.net/callmeup/article/details/136147833 完整源代码与注释

卡尔曼滤波算法(c语言代码)

卡尔曼滤波器是一种用于估计动态系统状态的算法,常用于信号处理、控制系统、机器人和导航等领域。以下是一个简单的卡尔曼滤波器的 C 语言实现示例。这个示例展示了如何使用卡尔曼滤波器来估计一维系统的状态。 1. 卡尔曼滤波器算法概述 卡尔曼滤波器由两部分组成:预测和更新。基本的卡尔曼滤波器包括以下步骤: 预测步骤: 预测状态估计值。预测协方差矩阵。 更新步骤: 计算卡尔曼增益。更新状态估计值。更

【逐行注释】MATLAB下的UKF(无迹卡尔曼滤波),带丰富的中文注释,可直接复制到MATLAB上运行,无需下载

文章目录 程序组成部分完整代码运行结果主要模块解读:运动模型绘图部分误差统计特性输出 程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成: 完整代码 将下列代码复制粘贴到MATLAB里面,即可运行: % 三维状态量的UKF例程% 作者联系方式:微信matlabfilter(除前期达成一致外,付费咨询)% date: 2024-8-7/V

卡尔曼滤波器、扩展卡尔曼滤波器、无向卡尔曼滤波器的详细推导

这段时间做轴承故障诊断和预测的时候,需要一个针对已经获取了特征向量的工具来对轴承故障状态进行估计和预测。卡尔曼滤波器可以实现对过去、当前和未来目标位置的估计,所以想通过卡尔曼滤波器的设计思路找到一些灵感。虽然最后发现:卡尔曼滤波器中的状态量是有具体的物理含义的物理量,而表征轴承故障状态的量只是一种表征量。这两者之间存在着本质的差别,因为轴承的退化过程目前为止还不能建模。虽然如此,我还是想将卡尔曼滤

卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义)

一、引言 本文以rssi(接收信号强度)滤波为背景,结合卡尔曼的五个公式,设计 rssi 一维卡尔曼滤波器,用MATLAB语言实现一维卡尔曼滤波器,并附上代码和滤波结果图; 本文工分为以下几个部分: 1、引言 2、模型的系统方程和状态方程 3、卡尔曼滤波过程及五个基本公式 4、公式中每个参数详细注释 5、结合rssi滤波实例设计滤波器 6、MATLAB实现滤波器   二、模型的

风速预测 | 基于MATLAB的无迹卡尔曼滤波算法UKF、SVR-UKF、ANN-Kalman等时间序列风速预测模型

基本描述 基于MATLAB的无迹卡尔曼滤波算法UKF、SVR-UKF、ANN-Kalman等时间序列风速预测模型 模型步骤 时间序列风速预测模型基于MATLAB的无迹卡尔曼滤波算法(Unscented Kalman Filter, UKF)、SVR-UKF(Support Vector Regression - Unscented Kalman Filter)和ANN-Kalman(Arti