卡尔曼滤波(Kalman filtering)小结

2024-06-03 22:38

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

最近项目用到了kalman滤波,本博文简单介绍下卡尔曼滤波器的概念、原理和应用,做个小结。

概念

卡尔曼滤波(Kalman filtering)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。

斯坦利·施密特(Stanley Schmidt)首次实现了卡尔曼滤波器。卡尔曼在NASA埃姆斯研究中心访问时,发现他的方法对于解决阿波罗计划的轨道预测很有用,后来阿波罗飞船的导航电脑使用了这种滤波器。 关于这种滤波器的论文由Swerling (1958), Kalman (1960)与 Kalman and Bucy (1961)发表[1]。

卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。在很多工程应用(如雷达、计算机视觉)中都可以找到它的身影。同时,卡尔曼滤波也是控制理论以及控制系统工程中的一个重要课题[2]。

应用

例如,对于雷达来说,人们感兴趣的是其能够跟踪目标。但目标的位置、速度、加速度的测量值往往在任何时候都有噪声。卡尔曼滤波利用目标的动态信息,设法去掉噪声的影响,得到一个关于目标位置的好的估计。这个估计可以是对当前目标位置的估计(滤波),也可以是对于将来位置的估计(预测),也可以是对过去位置的估计(插值或平滑)。
扩展卡尔曼滤波(EXTEND KALMAN FILTER, EKF)是由kalman filter考虑时间非线性的动态系统,常应用于目标跟踪系统。

kalman滤波器

理论上,kalman滤波器需要三个重要假设:
1)被建模的系统是线性的;
2)影响测量的噪声属于白噪声;
3)噪声本质上是高斯分布的。
第一条假设是指k时刻的系统状态可以用某个矩阵与k-1时刻的系统状态的乘积表示。余下两条假设,即噪声是高斯分布的白噪声,其含义为噪声与时间不相关,且只用均值和协方差就可以准确地为幅值建模。

在kalman滤波器滤波器应用中,一般考虑三种运动:
1)动态运动:这种运动是我们期望的前次测量时系统状态的直接结果,如匀速运动等。
2)控制运动:这种运动是我们期望的,由于某种已知的外部因素以某种原因施加于系统,如加速运动等。
3)随机运动:随机的无规则运动,在Kalman滤波器中,至少是可以用高斯模型有效地来建模。

以下是两个重要方程:
状态方程:

xk=Axk1+Buk1+qk1

观测方程:
yk=Hxk+rk

上两式子中,x(k)是k时刻的系统状态,u(k)是k时刻对系统的控制量。A是传输参数、B是控制参数,都是系统参数,对于多模型系统,他们为矩阵。y(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为状态转移矩阵。q(k)和r(k)分别表示状态和测量的噪声。他们被假设成高斯白噪声,他们的协方差分别是Q,R(这里我们假设他们不随系统状态变化而变化)。

KF算法流程如下图:
1
这里的K是kalman增益矩阵。

五个重要更新公式:
时间更新:

x^k=Ax^k1+Buk1 (1)

上标”-“表示“在新的测量之前”,求出先验估计 x^k ;
Pk=APk1AT+Q (2)

这个等式构成预测部分的基础,这告诉我们根据已看到的“我们可以期望什么”;
状态更新:
Kk=PkHT(HPkHT+R)1 (3)

这里给出所谓的Kalman增益或更新率或混合比例,告诉我们如何给定新信息相对已知信息的权重,在直接测量一个位置变量的一维例子中,状态误差是 σ2k1 ,测量误差是 σ2k K=σ2k1σ2k1+σ2k
x^k=x^k+Kk(ykHx^k) (4)

Pk=(IKkH)Pk (5)

得到“新的测量之后”,就可以用更新率K对 x^kPk 做更新得到最优的更新值 x^kPk

举例

以测量在停车场行驶的汽车为实际例子,汽车的状态用两个位置变量 x y,以及两个速度变量 vx vy 表示。这四个变量组成状态向量 xk 的元素。 dt 表示速度增量。这里假设的是动态运动模型。

xk=[x y vx vy]T

A=10000100dt0100dt01

当使用摄像机观测汽车的状态时,可能只观测量到位置变量:
yk=[yxyy]

状态转移矩阵H结构如下:

H=10000100

在该例子中,可能并不真正认为汽车速度不变,所以要设置 Q 来反应这个问题。对视频流用图像分析方法来测量汽车的位置,再根据对测量精确度的估计来选择R
这些量初始化完成后,嵌入到kalman滤波的那些公式中,便可以进行汽车位置估计。

在项目中,用kalman跟踪物体质心运动,建模思路跟这个汽车例子类似,因为运动不是匀速存在偏差(状态误差),因为检测器检测到的目标的质心的位置存在偏差(观测误差),而这些偏差和设定会影响到kalman的跟踪效果。

OpenCV demo

#include "opencv2/video/tracking.hpp"
#include "opencv2/highgui/highgui.hpp"#include <stdio.h>using namespace cv;static inline Point calcPoint(Point2f center, double R, double angle)
{return center + Point2f((float)cos(angle), (float)-sin(angle))*(float)R;
}static void help()
{printf( "\nExamle of c calls to OpenCV's Kalman filter.\n"
"   Tracking of rotating point.\n"
"   Rotation speed is constant.\n"
"   Both state and measurements vectors are 1D (a point angle),\n"
"   Measurement is the real point angle + gaussian noise.\n"
"   The real and the estimated points are connected with yellow line segment,\n"
"   the real and the measured points are connected with red line segment.\n"
"   (if Kalman filter works correctly,\n"
"    the yellow segment should be shorter than the red one).\n""\n"
"   Pressing any key (except ESC) will reset the tracking with a different speed.\n"
"   Pressing ESC will stop the program.\n");
}int main(int, char**)
{help();Mat img(500, 500, CV_8UC3);KalmanFilter KF(2, 1, 0);Mat state(2, 1, CV_32F); /* (phi, delta_phi) */Mat processNoise(2, 1, CV_32F);Mat measurement = Mat::zeros(1, 1, CV_32F);char code = (char)-1;for(;;){randn( state, Scalar::all(0), Scalar::all(0.1) );KF.transitionMatrix = *(Mat_<float>(2, 2) << 1, 1, 0, 1);setIdentity(KF.measurementMatrix);setIdentity(KF.processNoiseCov, Scalar::all(1e-5));setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1));setIdentity(KF.errorCovPost, Scalar::all(1));randn(KF.statePost, Scalar::all(0), Scalar::all(0.1));for(;;){Point2f center(img.cols*0.5f, img.rows*0.5f);float R = img.cols/3.f;double stateAngle = state.at<float>(0);Point statePt = calcPoint(center, R, stateAngle);Mat prediction = KF.predict();double predictAngle = prediction.at<float>(0);Point predictPt = calcPoint(center, R, predictAngle);randn( measurement, Scalar::all(0), Scalar::all(KF.measurementNoiseCov.at<float>(0)));// generate measurementmeasurement += KF.measurementMatrix*state;double measAngle = measurement.at<float>(0);Point measPt = calcPoint(center, R, measAngle);// plot points#define drawCross( center, color, d )                                 \line( img, Point( center.x - d, center.y - d ),                \Point( center.x + d, center.y + d ), color, 1, CV_AA, 0); \line( img, Point( center.x + d, center.y - d ),                \Point( center.x - d, center.y + d ), color, 1, CV_AA, 0 )img = Scalar::all(0);drawCross( statePt, Scalar(255,255,255), 3 );drawCross( measPt, Scalar(0,0,255), 3 );drawCross( predictPt, Scalar(0,255,0), 3 );line( img, statePt, measPt, Scalar(0,0,255), 3, CV_AA, 0 );line( img, statePt, predictPt, Scalar(0,255,255), 3, CV_AA, 0 );if(theRNG().uniform(0,4) != 0)KF.correct(measurement);randn( processNoise, Scalar(0), Scalar::all(sqrt(KF.processNoiseCov.at<float>(0, 0))));state = KF.transitionMatrix*state + processNoise;imshow( "Kalman", img );code = (char)waitKey(100);if( code > 0 )break;}if( code == 27 || code == 'q' || code == 'Q' )break;}return 0;
}

运行效果:
2

3

4

<script type="math/tex; mode=display" id="MathJax-Element-26"></script>
个人觉得,Kalman filter算法的核心是新旧信息融合即将先验知识与观测数据结合得到新的估计,作用就是用来对系统状态进行 预估+ 校正

原文链接:http://blog.csdn.net/u011285477/article/details/52070900

参考资料:
[1]卡尔曼滤波-百度百科
[2]对Kalman(卡尔曼)滤波器的理解-CSDN博客
[3]Kalman滤波器从原理到实现-CSDN博客
[4]《学习OpenCV(中文版)》于仕琪、刘瑞祯 译 清华大学出版社 P384

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



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

相关文章

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Linux环境配置中问题小结

在Linux环境配置中,遇到问题首先猜测: 1、是否是权限问题; 2、软连接是否配置;

long long,_int64使用小结

前言:   在16位环境下,int/unsigned int 占16位,long/unsigned long占32位   在32位环境下,int占32位,unsigned int占16位,long/unsigned long占32位 何时需要使用:   long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647,而unsigned范围是[0,2^32),

密码学读书笔记小结

密码学是保证消息的私密性和完整性以及消息认证的基础。加密算法的选择和密钥的管理是安全机制的效率、性能和可用性的关键。 公钥加密算法: 分发密钥比较容易,但是对大数据量的加密性能较差密钥加密算法: 更适合大批的加密任务混合型加密协议: 例如TLS,先用公钥加密建立一个安全通道,然后使用通道交换密钥,并将此密钥用于后续数据交换。 对分布式系统攻击的分类: 窃听: 未经授权获得消息副本伪装: 在未

Android 源码中jni项目 加载so目录小结

Android 源码中jni项目 加载so目录小结 文章目录 Android 源码中jni项目 加载so目录小结一、前言二、so目录验证测试1、jni so文件错误报错(1)报错1 - 未找到so文件:(2)报错2 - so文件中未找到native方法: 2、验证的几种情况(1)apk下面的 lib/arm64/ 放置正确的so文件(2)apk下面的 lib/arm64/ 放置错误的so文

maven打包成可执行的jar,以及读取配置文件问题小结

文章来源 https://blog.csdn.net/chasonsp/article/details/88852353 折腾的几天,使用maven打包后发现了问题,首先是打包的配置文件读取问题,使用getResource().getPah()会发现在访问jar包的文件时,路径里会有感叹号(杠杠滴~~)是这样的 …jar!.. 经过不断的查找资料及反复验证后,终于找到了可行的方法:

【硬刚大数据】Flink在实时在实时计算平台和实时数仓中的企业级应用小结

欢迎关注博客主页:https://blog.csdn.net/u013411339 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 CSDN博客!本文首发CSDN论坛,未经过官方和本人允许,严禁转载! 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的面试部分补充。 大数据领域自 2010 年开始,以 Hadoop、Hive 为代

【硬刚ES】ES基础(十九) Query Filtering 与多字符串多字段查询

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

Kafka常见问题学习路径源码阅读小结 | 写在Kafka3.0发布之际

严格来说,这篇文章也不是今天写的。是之前断断续续写在了几篇文章中。 2021年9月21日,随着Kafka3.0的发布,Kafka在「分布式流处理平台」这个目标上的努力进一步得到加强!Kafka不满足于「消息引擎」的定位,正式基于这样的定位,Kafka 社区于 0.10.0.0 版本正式推出了流处理组件 Kafka Streams,也正是从这个版本开始,Kafka 正式"变身"为分布式的流处理平台

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

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