首页 > 其他分享 >卡尔曼滤波器-Kalmen Filter

卡尔曼滤波器-Kalmen Filter

时间:2024-10-30 22:15:42浏览次数:3  
标签:毫米 递归 估计值 卡尔曼滤波 测量 Filter Kalmen 估计

        卡尔曼滤波器是一种最优递归数据处理算法,它更像是一种观测器,而不是一般意义上的滤波器。卡曼滤波器的应用非常广泛,尤其是在导航当中。它的广泛应用是因为我们生活的世界中存在着大量的不确定性,当我们去描述一个系统的时候,这个不确定性主要体现在三个方面

  1. 不存在完美的数学模型。
  2. 系统的扰动往往是不可控的,也很难建模的。
  3. 测量的传感器本身存在着误差。

        在进行硬币直径的测量实验中,我们用Z_{k}​ 来表示第 k次的测量结果。由于每位测量者的操作差异以及测量工具本身的误差,每次测量得到的数据都可能有所不同。例如,测量者 C_{1}​ 第一次测量得到的结果是 50.1 毫米,测量者 C_{2}​ 的结果是 50.4 毫米,而测量者 C_{3} 的结果是 50.2 毫米。面对这些不同的测量结果,一个直观的方法是计算这些测量值的平均数,以此来估计硬币直径的真实值。

\begin{aligned}\hat{x}_{k}&=\frac{1}{k}\left(z_{i}+z_{2}+\cdots+z_{k}\right)\\&=\frac{1}{k}\left(z_{i}+z_{2}+\cdots+z_{k-1}\right)+\frac{1}{k}z_{k}\\&=\frac{k-1}{k}\hat{\chi}_{k-1}+\frac{1}{k}z_{k}\\&=\hat{\chi}_{k-1}-\frac{1}{k}\hat{\chi}_{k-1}+\frac{1}{k}z_{k}\end{aligned}

\hat{x}_{k}=\hat{x}_{k-1}+\frac{1}{k}(z_{k}-\hat{x}_{k-1})\left ( 1.1 \right )

\frac{1}{k}\rightarrow0\:,\:\hat{\chi}_{k}\rightarrow\hat{\chi}_{k-1}\left ( 1.2 \right )

随着k的增加,测量的结果趋于稳定。

\frac1k写为k_{k}

\hat{\chi}_{k}=\hat{\chi}_{k-1}+k_{k}\left(z_{k}-\hat{\chi}_{k-1}\right)\left ( 1.3 \right )

表示:当前的估计值=上一次的估计值+系救×(当前测量值-上次的估计值),其中,系数k_{k}即为Kalman Gain,卡尔曼增益/因数

        这种思想体现了递归算法的特点,而这也是卡尔曼滤波器的一个显著优势:它不需要回溯并处理很久以前的数据,仅需依赖于上一次的估计结果。在卡尔曼滤波器的实现中,这一点尤为重要,因为它允许算法在每次迭代中仅利用最新的观测数据和前一步的状态估计,从而有效降低了计算复杂度和存储需求。

        关于卡尔曼因数k_{k},这里引入两个参数,一个是估计误差,也就是估计值和真实值的差距,这里用e_{EST}来表示,e表示误差,est表示估计,一个是测量误差,也就是测量值和真实值的差距,这里用e_{MEA}来表示,MEA 就是 measurement 测量。

k_{k}=\frac{e_{\mathrm{EST}_{k-1}}}{e_{\mathrm{EST}_{k-1}}+e_{\mathrm{MEA}_{k}}}\left ( 1.4 \right )

        这个公式实际是卡尔曼滤波器的核心公式,会在后面的文章当中去详细的讲解它是怎么被推导出来的。

        当e_{EST_{k-1}} > >e_{MEA_{k}}的时候,此时卡尔曼因数接近1,第k次的估计值接近测量值

k_{k}\rightarrow1\quad,\quad\hat{\chi}_{k}\rightarrow\hat{\chi}_{k-1}+z_{h}-\hat{\chi}_{k-1}=z_{k}\left ( 1.5 \right )

        当e_{EST_{k-1}}<<\mathrm{e}_{MEA_k}的时候,此时卡尔曼因数接近0,第k次的估计值接近上一次估计值

k_{k}\rightarrow0\quad\hat{x}_{k}=\hat{x}_{k-1}\left ( 1.6 \right )

下面看一个用卡尔曼滤波思想解决问题的例子

Step1:计算Kalman Gain

k_{k}=\frac{e_{\mathrm{EST}_{k-1}}}{e_{\mathrm{EST}_{k-1}}+e_{\mathrm{MEA}_{k}}}

Step2:计算 

\hat{x}_{k}\quad=\:\hat{\chi}_{k-1}+k_{k}(\:z_{k}-\hat{\chi}_{k-1})

Step3:更新

e_{EST_{k}}=(1-k_{k})\:e_{EST_{k-1}} 

        对于Step3,后续解释推导过程。即增加测量值后,分别更新估计值和卡尔曼因数。

        还是估计物体长度测量的过程中,假设物体的实际长度为50毫米,而我们第一次的估计值为40毫米,这是一个随机给出的估计值。在此基础上,我们定义第一次的估计误差e_{EST_{0}}为5毫米,这个值也是人为设定的,用于量化我们估计值与实际值之间的偏差。

\hat{\chi}_{0}=40mm\\e_{EST_{0}}=5mm

        对于测量来说,比如说第一次的测量值是 51 毫米,然后测量误差我们知道有 3 毫米,也就是说它测出来是 51 毫米,所以它有可能是在 48 到 54 毫米之间的一个值,然后使用同样的一个测量工具,所以它第几次的测量误差都是 3 毫米。

z_{1}=5\mathrm{lmm}\\e_{MEA_{k}}=3mm

        蓝色代表测量结果,而红色代表估计结果。初始估计值设定为40,这是我们的起始点。通过卡尔曼滤波器的迭代过程,我们可以看到,经过一步、两步、三步、四步、五步的更新后,估计值逐渐接近至49mm。值得注意的是,物体的实际长度为50mm。随着更多数据的不断输入和迭代过程的持续进行,估计值越来越接近实际值。

        这一过程体现了卡尔曼滤波器的递归特性。随着新数据的不断加入和更新,估计值逐步逼近真实值。这是一个简单而直观的例子,展示了如何利用卡尔曼滤波器的递归思想来进行状态估计。通过这种递归迭代的方式,卡尔曼滤波器能够有效地融合先验估计和新的测量数据,以实现对系统状态的准确估计。

参考资料

【卡尔曼滤波器】1_递归算法_Recursive Processing

标签:毫米,递归,估计值,卡尔曼滤波,测量,Filter,Kalmen,估计
From: https://blog.csdn.net/weixin_56773716/article/details/143362950

相关文章

  • 【GiraKoo】Manifest中的intent-filter使用
    【笔记】【Android】Manifest中的intent-filter使用笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。intent-filter是为了标明Activity,Service或者BraodcastReceiver可以相应的intent类型。基本结构<activityandroid:name=".YourActivity"......
  • 【笔记】【Android】Manifest中的intent-filter使用
    【笔记】【Android】Manifest中的intent-filter使用笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。intent-filter是为了标明Activity,Service或者BraodcastReceiver可以相应的intent类型。基本结构<activityandroid:name=".YourActivity"......
  • javascript 数组 filter
    javascript数组filter在JavaScript中,filter方法被用于创建一个新数组,该数组包含通过提供的函数实现的测试的所有元素。解法1:基本使用方法letnumbers=[4,9,16,25,29];letnewNumbers=numbers.filter(num=>num>10);console.log(newNumbers);//......
  • ja-netfilter无法激活2024.2版本的问题
    内容节选自:@lzskylineJetBrains新版本2024.2在设置里添加了区域选择,具体在:Appearance&Behavior->SystemSettings->LanguageandRegion->Region中设置。如果你选择ChinaMainland将会有一个比较坑的地方:激活许可验证走account.jetbrains.com.cn这个域名,而不是默认......
  • C# 使用SuperSocket的FixedHeaderReceiveFilter进行通信
    一、服务端publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){MyServerappServer=newMyServer();......
  • hangfire filter实现
    internalclassProgram{staticasyncTaskMain(string[]args){varfilters=newList<IFilter>{newFilterA(),newFilterB(),};Func<BackgroundJob>continuation=()=>......
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
    十七、拦截器和过滤器在JavaWeb开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理前后执行某些操作的机制。虽然它们的功能相似,但在实现方式、使用场景和灵活性方面有一些重要的区别。1、拦截器和过滤器的区别及选择1.1拦截器定义:拦截器是Spring框架提供......
  • 【MATLAB】无迹粒子滤波(Unscented Particle Filter)例程
    文章目录运行结果位置曲线和速度曲线位置误差曲线和速度误差曲线源代码代码结构源代码目的作者信息代码结构与功能详细说明修改建议总结运行结果位置曲线和速度曲线位置误差曲线和速度误差曲线源代码代码结构......
  • 中心差分卡尔曼滤波(CDKF)的MATLAB代码(三维非线性)
    、CDKF三维滤波MATLAB实现目录主要特点应用场景运行结果部分代码程序架构本MATLAB程序实现了一种先进的三维状态滤波方法——协方差差分卡尔曼滤波(CDKF),专为需要精确定位和动态系统分析的用户设计。通过高效的滤波技术,显著减少噪声影响,确保系统在各种环境下的稳......
  • 【状态估计】【雷达】基于扩展卡尔曼滤波的雷达目标跟踪融合研究(Matlab代码实现)
     ......