道不尽的卡尔曼!通俗易懂详细解释卡尔曼滤波

作者 | Mockingjay  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/134595781

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【目标跟踪】技术交流群

本文只做学术分享,如有侵权,联系删文

概述

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

建模

比如,我们观测一辆小车的速度和位置(所以我们要观察的状态就是速度 v 和位置 p ,即状态 x=(v,p) ,这里的 p,v 都是向量),当我们有了 k-1 时刻的状态 =(,) 后,那么如果速度不变,我们就可以得到下一时刻的状态 =(,) ,其中

7a89f69983d23467ecd69bf68105af1e.png

当然,我们也可以对小车进行控制,比如让小车加速、拐弯等等,这些都可以用一个加速度来表示: ,这样,下一时刻状态 =(,) 的表示变为:

1b912f603b509b7ba17456571eaa6605.png db41a249865950b4402d4bff8798042f.png

其中:

b1f9e797ae0817fa626266734c59b713.png

但是,现实的情况并没有那么理想,小车可能会受到外界的各种扰动,比如,轮胎打滑,地面崎岖等等,都会使得状态转移的过程中混入噪音干扰(过程噪声),而且这个噪音往往是不可被测量的,也就是说,没办法通过建模消除噪音项。不过,往往我们可以认为这个噪音是服从零均值的高斯分布的。那么(1)式重写为

534537d2b175e471e13135f688f292f7.png 7549cdf49177606b3325681b7c6e6c66.png

上面的状态转移方程为我们提供了观察系统状态的一种方式,同时,我们可能有一些辅助系统,比如对于这个小车,我们可以用GPS作为得到其状态的另一种方式。

那样的话,GPS每一时刻都可以提供一次当前状态的观测值 ,它与真实状态 的关系为,=+  (3)

其中的 是观测模型,它把系统真实状态空间映射成观测空间, 是噪声项,称为观测噪声——因为任何的测量系统都是有误差的,所以观测值实际上是真实值与噪声的叠加。我们同样可以认为此噪声是服从0均值的高斯分布的。即

3b6e6fffaf339097c3daa9951e1cb3b6.png

现在我们比较这两种方式得到的系统状态,容易想到,状态转移方程得到的系统状态在演变时会非常平滑,而它的不确定度会随着迭代的进行而逐渐增大,因为误差会在一次次迭代的过程中不断累积(具体反映为估计状态的方差越来越大)。相反,由量测系统得到的状态不存在累积误差,但演变时也会很不平滑。这时我们就需要将两者得到的状态有效结合起来。这就是卡尔曼滤波做的事情了。

卡尔曼滤波

ff1d9fa10781fae53d8590dbcaa23dd0.png ccbd35162a2f9dcd7d650f30b0e51f57.png

然后我们要算出测量残差:

5404ee0a503f48a047117765c3d86a5e.png f17296070e9b2b8c46daa9633ad4916b.png 25741aa2a21c04e8e3dfb8760ca2c6c3.png

第一项为0,因为 代表k时刻系统状态的真实值,是一个固定值,没有协方差。所以简化为:

7ff9c552886c1f34fa2323992915ba09.png c61e3bbc54f90c0ac74916873cf07b17.png 5aa35d9a66d65fb388f8e0f2fe8f529c.png 1d3bb7f26368084df41004a484f7cacb.png 2911b07e9527cfa8f7893a356d40c3d7.png 99efaa150aeefd3c43a05c68f4b283dd.png

补充内容:

e87e7e4cb7c2d82d08d9db6d2e1dd249.png 5daf008d6a66eb7715de26a435ed0566.png 717033ba7cfeea84086bbd6645babab0.png

另外,直观上理解:协方差矩阵代表的是数据分布的一种不确定度,这种不确定度本身不具有所谓的正负号,不可能因为加减而有所抵消。

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、点云3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码学习)

e6235a5db1a8910209d833ebdecc230a.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

ce444c6ce4f19406604bf7295978e6a9.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

079095f64c594f3c1c9812b097880c16.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

0032f7e8ede2be5776d40b19ebe0bbef.jpeg

<think>好的,我现在需要帮助用户理解卡尔曼滤波的基本概念及其实现方式,而且要求讲解要简单易懂。首先,我得回顾一下卡尔曼滤波的核心原理,然后想办法用通俗的语言解释,避免太多数学术语,但又不能失去准确性。 用户提供的引用材料中提到,卡尔曼滤波基于线性系统和高斯噪声假设,有五个基本方程。我需要把这些方程简化,用日常例子来类比。比如,预测和更新的过程,可能可以用天气预报来比喻。预测步骤就像根据今天的天气推测明天,而更新则是根据实际的观测数据调整预测,这样会更准确。 另外,用户提到的示例中,快速排序用代码和分步说明,可能我需要类似的结构。或许可以分步骤解释卡尔曼滤波的流程,每个步骤用简单的语言说明,再结合一个实际例子,比如小车的位置估计,这样用户更容易理解。 还需要注意引用材料中的内容,比如引用[2]提到的两个假设,必须准确传达,但要用简单的语言。同时,引用[4]中的一阶卡尔曼滤波应用,可能涉及到ADC读取红外测距,这个可以作为例子,但可能需要简化,避免深入硬件细节。 用户可能需要区分卡尔曼滤波与其他滤波方法,比如粒子滤波,引用[3]提到粒子滤波器的问题,可以简要对比,但重点还是在卡尔曼本身。此外,要确保回答结构清晰,分点解释,可能用预测和更新两个大步骤,每个步骤再分解成小点。 需要检查LaTeX格式是否正确,所有数学表达式用$...$,独立公式用$$...$$。例如,状态方程和观测方程需要用LaTeX正确呈现。同时,生成的相关问题要围绕用户可能的疑问,比如应用场景、与其它滤波的区别、实现步骤等。 最后,确保回答末尾有引用标识,引用[^1]、[^2]等,但引用要自然融入内容中,不打断阅读。可能需要多次修改,确保逻辑连贯,语言通俗,同时技术细节准确无误。</think>### 卡尔曼滤波原理及其通俗解释 #### 1. **核心思想** 卡尔曼滤波是一种通过**“预测+修正”**动态估计系统状态的方法。它像一位“聪明的天气预报员”,每次预测天气后,再结合实时观测数据调整预测结果,最终给出更准确的估计值[^2]。 --- #### 2. **通俗比喻:小车的定位问题** 假设我们需要估计一辆小车的位置: - **预测(先验估计)**:根据小车的速度模型(比如匀速运动),推测它下一秒的位置。 - **修正(后验估计)**:用传感器(如GPS)测量实际位置,将预测值和测量值“加权平均”,得到更精确的结果。 **关键点**:预测可能不准(比如小车突然加速),传感器也有误差。卡尔曼滤波通过数学方法动态调整两者的权重,让估计值越来越接近真实值。 --- #### 3. **核心公式(简化版)** 卡尔曼滤波包含五个方程,核心可归纳为以下两步: 1. **预测阶段** - 预测状态:$$ \hat{x}_k^- = A \hat{x}_{k-1} + B u_k $$ ($A$是状态转移矩阵,$u_k$是控制输入) - 预测协方差:$$ P_k^- = A P_{k-1} A^T + Q $$ ($Q$是过程噪声协方差,表示预测的不确定性) 2. **更新阶段** - 计算卡尔曼增益:$$ K_k = P_k^- H^T (H P_k^- H^T + R)^{-1} $$ ($H$是观测矩阵,$R$是观测噪声协方差) - 修正状态:$$ \hat{x}_k = \hat{x}_k^- + K_k (z_k - H \hat{x}_k^-) $$ ($z_k$是实际观测值) - 更新协方差:$$ P_k = (I - K_k H) P_k^- $$ --- #### 4. **通俗理解公式** - **卡尔曼增益$K_k$**:相当于“信任权重”。 - 如果传感器精度高($R$小),则更信任观测值($K_k$大); - 如果预测值更可靠($P_k^-$小),则更信任预测值($K_k$小)[^4]。 --- #### 5. **实现方式示例(一维场景)** 假设用红外传感器测距离,存在噪声: ```python # 简化的卡尔曼滤波实现(一维) class KalmanFilter: def __init__(self, initial_state, process_variance, measurement_variance): self.state = initial_state self.process_var = process_variance self.measurement_var = measurement_variance self.prediction_var = process_variance # 初始预测方差 def update(self, measurement): # 计算卡尔曼增益 kg = self.prediction_var / (self.prediction_var + self.measurement_var) # 修正状态 self.state = self.state + kg * (measurement - self.state) # 更新方差 self.prediction_var = (1 - kg) * self.prediction_var + self.process_var return self.state ``` --- #### 6. **应用场景** - 机器人定位(如扫地机导航) - 无人机姿态估计 - 股票价格预测(需调整模型) - 传感器数据去噪(如温度、距离测量)[^4] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值