精华内容
下载资源
问答
  • 卡尔曼滤波算法详解

    2019-08-19 16:45:57
    卡尔曼滤波算法的推导过程详见博文: https://blog.csdn.net/moge19/article/details/89464151  ————————————————    卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了. ...

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/moge19/article/details/81750731
     ———————————————— 

    用python实现并对其进行仿真,详见博文
    https://blog.csdn.net/moge19/article/details/82531119

    利用FFT分析卡尔曼滤波与低通滤波详见博文:
    https://blog.csdn.net/moge19/article/details/87389728
    卡尔曼滤波算法的推导过程详见博文:
    https://blog.csdn.net/moge19/article/details/89464151
     ———————————————— 

     

    卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了.

    https://blog.csdn.net/phker/article/details/48468591

    学习卡尔曼滤波看了4天的文章,硬是没看懂.后来找到了下面的文章一下就看懂了.

    我对卡尔曼滤波的理解,

    我认为,卡尔曼滤波就是把统计学应用到了滤波算法上. 

    算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差",计算得到当前的最优量.   再 预测下一刻的量, 

    里面比较突出的是观点是. 把误差纳入计算, 而且分为预测误差和测量误差两种.通称为 噪声.

     还有一个非常大的特点是,误差独立存在, 始终不受测量数据的影响.

    上面的ppt有助于入门理解.

    但是在编程的时候你会发现,解释里面的数值23 没有很明确的指出,是指的那个时刻的23 是预测的23 还是上一课测量的23

    下面这段文字会有助于你更清晰的理解

    卡尔曼滤波是统计学的程序表达.

    要想深入理解,公式三 协方差的背后意义 需要学习统计学. 

     

    如果仅仅是使用的话,这5个公式套进程序里面还是很容易的.

     

    看到这里如果你明白了原理, 你再回过头看看,会发现.误差是独立存在的. 误差不受数据的影响. 误差按照统计学的协方差公式更新, 跟数据无关.

    而且误差是不断变化的.  

     

    应用:基于双卡尔曼滤波算法的电池SOC估计

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/hangh13/article/details/51991621

     

    展开全文
  • 卡尔曼滤波算法 详解

    2020-09-27 17:18:41
  • 目录一、背景详解二、卡尔曼滤波(Kalman)原理参考文献 一、背景详解 只要是存在不确定信息的动态系统,卡尔曼滤波...卡尔曼滤波(Kalman)无论是在单目标还是多目标领域都是很常用的一种算法,我们将卡尔曼滤波看做一

    一、背景详解

    卡尔曼滤波(Kalman filter)是一种高效的自回归滤波器,它能在存在诸多不确定性情况的组合信息中估计动态系统的状态,是一种强大的、通用性极强的工具。

    只要是存在不确定信息的动态系统,卡尔曼滤波(Kalman)就可以对系统下一步要做什么做出有根据的推测。即便有噪声信息干扰,卡尔曼滤波通常也能很好的弄清楚究竟发生了什么,找出现象间不易察觉的相关性因此卡尔曼滤波(Kalman)非常适合不断变化的系统,它的优点还有内存占用较小(只需保留前一个状态)、速度快,是实时问题和嵌入式系统的理想选择(参见YOLOv5和DeepSORT在Jetson NX板上的部署)。

    卡尔曼滤波(Kalman)无论是在单目标还是多目标领域都是很常用的一种算法,我们将卡尔曼滤波看做一种运动模型,用来对目标的位置进行预测,并且利用预测结果对跟踪的目标进行修正,属于自动控制理论中的—种方法。 在对视频中的目标进行跟踪时,当目标运动速度较慢时,很容易将前后两帧的目标进行关联:可以利用之前几帧的位置来预测下一帧的位置,即可关联同一目标。

    二、卡尔曼滤波(Kalman)原理

    在这里插入图片描述

    目标的位置、速度、加速度的测量值往往在任何时候都有噪声。卡尔曼滤波利用目标的动态信息,设法去掉噪声的影响,得到一个关于目标位置的好的估计。这个估计可以是对当前目标位置的估计(滤波),也可以是对于将来位置的估计(预测),也可以是对过去位置的估计(插值或平滑)。

    有一辆小车在行驶,它的速度是v,可以通过观测得到它的位置p,也就是说我们可以实时的观测小车的状态。

    小车在某一时刻的状态表示为一个向量。

    ​ 虽然我们比较确定小车此时的状态,无论是计算还是检测都会存在一定的误差,所以我们只能认为当前状态是其真实状态的一个最优估计。那么我们不妨认为当前状态服从一个高斯分布

    考虑轨道上的一个小车,无外力作用,它在时刻t的状态向量只与t-1相关:(状态向量就是描述它的t=0时刻所有状态的向量,比如:[速度大小5m/s, 速度方向右, 位置坐标0],反正有了这个向量就可以完全预测t=1时刻小车的状态)那么根据t=0时刻的初值,理论上我们可以求出它任意时刻的状态

    当然,实际情况不会这么美好。这个递推函数可能会受到各种不确定因素的影响(内在的外在的都算,比如刮风下雨地震,小车结构不紧密,轮子不圆等等)导致并不能精确标识小车实际的状态。

    我们假设每个状态分量受到的不确定因素都服从正态分布。现在仅对小车的位置进行估计请看下图:t=0时小车的位置服从红色的正态分布。

    在这里插入图片描述
    根据小车的这个位置,我们可以预测出t=1时刻它的位置:
    在这里插入图片描述
    分布变“胖”了,这很好理解——因为在递推的过程中又加了一层噪声,所以不确定度变大了。为了避免纯估计带来的偏差,我们在t=1时刻对小车的位置坐标进行一次雷达测量,当然雷达对小车距离的测量也会受到种种因素的影响,于是测量结果告诉我们,小车t=1时的位置服从蓝色分布:

    在这里插入图片描述
    现在我们得到两个不同的结果。前面有人提过加权,Kalman的牛逼之处就在于找到了相应权值,使红蓝分布合并为下图这个绿色的正态分布(啰嗦一句,这个绿色分布均值位置在红蓝均值间的比例称为Kalman增益(比如下图中近似0.8),就是各种公式里的K(t))。

    在这里插入图片描述
    绿色分布不仅保证了在红蓝给定的条件下,小车位于该点的概率最大,而且,而且,它居然还是一个正态分布,这意味着可以把它当做初值继续往下算了!这是Kalman滤波能够迭代的关键。

    最后,把绿色分布当做第一张图中的红色分布对t=2时刻进行预测,算法就可以开始循环往复了。那么绿色分布是怎么得出的呢?其实可以通过多种方式推导出来。有最大似然法Ricatti方程法,以及直接对高斯密度函数变形法。另外,由于我只对小车位移这个一维量做了估计,因此Kalman增益是标量,通常情况下它都是一个矩阵。而且如果估计多维量,还应该引入协方差矩阵的迭代

    Kalman滤波算法的本质就是利用两个正态分布的融合仍是正态分布这一特性进行迭代而已。

    代码实践

    这个实践的已知量是导弹做水平运动,已知导弹每个时刻的速度dv,和速度测量仪器的标准差是v_std,还已知每个时刻用GPS测量出导弹位置position_noise以及GPS的方差是predict_var。(注意标准差的平方是方差,不用觉得奇怪)
    我们需要用卡尔曼滤波根据这些信息获得融合两种传感器后的位置信息position_predict:

    # -*- coding: utf-8 -*-
    
    import numpy as np
    
    # 模拟数据
    t = np.linspace(1,100,100)
    a = 0.5
    position = (a * t**2)/2
    
    position_noise = position+np.random.normal(0,120,size=(t.shape[0]))
    import matplotlib.pyplot as plt
    plt.plot(t,position,label='truth position')
    plt.plot(t,position_noise,label='only use measured position')
    
    
    # 初试的估计导弹的位置就直接用GPS测量的位置
    predicts = [position_noise[0]]
    position_predict = predicts[0]
    
    predict_var = 0
    odo_var = 120**2 #这是我们自己设定的位置测量仪器的方差,越大则测量值占比越低
    v_std = 50 # 测量仪器的方差
    for i in range(1,t.shape[0]):
      
        dv =  (position[i]-position[i-1]) + np.random.normal(0,50) # 模拟从IMU读取出的速度
        position_predict = position_predict + dv # 利用上个时刻的位置和速度预测当前位置
        predict_var += v_std**2 # 更新预测数据的方差
        # 下面是Kalman滤波
        position_predict = position_predict*odo_var/(predict_var + odo_var)+position_noise[i]*predict_var/(predict_var + odo_var)
        predict_var = (predict_var * odo_var)/(predict_var + odo_var)**2
        predicts.append(position_predict)
    
        
    plt.plot(t,predicts,label='kalman filtered position')
    
    plt.legend()
    plt.show()
    

    结果:
    在这里插入图片描述

    三、总结

    总的来说,卡尔曼滤波器是一个状态估计器,它利用传感器融合、信息融合来提高系统的精度。通常,我们要观测一个系统的状态,有两种手段。一种是通过系统的状态转移方程,并结合上一时刻的状态推得下一时刻的状态。一种是借助 辅助系统(量测系统) 的测量得到系统状态。这两种方式都有各自的不确定性,卡尔曼滤波可以将这两者做到最优结合(加权平均),使得我们估计的状态的不确定性小于其中任何一种。所以权重的选择至关重要,它意味着我们更信任哪一种方式得出的状态(当然是更加信任不确定性较小的状态)。

    参考文献

    http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/
    https://aistudio.baidu.com/aistudio/projectdetail/2025419?channelType=0&channel=0

    https://aistudio.baidu.com/aistudio/projectdetail/2079759?channelType=0&channel=0

    https://zhuanlan.zhihu.com/p/39912633

    展开全文
  • ADC采样滤波算法利用卡尔曼滤波算法详解

    万次阅读 多人点赞 2018-08-16 23:37:00
    方案二:比较一段时间内的ADC采样值与优化值差值,若一直处于某个范围如(6~30),采用一阶滞后滤波算法,反之采用卡尔曼滤波算法。 以下代码是方案一的优化代码,其优化效果可见我另一篇博文...

    1 ADC采样模型

    假设ADC采样的值已经为稳定状态,设 k + 1 k+1 k+1时刻ADC采样值为 X k + 1 X_{k+1} Xk+1,则 k k k时刻ADC实际值为 X k X_k Xk,假设 k + 1 k+1 k+1时刻的采样值为 Z k + 1 Z_{k+1} Zk+1,则有:
    { X k + 1 = X k + δ 1 , δ 1 为系统噪声 Z k + 1 = X k + 1 + δ 2 , δ 2 为测量噪声 \begin{cases} X_{k+1} = X_k+\delta_1, & \text{$\delta_1$为系统噪声}\\Z_{k+1}=X_{k+1} +\delta_2, & \text{$\delta_2$为测量噪声} \end{cases} {Xk+1=Xk+δ1,Zk+1=Xk+1+δ2,δ1为系统噪声δ2为测量噪声

    2 卡尔曼滤波算法

    我们知道卡尔曼滤波算法的公式如下:
    这里写图片描述

    由于相关系数都为1,于是可以得出如下公式:
    { P 0 , 0 = 0 P k , k − 1 = P k − 1 , k − 1 + Q G k = P k , k − 1 / ( P k , k − 1 + R ) P k , k = ( 1 − G k ) P k , k − 1 x 0 ∣ 0 = 0 x k ∣ k − 1 = x k − 1 ∣ k − 1 x k ∣ k = x k ∣ k − 1 + G k ( Z k − x k ∣ k − 1 ) \begin{cases} P_{0,0} = 0 \\P_{k,k-1}=P_{k-1,k-1} +Q \\ G_k = P_{k,k-1}/(P_{k,k-1}+R) \\ P_{k,k}=(1-G_k)P_{k,k-1} \\ x_{0|0} = 0 \\ x_{k|k-1} = x_{k-1|k-1} \\ x_{k|k}=x_{k|k-1}+G_k(Z_k-x_{k|k-1}) \end{cases} P0,0=0Pk,k1=Pk1,k1+QGk=Pk,k1/(Pk,k1+R)Pk,k=(1Gk)Pk,k1x00=0xkk1=xk1k1xkk=xkk1+Gk(Zkxkk1)

    3 C语言代码

    用C实现的代码如下:

    unsigned long kalman_filter(unsigned long ADC_Value)
    {
        float x_k1_k1,x_k_k1;
        static float ADC_OLD_Value;
        float Z_k;
        static float P_k1_k1;
    
        static float Q = 0.0001;
        static float R = 0.005;
        static float Kg = 0;
        static float P_k_k1 = 1;
    
        float kalman_adc;
        static float kalman_adc_old=0;
        Z_k = ADC_Value;
        x_k1_k1 = kalman_adc_old;
    
        x_k_k1 = x_k1_k1;
        P_k_k1 = P_k1_k1 + Q;
    
        Kg = P_k_k1/(P_k_k1 + R);
    
        kalman_adc = x_k_k1 + Kg * (Z_k - kalman_adc_old);
        P_k1_k1 = (1 - Kg)*P_k_k1;
        P_k_k1 = P_k1_k1;
    
        ADC_OLD_Value = ADC_Value;
        kalman_adc_old = kalman_adc;
    
        return kalman_adc;
    }
    

    4 如何优化

    用以上的代码实现的滤波算法,通常要么滞后严重,要么滤波效果不明显,在这里给出两种优化方案。
    方案一:在采样值与优化值相差大于某值时采用一阶滞后滤波算法,小于该值时采用卡尔曼滤波算法;
    方案二:比较一段时间内的ADC采样值与优化值差值,若一直处于某个范围如(6~30),采用一阶滞后滤波算法,反之采用卡尔曼滤波算法。
    以下代码是方案一的优化代码,其优化效果可见我另一篇博文https://blog.csdn.net/moge19/article/details/80915432:

    unsigned long kalman_filter(unsigned long ADC_Value)
    {
    float x_k1_k1,x_k_k1;
    static float ADC_OLD_Value;
    float Z_k;
    static float P_k1_k1;
    
    static float Q = 0.0001;
    static float R = 5;
    static float Kg = 0;
    static float P_k_k1 = 1;
    
    float kalman_adc;
    static float kalman_adc_old=0;
    
    Z_k = ADC_Value;
    
    if (abs(kalman_adc_old-ADC_Value)>=10)
    { 
        x_k1_k1= ADC_Value*0.382 + kalman_adc_old*0.618;
    }else
    {
        x_k1_k1 = kalman_adc_old;
    }
    x_k_k1 = x_k1_k1;
    P_k_k1 = P_k1_k1 + Q;
    
    Kg = P_k_k1/(P_k_k1 + R);
    
    kalman_adc = x_k_k1 + Kg * (Z_k - kalman_adc_old);
    P_k1_k1 = (1 - Kg)*P_k_k1;
    P_k_k1 = P_k1_k1;
    
    ADC_OLD_Value = ADC_Value;
    kalman_adc_old = kalman_adc;
    
    return get_int_num(kalman_adc);
    }
    

    用python实现并对其进行仿真,详见博文
    https://blog.csdn.net/moge19/article/details/82531119

    利用FFT分析卡尔曼滤波与低通滤波详见博文:
    https://blog.csdn.net/moge19/article/details/87389728
    卡尔曼滤波算法的推导过程详见博文:
    https://blog.csdn.net/moge19/article/details/89464151

    若有错误望方家指正

    展开全文
  • 卡尔曼滤波原理详解及系统模型建立(simulink)

    万次阅读 多人点赞 2019-12-06 11:27:56
    卡尔曼滤波器是在上个世界五六十年代的时候提出的,到今天已经有六十年左右的时间,但卡尔曼滤波算法不管在控制、制导、导航或者通讯方面对数据的预测能力依然处在一个不可撼动的位置上,但是很多人对于其算法内部的...
  • 详解卡尔曼滤波算法

    2020-12-08 15:54:43
    理解卡尔曼滤波算法 理解:https://www.zhihu.com/question/23971601/answer/375355599 实例:http://bilgin.esme.org/BitsAndBytes/KalmanFilterForDummies 逐行理解上述两个链接的内容,基本能搞懂卡尔曼滤波...
  • 卡尔曼滤波原理详解

    千次阅读 2019-01-08 23:23:34
    卡尔曼滤波原理详解 卡尔曼滤波在最有估计方面真的是非常常用,当然也是非常优秀的。这次我们从基本原理出发来理解卡尔曼滤波。包括卡尔曼滤波的前置知识:协方差矩阵,最大似然估计等。 协方差和协方差矩阵 协方差 ...
  • 卡尔曼滤波详解

    万次阅读 多人点赞 2019-03-20 19:37:53
    主要讲解基本的卡尔曼滤波算法,有时候也说是离散或者线性卡尔曼滤波。 首先来看一个数学公式,这部分仅仅是给定一个思路,和最后实际算法无关。目前考虑到要估计当前系统的状态,而且有两个已知量,一个上一个状态...
  • 详解卡尔曼滤波原理

    万次阅读 多人点赞 2017-03-18 13:54:15
    详解卡尔曼滤波原理 在网上看了不少与卡尔曼滤波相关的博客、论文,要么是只谈理论、缺乏感性,或者有感性认识,缺乏理论推导。能兼顾二者的少之又少,直到我看到了国外的一篇博文,真的惊艳到我了,不得不佩服作者...
  • MPU6050卡尔曼滤波算法及其推导过程,网上大部分都是只是代码,虽然可以用但是用起来总感觉怪怪的,特推导一下,如有错误请及时提醒,以免后来者再次犯错
  • 运动物体的轨迹预测,分别使用卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及数据拟合方法实现。本例代码仅含卡尔曼滤波部分代码。 本例仅为本人在研究轨迹预测问题时为理解算法原理所写,针对具体问题请自行斟酌...
  • 程序是一个基于RTS平滑的正弦信号滤波平滑算法的对比,Matlab中运行main.m文件即可。具体算法可以参考博客 https://blog.csdn.net/weixin_42647783/article/details/106035691。
  • 卡尔曼滤波推导详解

    2020-08-06 11:16:56
    Kalman Fitter 卡尔曼滤波的核心公式主要有两个: 其中参数有
  • 卡尔曼滤波算法及其python实现

    千次阅读 多人点赞 2020-01-07 15:20:54
    卡尔曼滤波算法及其python实现算法原理python实现 算法原理 python实现 # KF algorith demo by Leo # 2020.01.06 # ZJG CAMPUS,ZJU import numpy as np import matplotlib.pyplot as plt ''' 生成带噪声的...
  • 运动物体的轨迹预测,分别使用卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及数据拟合方法实现。本例代码仅含扩展卡尔曼滤波部分代码。 本例仅为本人在研究轨迹预测问题时为理解算法原理所写,针对具体问题请自行...
  • 运动物体的轨迹预测,分别使用卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及数据拟合方法实现。本例代码仅含无迹卡尔曼滤波部分代码。 本例仅为本人在研究轨迹预测问题时为理解算法原理所写,针对具体问题请自行...
  • 周威:【MOT】详解SORT与卡尔曼滤波算法 论智:图说卡尔曼滤波,一份通俗易懂的教程 zihaozhao:带你入门多目标跟踪(三)匈牙利算法&KM算法
  • 实用标准文案 一个应用实例详解卡尔曼滤波及其算法实现 标签 算法 filtermatlabalgorithm 优化工作 2012-05-14 10:48 75511 人阅读 评论 (25) 收藏 举报 分类 数据结构及其算法 4 为了可以更加容易的理解卡尔曼...
  • 卡尔曼滤波方程 简单示例程序 %% 参数设置 N = 200; % 设置数据长度为N t = (1:N); % 生成时间轴 a = 1; % 状态转移方程 b = 0; % 控制输入 c = 1; % c: 观测方程 x = 5; % 设置初值 初始的均值和方差 sigma2 = ...
  • 扩展卡尔曼滤波详解

    千次阅读 2020-11-15 18:12:26
    卡尔曼滤波详解讲解的基本的卡尔曼滤波算法是通过一个线性随机差分方程来估计当前状态,但是如果状态估计关系以及测量关系使非线性的怎么办,而且在实际使用中大部分的问题都是非线性的,所以提出了扩展卡尔曼滤波...
  • 卡尔曼滤波算法

    2019-10-21 21:15:03
    卡尔曼滤波器主要用于对系统状态的估计上,其算法思想是: 估计值=预测值+测量值 解释:根据系统状态在0,1,…,k-1时刻的估计值,预测k时刻的值x(k|k-1)。在查看k时刻传感器的测量值z(k),基于最小均方误差(估计值...
  • 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。 数据滤波...
  • 现代信号处理LMS 算法归一化的LMS算法,改进版的RLS,卡尔曼滤波算法,有详细的注析和仿真结果,且结果负荷预想的效果,带语音输入;经过滤波后,输出的效果更好了。
  • 一、引言 本文以rssi(接收信号强度)滤波为背景,结合卡尔曼的五个公式,设计 ...3、卡尔曼滤波过程及五个基本公式 4、公式中每个参数详细注释 5、结合rssi滤波实例设计滤波器 6、MATLAB实现滤波器 二、模型的...
  • 有关使用EKF进行姿态解算的各公式、公式的推导过程已经各雅各比矩阵的计算过程,上面有我自己的学习笔记,希望多交流!
  • 算法是基于UKF 的SRUKF 算法,其在运算效率和数值稳定性方面都比UKF快,且估计精度高。本程序已经过调试,切实可行,适合初学者。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 573
精华内容 229
关键字:

卡尔曼滤波算法详解