自动驾驶融合定位:kalman 滤波器基本原理

embedded/2024/11/24 21:02:49/

自动驾驶融合定位:kalman 滤波器基本原理

一、概述

kalman滤波是一个重要的融合手段,虽然最近几年,随着基于优化的方法不断推广,基于滤波的方法逐渐式微,但是,由于二者各有优缺点,滤波方法现在及将来都仍然是重要的融合手段之一。

在多传感器融合定位系统中,kalman解决的其实是这样一个任务

image

它的本质是,结合预测与观测,得到最“精确”的后验值。实际中,预测与观测均从传感器而来(预测往往从IMU、编码器等传感器递推而来,观测往往从GPS、雷达、相机等传感器而来),因此滤波器的作用便是结合各传感器得到一个最好的融合结果。

kalman滤波的推导会显得很复杂,而且有多种推导方式,我们理解其中一种就可以,大可不必全都掌握。就像孔乙己会沾沾自喜地告诉别人,茴香的茴有四种写法,没多大用处(当然,这里指的是工作人员,如果是研究滤波理论的,那深入到多深都不为过,就像如果你是专门研究汉字的,茴香的茴了解这四种写法可能都不够,还要研究它的演化史,甚至不同地域的不同发音)。

关于工程人员的理论深度,我们可以在本篇文章末尾再更详细地讨论一次。

image

附赠自动驾驶学习资料和量产经验:链接

二、概率基础知识

kalman 滤波的推导会用到大量的概率基础知识,为了后面的推导过程更流畅,我们就先把基础知识解决了。

1.概率、概率密度

image

上图中, 𝑝(𝑥) 为x在区间[a,b]上的概率密度,它表示的是随机变量在区间的分布情况。 𝑃𝑟 代表的是x在区间[c,d]上的概率,它是概率密度的积分

image

我们平时所说“高斯分布”、“非高斯分布”均是指它的概率密度。

2.联合概率密度

𝑥∈[𝑎,𝑏] 和 𝑦∈[𝑟,𝑠] 的联合概率密度函数可以表示为 𝑝(𝑥,𝑦) ,其积分表示x和y同时处在某个区间的概率,满足下式

image

特别地,当x和y统计独立的时候,有

image

3.条件概率密度

image

4.贝叶斯公式

image

5.贝叶斯推断

image

6. 高斯概率密度函数

image

7. 联合高斯概率密度函数

image

该式在高斯分布的前提下可以重新分解。

image

image

8. 高斯随机变量的线性分布

在上面的例子中,若已知xy之间有如下关系

image

image

同理可得:

image

三、滤波器推导

由于kalman滤波是贝叶斯滤波的一种(如下图),而贝叶斯滤波又是递推式状态估计的一种,我们得从大到小把这些东西讲一讲,逐渐缩小到kalman滤波这个地方,这样容易把问题讲清楚。

image

1.状态估计模型

实际状态估计任务中,待估计的后验概率密度可以表示为

image

image

image

图模型中体现了马尔可夫性,即当前状态只跟前一时刻状态相关,和其他历史时刻状态无关。

该性质的数学表达为:

image

2. 贝叶斯滤波

image

image

这种公式表达形式,其实就可以称为是贝叶斯滤波了。根据以上结果,可以画出贝叶斯滤波的信息流图如下

image

3.kalman滤波推导

终于进入到了这个环节,不过要说明的是,我们这里kalman滤波的推导并不是按照上面贝叶斯滤波的表达形式去推的,上面贝叶斯滤波的讲述只是为了从更大的角度说明kalman是贝叶斯滤波的一种,这样更容易理解它的本质。此处推导kalman的方式是广义高斯滤波。

image

image

上面三个方程与之前所述预测方程(如下),就构成了卡尔曼经典五个方程

image

需要说明的是,若不把第二节8中的结果带入,而保留原始形式,则对应的五个方程被称为广义高斯滤波。

4.扩展kalman滤波(EKF)推导

当运动方程或观测方程为非线性的时候,无法再利用之前所述的线性变化关系进行推导,常用的解决方法是进行线性化,把非线性方程一阶泰勒展开成线性。即

image

根据该线性化展开结果,可以得到预测状态的统计学特征为

image

把均值和方差的具体形式,带入广义高斯滤波的公式,最终得到EKF下得经典五个公式

image

5. 迭代扩展卡尔曼滤波(IEKF)推导

由于非线性模型中做了线性化近似,当非线性程度越强时,误差就会较大。但是,由于线性化的工作点离真值越近,线性化的误差就越小,因此解决该问题的一个方法是,通过迭代逐渐找到准确的线性化点,从而提高精度。

image

四、kalman滤波的物理理解

我个人有个习惯,就是喜欢从物理意义上去理解公式,而且我也坚持认为,只有从物理意义上理解了,才算是真正的理解了(虽然我还没有完全做到这一点,很多公式我还没有在物理上给出让自己信服的解释)。

公式是用来实现算法的,而不是理解算法的,这二者之间有非常大的区别。物理史上,很多好的理论创建的时候,也都是从一个简单的物理假设出发,再去用公式去证明它的正确性和梳理它的实现过程。

我们先再次列出kalman的这五个公式

image

为了更好地理解它的物理意义,我们把(5)式拆开,并把这些公式重新排一下顺序(注意这个顺序并不是实际计算的顺序,只是方便理解),在每个公式前面加上它的物理意义。

image

这一步需要解释一下了:

image

那么啰嗦了这么一大堆,其实我们可以看到,kalman的物理意义其实就是“把预测的值和观测的值做一个加权,而且这个加权权重是用方差计算的”。现在再回过头去看概述中的那张图,应该可以更好地理解了吧。

五、总结

kalman 推导的内容倒没什么可总结的了,此处可以讨论一下开头提到的那个话题,即工程人员到底应该对理论的掌握深入到什么程度。当然,这是一个开放性的话题,没有标准答案,我也只是表达我个人观点而已,抛砖引玉,不一定对。

首先理论是为工程服务的(仅限于工程领域),这个应该没什么疑问,那么理论的掌握就本着“够用”就好,怎样理解“够用”,我认为它包括两点,第一,是要理解它的物理含义,第二,是要能够在它因任务的不同而发生变化时,能相应地做出理论上的修改。对于这里的 kalman 来讲,它的物理含义我们已经介绍过了,完全可以用这五个公式描述,而变化,实际工程中,倒并没有需要kalman做过多的变化(那些停留在论文里,但很少被工程化的那些改进版的kalman滤波理论以外)。这样看,单单对于kalman来讲,我认为,即使一种推导方式都不会,也没啥大不了的,仍然可以理直气壮,不用觉得低人一头。真正应该感到羞愧的,是那些公式推导很熟悉,但是对这些方法在实际系统中表现出的优缺点却知之甚少的人。

必须说明的是,前面仅仅是对kalman这一件事来讲,它的五个公式已经满足“够用”的标准,对于其他事,比如前面讲的误差模型推导,那就真的得掌握了,因为不同传感器、甚至同一传感器不同精度,所需要的误差模型都不一样,这种灵活多变的需求,使它的结论本身不能满足“够用”的标准。

这个观点可能很多人并不同意,应该用的最多的反对理由就是“理论深度不够怎么行,况且理论掌握的深了又没有什么坏处”。对于前半句,其实我们通过对“够用”的分析,算是已经反驳过了,对于后半句,倒也不能说错,毕竟技多不压身嘛,不过我们应该注意到的是,这个“多”是要付出代价的,最宝贵的代价当属时间,在校生要挤更多时间做课题,工作的能抽出时间学习已经不容易,即使有一些时间,还想着去搞搞自己的kpi,总之,应该没有谁的时间是无限的。那么,这时候,刚才的后半句就得变成“在付出代价的情况下,相比于理论掌握的深入,他俩谁的价值更大”,相信大家肯定明白我在说什么。

一刀切(越多越好)谁都会,权衡(资源有限情况下的取舍)才是最难的事情,它需要认清每件事情的价值,这需要不间断的思考,甚至称得上是一门艺术。


http://www.ppmy.cn/embedded/34191.html

相关文章

2025考研政治徐涛核心考案基础+强化班视频课程,百度网盘PDF资源

大家好,今天给大家带来的是徐涛强化课笔记。 25徐涛课程:徐涛2025网盘资源课 使用建议: ①看课的时候辅助使用。不用在看课时点暂停做笔记,只需要简单的补充一点在书上即可,后期也可以当知识手册背诵。 ②二战的同…

Spring Boot应用部署 - Tomcat容器替换为Jetty容器

Jetty和Tomcat容器对比 Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的servlet规范和JavaEE的规范。 Jetty更轻量级。这是相对Tomcat而言的。 Jetty更灵活。 Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。 Tomcat容器替换为…

ansible报错解决:Failed to import the required Python library (netaddr)

ansible报错解决:Failed to import the required Python library (netaddr) 问题情况 今天我在做实验的时候出现了一个问题,以下是我的playbook,这个playbook是验证变量ip_address是否是一个合法的IP地址,并打印相应的信息的一个…

libmodbus使用

安装可以看这个博客&#xff1a; https://blog.csdn.net/hanhui22/article/details/105786762 它的安装可以&#xff0c;但是编译测试看不太懂&#xff0c;我没跟着它的编译&#xff0c;完了后把/lib下的 放到开发板的/usr/lib下 编写代码: #include <stdio.h> #inclu…

Grafana:云原生时代的数据可视化与监控王者

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

android native开发

framwork 一些重要的流程都是要放到native中做的 原因也很简单&#xff0c;效率&#xff0c;尤其是针对性能优化方面的&#xff0c;更离不开native开发 目前针对native开发也回顾下&#xff0c;总结下经验 1 jni开发有两种&#xff0c;app端一般是静态模式&#xff0c;要有jav…

主成分分析在R语言中的简单应用:使用mvstats包

在数据科学领域&#xff0c;主成分分析&#xff08;PCA&#xff09;是一种广泛使用的技术&#xff0c;主要用于数据降维和探索性数据分析。PCA可以帮助我们发现数据中的模式&#xff0c;减少数据集的复杂性&#xff0c;同时保持数据中最重要的特征。本文将介绍如何在R语言中使用…

如何面对并发下的bug

整理总结自蒋炎岩老师的b站课程&#xff0c;https://jyywiki.cn/OS/2022/index.html 并发bug与应对 应对bug的方法 在代码里边增加很多检查(加断言) #include "thread.h"unsigned long balance 100;void Alipay_withdraw(int amt) {if (balance > amt) {usleep(…