自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读!

2023-05-16

鉴于卡尔曼滤波算在多传感器融合系统中使用的普遍性,本文将单独就卡尔曼滤波算法及自动驾驶中常用的改进卡尔曼滤波算法进行详细介绍。

首先介绍卡尔曼滤波的基本方法,然后介绍针对非线性系统改进的扩展卡尔曼滤波,最后介绍卡尔曼滤波在自动驾驶中常用的联邦卡尔曼滤波。

1960年卡尔曼第一次发表了介绍卡尔曼滤波算法的论文,但卡尔曼滤波算法第一次实际应用则是将惯性导航器与C5A军用飞机上的机载雷达集成在一起。

卡尔曼滤波算法被称为“导航组合的驮马”,因为其已经成了现代导航系统的必要部分,特别是对于像GNSS和INS这样完全不同的系统进行组合导航的系统。

卡尔曼滤波可分为线性卡尔曼滤波、扩展卡尔曼滤波、级联式和联邦式卡尔曼滤波、无迹卡尔曼滤波等,下面将详细阐述卡尔曼滤波的原理。

  1. 最小方差估计

最小方差估计是指以均方误差最小作为估计准则的估计,即满足式(1):

上式中,为m维系统状态变量矢量;Z为n维观测矢量;

为用观测矢量Z计算得出的关于X的最小方差估计;E表示取均值,r(Z)表示由其他方法得到的X的估计值。容易证明,最小方差估计是无偏的,即残差的均值为0,满足下面式子

同样容易证明,最小方差估计的均方误差就是估计误差的方差,即

以上公式为了求得X的最小方差估计,必须首先得到X的条件概率密度,对于工程中的实际应用而言,系统状态的各种条件概率密度是很不容易得到的,因此这种估计方法的应用受到一定限制。

2、卡尔曼滤波估计

如果将估计值

规定为观测矢量Z的线性函数,即

上式中,A和b分别是阶的矩阵和n维矢量。A值和b值仍旧按照最小方差估计来选择,则这样的估计被称为线性最小方差估计。

可以证明,这种估计只需要知道被估计值X和观测值的一、二阶统计特性,所以它比最小方差估计更加实用,尽管它的估计精度一般小于最小方差估计。

对于动态系统,工程上常常要求由t时刻的量测值Z(t)计算出该时刻状态X(t)的估计

,由于X(t)是历史时刻的状态按照系统转移规律发展过来的,与历史时刻的状态有关联,所以,利用t时刻和历史时刻的所有观测值对X(t)进行估计,将有助于提高估计精度。

但是对于最小方差估计和线性最小方差估计而言,由于计算方法的限制,同时处理不同时刻的观测值而得到t时刻估计值的计算量太大。因此,这两种估计方法不适合估计动态系统的状态。

卡尔曼滤波是一种递推线性最小方差估计,它的估计准则仍是方差最小估计技术。在工程技术中,为了解工程对象(系统)的各个物理量(状态),或者为了达到控制工程对象的目的,必须采用测量手段对系统的各个状态进行测量,由于观测值可能是系统的部分状态或其线性组合。

且包含随机误差(也称观测噪声),最优的估计能将仅与部分相关的观测值进行处理,从而得到统计意义上估计误差最小的更多状态的估计。

因此,卡尔曼滤波是一种递推线性最小方差估计,它的估计值是观测值的线性函数,满足式(3)。并且,只要包含初始估计值在内的滤波算法初值选择正确,它的估计也是无偏的。

在计算方法上,卡尔曼滤波采用了递推模型,即在历史估计值的基础上,根据t时刻的观测值,递推得到t时刻的状态估计

由于历史时刻中每一时刻的估计值又是根据其历史时刻的观测值得到,所以,这种递推算法的估计值可以说是综合利用了t时刻和t时刻以前的所有观测信息得到,并且一次仅处理一个时刻的观测值,使计算量大为减少。因为卡尔曼滤波是用状态方程和观测方程来描述系统和观测值的,所以它主要适用于线性动态系统。

3、卡尔曼滤波方程

虽然工程对象一般都是连续系统,但卡尔曼滤波常常采用离散化模型来描述系统,以便计算机进行处理。离散系统就是用离散化后的差分方程来描述连续系统。

假设离散化后的系统状态方程和观测方程为:

上式中,

为k时刻的n维状态矢量,也是被估计矢量;为k时刻的m维观测矢量;为k-1时刻到k时刻的系统一步转移矩阵;为k-1时刻的系统噪声(r维),为系统噪声矩阵,它表征由k-1时刻到k时刻的各个系统噪声分别影响各个状态的程度;为k时刻的观测矩阵;为k时刻的m维观测噪声。

卡尔曼滤波要求

和是互不相关的零均值的高斯白噪声序列,有

上式中,

和分别为系统噪声和观测噪声的方差矩阵,在卡尔曼滤波中要求它们分别是已知值的非负定阵和正定阵;是狄利克雷函数,即

上初始状态的一、二阶统计特性为:

上式中,var表示求方差,卡尔曼滤波要求

和为已知量,且要求与

以及

都互不相关。

4. 离散卡尔曼滤波的计算流程

由递推的观点看,假如在k-1时刻已经获得了对

的最优估计值,并且在k时刻又观测到,则当前时刻k的最优估计值可用两者的线性组合表示,即

上式中,A、B待定但需保证不同维,满足

上式中,

、分别为与A、B同维的任意矩阵。最终卡尔曼滤波可以按照如下流程进行计算。

状态一步预测方程为

上式中状态估计计算方程为

上式中,Kk为卡尔曼滤波增益。滤波增益方程为

上式中一步预测均方误差方程为

上式中估计均方误差方程为

5. 扩展卡尔曼滤波

传统卡尔曼滤波要求系统的状态方程和观测方程均是线性条件,然而现实中,许多工程系统往往不能简单地用线性系统来描述,如参数估计引入增广状态方程的非线性、结构关系带来的非线性和观测信号的非线性。

因此,十分有必要对非线性滤波进行深入的讨论。一般情况是将非线性方程线性化,而后利用线性卡尔曼滤波基本方程处理线性问题。

当式(5)是非线性的,则系统状态方程和观测方程为

状态一步预测方程为

上式中,为过程噪声。扩展卡尔曼滤波算法就是将非线性方程线性化的滤波算法,是解决非线性滤波问题常用的一种方法。

其时间递推公式和卡尔曼滤波相似,与卡尔曼滤波算法不同的是式(11)中的状态一步预测方程中的参数要用非线性函数的一阶偏导数来计算,不具有像线性滤波那样可以实现离线计算增益和协方差的优点。

6. 联邦卡尔曼滤波

联邦卡尔曼滤波框图如图1所示。联邦卡尔曼滤波一般分为两步滤波,即先基于局部传感器进行滤波,然后再进行主滤波。先假设状态向量从k-1时刻的

转移到k时刻的,其动力学模型为

上式中

,为时间k-1到k的状态转移矩阵,为动力学模型误差,与

不相关。

设在k时刻有r个传感器,各传感器相应的观测方程为

上式中,为传感器i的观测方程设计矩阵,和为传感器i的观测向量和误差向量。假设各传感器观测误差与动态模型误差不相关,各传感器观测误差互不相关。

由各传感器得到局部滤波解为

上式中

设主传感器(参考传感器)的观测向量为Lmk,则主滤波(MF)解为

上式中,KmkAmk分别与KikAik类似。

由联邦卡尔曼滤波算法信息分享原理,可得最终融合滤波解

。及相应的权矩阵为

 (29)

上式中,

分别为局部传感器滤波输出的状态估计向量的权矩阵,为联邦滤波算法输出的状态向量的权矩阵(或称信息矩阵),它们是相应协方差矩阵的逆矩阵。

由式(29)得

7. 总结

卡尔曼滤波算法作为一种经典算法,由于其实时性强、融合精度高,在自动驾驶领域中被广泛使用。

本文首先介绍了卡尔曼滤波的基本方法,然后介绍了针对非线性系统改进的扩展卡尔曼滤波,最后介绍了卡尔曼滤波在自动驾驶中常用的联邦卡尔曼滤波。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读! 的相关文章

  • Kendryte K210 在freertos上的uart的使用

    首先修改project cfg h文件 xff0c 将硬件定义好的i2c引脚定义好 xff0c 其中40和41表示IO40和IO41 xff0c 如下 xff1a const fpioa cfg t g fpioa cfg 61 versi
  • Kendryte K210 在freertos上的lcd屏幕的使用

    K210上的lcd的屏幕为8位的spi并行接口 使用的屏幕开发板的型号为JLT32009A 某宝应该是可以买到的 需要注意的是若在某宝买的这种屏幕 一般会有8位和16位的区别 商家会告诉你这是两个不一样的屏 但是通过我们查看屏幕的规格书会发
  • Gamma分布、Beta分布、Dirichlet分布

    函数 函数是阶乘在实数上的推广 xff0c 定义为 xff1a x 61 43 0 t x 1 e t d t 函数的性质 xff1a x 43 1 61 x x
  • 消息队列OSQCreate失败:Assertion "OSQCreate" failed at line 71 in ..\LWIP\arch\sys_arch.c错误解决方法

    在STM32F407的上移植正点原子例程中的ucosII和LWIP功能时 xff0c 发现其他任务中创建其他消息邮箱后 xff0c 出现了如下的错误 xff1a Assertion OSQCreate failed at line 67 i
  • 学习Linux 编程的几本好书

    这次涉及到了具体的平台 GNU Linux Linux下开发与明显不同于Windows平台的特点 xff0c 从开发工具到项目组织 xff0c 都有较大的差距 首先声明 xff0c 在做Linux平台开发之前 xff0c 首先要熟练使用Li
  • http parser库的使用方法

    include 34 http parser h 34 include lt stdio h gt include lt stdlib h gt include lt string h gt include lt assert h gt i
  • PIXhawk4飞控学习笔记(一)开发环境

    PIXhawk4飞控学习笔记 xff08 一 xff09 开发环境 PIX4简介开发环境准备PIX4控制板MDK Keil5STM32CUBEMAXQGroundControl地面站 总结 PIX4简介 PX4是Dronecode平台的一部
  • Git常用命令

    1 Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址 这是非常重要的 xff0c 因为每次Git提交都会使用该用户信息 在Git 命令行中执行下面命令 xff1a 设置用户信息 git config global
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • 存储卡插上电脑时显示文件名变乱码请问怎样才能修复???

    存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编今天碰到的一个 xff0c 打开分区提示文件名变乱码 xff01 存储卡插上电脑时显示文件名变乱码请问怎样才能修复 存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编
  • putty使用python模块tkinter显示对话框出现_tkinter.TclError: no display name and no $DISPLAY environment variable

    问题描述 xff1a putty不能显示对话框 出现错误提示 xff1a tkinter TclError no display name and no DISPLAY environment variable 解决办法 xff1a 下载安
  • 有关于ValueError: Variable rnn/basic_lstm_cell/kernel already exists, disallowed.的问题

    很简单 xff0c 重新跑一篇程序 xff0c 我理解为重启核 xff1f xff1f xff1f jupyter中有kernel选项 xff0c 点击选择 Restart amp RunAll xff0c 即可解决问题 Mark
  • 从尾到头打印链表

    题目描述 xff1a 输入一个链表 xff0c 按链表值从尾到头的顺序返回一个ArrayList 分析 xff1a 1 xff0c 新建两个arraylist xff0c 2 xff0c 遍历链表 xff0c 存入第一个arraylist
  • Win10的Linux子系统Ubuntu安装图形界面

    Win10 的 Linux 子系统 Ubuntu 安装图形界面 陈拓 2021 07 25 2021 07 26 1 概述 Win10的linux子系统Windows Subsystem for Linux xff08 简称 WSL xff
  • 得到斐波那契数列的第n个数

    题目 xff1a 现在要求输入一个整数n xff0c 请你输出斐波那契数列的第n项 xff08 从0开始 xff0c 第0项为0 xff09 n lt 61 39 分析 xff1a 1 xff0c 1 xff0c 2 xff0c 3 xff
  • ModuleNotFoundError: No module named 'scipy._lib.decorator'问题解决

    问题来源 xff1a 在导入sklearn库时 xff0c 出现 usr lib python3 dist packages scipy sparse linalg isolve iterative py in 8 9 from scipy
  • 二叉搜索树的后序遍历序列

    题目 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 分析 碰到二叉树 xff0c 优先想递归 这里 xff0c 后序数组 xff0c 最
  • 二叉树中和为某一值的路径

    题目 输入一颗二叉树的跟节点和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 注意 在返回值的list中 xff0c 数组长度大的数组靠前 分析 二叉树
  • 复杂链表的复制(java)

    题目 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意 xf
  • CMake学习-添加头文件路径,库路径,库

    CMake中 xff0c 添加头文件路径 xff0c 对应的函数叫include directories 然后在参数中 xff0c 把所有需要添加的路径 xff0c 加进去就可以了 添加库路径 xff0c 对应的函数叫LINK DIRECT

随机推荐

  • Docker Run 命令

    docker run 参数 xff1a e xff1a 向容器内传递环境变量 xff0c 启动容器时用户可以动态传参 v 挂载文件 xff0c 把该容器的数据保存到挂载文件上 p 端口映射 xff08 p 8888 3306 8888宿主机
  • 如何复现论文?什么是论文复现?

    参考资料 xff1a 学习篇 顶会Paper复现方法 知乎 如何读论文 xff1f 复现代码 xff1f 复现代码是什么意思 CSDN 我是如何复现我人生的第一篇论文的 知乎 在我看来 xff0c 论文复现应该有一个大前提和分为两个层次 大
  • Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

    Kinect 获取深度图计算距离 xff0c 并进行彩色图和深度图之间的映射 最近所进行的项目需要利用KINECT获取深度距离 xff0c 需要得到彩色图中某一点的位置 xff0c 在网上找了很多资料 xff0c 都不是很好 xff0c 碰
  • 十一个顶级的Git 客户端,绝对很实用!

    导读Git是一种免费开源的分布式版本控制系统 xff0c 可用于处理软件开发及另外几种版本控制任务 它旨在处理大大小小的各种项目 xff0c 并确保速度 效率和数据完整性 Linux用户主要可以通过命令行来管理Git xff0c 不过外面有
  • Windows USB串口接收GPS北斗模块数据和数据说明

    陈拓 2022 05 07 2022 05 09 1 简介 本文以GPS 43 北斗卫星定位授时导航模块HT1818Z3G5L为例 xff0c 在Win10下读数据 产品参数 引脚定义 2 连接PC机和HT1818Z3G5L模块 如图 xf
  • Linux也有全功能杀毒软件啦!

    导读近日 xff0c 瑞星公司推出瑞星杀毒软件Linux全功能版 xff0c 它是一款功能齐全 高性能的企业级安全产品软件 xff0c 并且新增国内首家 文件监控 与 网络监控 功能 xff0c 对Linux系统进行系统和网络双层防护 xf
  • 虚拟现实的起源、发展、爆发与沉淀

    虚拟现实的三生三世 闲来无事翻篇外文 xff0c 本博主并非故意蹭热点 xff08 奸笑 xff09 xff0c 结尾我会细说为何是三生三世 xff0c 不是五生五世 xff1a 虚拟现实远早于这个概念被创造和形式化之前 在这篇描写虚拟现实
  • UCOS消息队列的使用【转】

    UCOS消息队列的使用 转 收藏 消息队列的使用 1 需在以下文件中配置如下内容 OS CFG H OS MAX QS N 你需要的值 根据需要自己配置 define OS Q EN 1 Enable 1 or Disable 0 code
  • to_string函数的用法

    to string 函数 xff1a 将数字常量转换为字符串 xff0c 返回值为转换完毕的字符串 头文件 xff1a include lt string gt string s 61 to string i 将整数i转换为字符串表示形式
  • EKF2学习之控制融合模式

    By snowpang 2017 8 10 1 存储控制状态值 xff0c 并开启状态变化检测 control status value bitmask containing filter control status union filt
  • 经典算法 (四) 桶排序

    时隔一年 xff0c 小葵花课堂再次开课 xff0c 这次开课不会像之前那样很早就停课了 xff0c 在此给大家道个歉 xff1a 对不起 嘻嘻 又到了毕业季了 xff0c 废话不多说 xff0c 继续我们的算法学习 一丶算法描述 桶排序
  • 程序调试记录(纯自用)

    Stack类测试 xff1a 在测试Stck类型的变量内容是否正确时 xff0c 经常会通过把所有值pop出来输出的方法 xff0c 这样容易造成一个问题就是 xff0c 栈已经被弄空了 xff0c 以后再用的时候就会是一个空栈 所以 xf
  • vector详解

    引言 emmm 这篇博客写作的缘由其实就是我在日常使用vector的时候发现对vector并不怎么了解所以决定写这篇博客的 写这篇博客 xff0c 我参考了vector C 43 43 Reference中的内容 xff0c 及侯捷先生的
  • Eigen快速入门

    Eigen快速入门 一个简单的例子 span class hljs preprocessor include lt iostream gt span span class hljs preprocessor include 34 Eigen
  • PX4 的 ECL EKF 公式推导及代码解析

    原创作者 USRL所长 64 CSDN 文章来源 https blog csdn net u010307048 article details 100553475 如需转载联系联系原创作者 作者整理的内容如下 xff0c 干货很多 xff0
  • git fatal: The remote end hung up unexpectedly错误解决方法

    在使用git更新或提交项目时候出现 34 fatal The remote end hung up unexpectedly 34 原因是推送的文件太大 那就简单了 xff0c 要么是缓存不够 xff0c 要么是网络不行 xff0c 要么墙
  • 公开课精华|机器人的带约束轨迹规划

    本文章总结于大疆前技术总监 xff0c 目前在卡内基梅隆大学读博的杨硕博士在深蓝学院的关于机器人的带约束轨迹规划的公开课演讲内容 全文约5000字 笔者不是机器人领域的 xff0c 因此特地去了解了一下杨硕博士 xff0c 深感佩服 xff
  • 自动驾驶的重要一环:谈谈感知前沿技术

    本文总结于Waymo研发经理周寅于2021年8月29日在深蓝学院的讲座 讲座内容主要包括自动驾驶系统的总览 xff0c 自动驾驶感知的介绍 xff0c 以及感知的前沿动态和总结 1 自动驾驶系统总览 关于自动驾驶系统 目前主流的L4级别自动
  • 论文精读 | slam中姿态估计的图优化方法比较

    一 摘要 对于位置环境中的自主导航问题 xff0c 同步定位与建图 Simultaneous localization and mapping SLAM 是一个非常重要的工具框架 根据SLAM字面含义可以得知 xff0c 获取正确的环境表征
  • 自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读!

    鉴于卡尔曼滤波算在多传感器融合系统中使用的普遍性 xff0c 本文将单独就卡尔曼滤波算法及自动驾驶中常用的改进卡尔曼滤波算法进行详细介绍 首先介绍卡尔曼滤波的基本方法 xff0c 然后介绍针对非线性系统改进的扩展卡尔曼滤波 xff0c 最后