Robotics: Estimation and Learning 2—卡尔曼滤波 (Kalman Filter)

本文介绍了卡尔曼滤波在机器人学中的应用,详细讲解了卡尔曼滤波的动机、模型、最大后验估计技术以及如何处理非线性变化。卡尔曼滤波是线性系统的最优跟踪算法,用于跟踪如自动驾驶汽车中的目标。文章通过实例解释了状态转移矩阵和观测矩阵在动力系统中的作用,并展示了如何通过贝叶斯滤波和最大后验估计技术优化状态估计。此外,还讨论了扩展卡尔曼滤波器在处理非线性动态系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

该笔记主要对Coursera上宾西法尼亚大学的Robotics: Estimation and Learning课程进行总结以及个人的一些理解,与Robotics: Estimation and Learning同系列的还有Robotics: Aerial RoboticsRobotics: MobilityRobotics: Computational Motion Planning

1.卡尔曼滤波的动机(Kalman Filter Motivation)

如何利用卡尔曼滤波来进行机器人学的贝叶斯估计?

卡尔曼滤波器是一种广泛使用的针对线性系统的最优跟踪算法,一些跟踪的例子包括自动驾驶汽车追踪行人和车辆,或者追踪装配线(assembly line)中在传送带(conveyor belt)上运动的部件。

我们将讨论卡尔曼滤波器(Kalman filter)的系统模型和测量模型,接着我们将讨论滤波器中的最大后验估计,最后,我们将把线性卡尔曼的思想扩展到非线性模型。

我们将学习时间序列建模,利用卡尔曼滤波器来估计世界的状态。在机器人统计学中的高斯分布 这篇文章中,我们的足球机器人已经学会了检测球的颜色,但是,在一场球赛中,球不会只停在一个地方,因此机器人需要跟踪球的轨迹,甚至预测球未来的运动,许多现实中的机器人都需要做相同的估计。在下图中,小球不断在地面上滚动,但是由于摩擦力的原因,小球越来越慢,除了预测小球的位置,机器人需要辨识出球在环境中的动力学特性。
这里写图片描述
另一个常见的影响现实世界物体的力——重力。在下图中,小球正在加速朝着地面下降,跟踪球的滤波器应该能建立模型描绘这种行为。
这里写图片描述

机器人应该对不确定性有些概念,如果机器人不确定球是怎么动的,它就不可能准确的做出相应的行为。当机器人被放到现实世界中的时候,它将从摄像头获得稳定的视频流,应用在机器人统计学中的高斯分布 的原理,机器人应该能够从传感器数据中确定球的位置,但是由于噪声的存在,这个位置可能并不十分准确,因此,机器人将有一堆带有噪声的数据。这些数据可以在任何时候近似地给出小球真实的状态,这一部分的内容重点就是计算这些状态。
这里写图片描述
我们应该分清测量结果的概念与真实状态的概念,真实世界有其投影,但是机器人只能观察到真实世界的一个投影。例如,球距离机器人的真实距离是11米,但是机器人认为距离是11.32567米。机器人通过摄像头观察到这个位置,而这个从摄像头获得的测量给出了对真实状态的带有噪声的估计。一个可能的噪声来源是代表小球的像素和代表周围区域被错误的识别了。机器人为了做出行动决策,关心的是隐藏状态的高层(high level)概念。

例如,足球机器人只关心球的位置、速度。对一些无人机,姿态就变成了一个特别重要的状态,它可以通过惯性测量单元或GPS进行测量。灭火机器人可能希望追踪火焰,这需要温度的信息来增加对颜色和大小的估计。每种任务都是不同的,所以搞清楚状态由什么构成非常重要。
这里写图片描述

在这部分我们只需要跟踪球的位置和速度,因此我们的状态由x、y、z坐标和dx、dy、dz组成,当我们测量状态时,我们并不总能获得与状态的形式相一致的信息,例如跟踪小球的时候,我们只对位置进行了观察,没有对速度的直接测量。这些测量与实际状态的差别使追踪变得困难。如下图所示,右图为机器人跟踪红色小球的位置曲线,可以发现数据包含了很多的噪声。
这里写图片描述

2.卡尔曼滤波模型(Kalman Filter Model)

动力系统和一般滤波器背后的测量模型。

2.1 线性模型(Linear Modeling)

动力系统的数学形式还有概率组成了模型的运动和噪声。为了启发大家,这里使用一个位置跟踪的例子,为了跟踪一个动目标,机器人必须建立其运动的动力系统的模型。动力系统描述了目标实时变化的状态以及机器人如何测量这些状态。

在这个简单的例子中,状态 x t x_{t} xt 表示 t t t 时刻的状态 x x x, 状态量包括以米为单位的位置 v v v 和 以米每秒为单位的速度 $dv/dt $。由于其动力学特点,状态随着每个时间点而改变。

从现在的时间点 t t t到下一点时间点 t + 1 t+1 t+1,这个变化由状态转移矩阵 A A A来表示,状态转移矩阵结合了状态信息,来描述下一个时间点的状态。这种转换简化了现在的状态,使其仅仅依赖之前的状态,这样使得数学问题更加简单

通过位置和速度的状态,我们知道位置必须基于速度才能实时变化,状态转移矩阵通过给定的公式表现这种关系。

机器人不是直接测量 x x x,而是通过它的传感器观测 x x x的部分,这个部分称为 z z z, 这里状态和测量之间的关系由混合矩阵 C C C来表示, 即 z t = C x t z_{t}=Cx_{t} zt=Cxt为了完整性, u u u也考虑在内, u u u 代表不依赖于状态 x x x的外部输入, 我们在这一模块中不考虑 u u u,所以将其设为0, 即 x t + 1 = A x t + B u t x_{t+1}=Ax_{t}+Bu_{t} xt+1=Axt+But

在这个模型中X和Z均包含了噪声,状态X是有噪声的,因为线性模型没有捕捉到所有的物理学的相互作用。观察量Z有噪声,因为传感器在 测量时会收到噪声干扰。

这里写图片描述

2.2 卡尔曼滤波:贝叶斯滤波(KF:Bayesian filtering)

基于动力学模型,我们可以建立一个信息表。在任意给定的时间,我们知道俩部分信息,前一个状态 t − 1 t-1 t1时刻的状态 x t − 1 x_{t-1} xt1和现状态的测量量 t t t时刻的观测量 z t z_{t} zt。有了这俩个信息后,我们想计算出现在 t t t 时刻的状态 x t x_{t} xt
这里写图片描述

**1).**值得注意的是,我们不相信测量结果中的任意单一的量。为了获得包含这种不确定的估计,我们将这个动力学模型转换成一系列概率表达。给定了系统动力学量,基于前一状态概率条件之上的现在状态的概率,即 p ( x t ∣ x t − 1 ) p(x_{t}|x_{t-1}) p(xtxt1),这意味这我们当前的状态不能离之前的状态太远。
还有一件值得注意的是,要把传感器得到的 Z Z Z 和真实状态 x x x 联系起来。我们的传感器仅仅给我们单一测量值,但是我们想要一个概率分布,为了完成这个任务,我们估计了基于t时刻状态条件下获得当前测量值的条件概率 p ( z t ∣ x t ) p(z_{t}|x_{t}) p(ztxt)。例如,我们正前方的一个球提供了一个方差很小的确切估计(certain estimation),然而,有一定距离的观察会有一个比较大的方差,因为我们不知道准确距离是多少。

我们将继续使用高斯分布作为数学模型,对于一般滤波器,这意味着选择一个猜测性的机制,建立含有均值和用n表示的方差这样状态的模型 p ( x t ) = N ( x t , P t ) p(x_{t})=N(x_{t}, P_{t}) p(xt)=N(xt,Pt)

==========================================================================
Prediction using state dynamic model
p ( x t ∣ x t − 1 ) p(x_{t}|x_{t-1}) p(xtxt1)

Inference from noisy measurements
p ( z t ∣ x t ) p(z_{t}|x_{t}) p(ztxt)

Model x t x_{t} xt with a Gaussian (mean and covariance)
p ( x t ) = N ( x t , P t ) p(x_{t})=N(x_{t},P_{t}) p(xt)=N(xt,Pt)

==========================================================================

2). 现在我们有俩个动力系统模型和概率模型,我们可以结合俩个想法。
首先,线性动力系统模型表示我们可以用状态转移矩阵 A A A来建立基于现在状态的下个状态的条件概率, 即 p ( x t ∣ x t − 1 ) = A p ( x t − 1 ) p(x_{t}|x_{t-1})=Ap(x_{t-1}) p(xtxt1)=Ap(xt1)。 此外,t时刻的测量值z的概率可以用动力系统模型的矩阵 C C C来建立关系,即 p ( z t ∣ x t ) = C p ( x t ) p(z_{t}|x_{t})=Cp(x_{t}) p(ztxt)=Cp(xt)

我们通过新的m和o将噪声添加到测量(measurements)和观测(observation)系统中。使用高斯概率分布模型,状态和噪声可以用均值和方差来表示,即 p ( x t ∣ x t − 1 ) = A N ( x t − 1 , P t − 1 ) + N ( 0 , Σ m ) p(x_{t}|x_{t-1})=AN(x_{t-1}, P_{t-1})+N(0,\Sigma_{m}) p(xtxt1)=AN(xt1,Pt1)+N(0,Σm), p ( z t ∣ x t ) = C N ( x t , P t ) + N ( 0 , Σ o ) p(z_{t}|x_{t})= CN(x_{t}, P_{t})+N(0,\Sigma_{o}) p(ztxt)=CN(xt,Pt)+N(0,Σo)

==========================================================================
Apply linear dynamics
p ( x t ∣ x t − 1 ) = A p ( x t − 1 ) p(x_{t}|x_{t-1})= Ap(x_{t-1}) p(xtxt1)=Ap(xt1)
p ( z t ∣ x t ) = C p ( x t ) p(z_{t}|x_{t})= Cp(x_{t}) p(ztxt)=Cp(xt)

Add noise for motion and observations
p ( x t ∣ x t − 1 ) = A p ( x t − 1 ) + v m p(x_{t}|x_{t-1})= Ap(x_{t-1})+v_{m} p(xtxt1)=Ap(xt1)+vm
p ( z t ∣ x t ) = C p ( x t ) + v o p(z_{t}|x_{t})= Cp(x_{t})+v_{o} p(ztxt)=Cp(xt)+vo

Introduce Guassian model of x_{t-1} and x_{t}
p ( x t ∣ x t − 1 ) = A N ( x t − 1 , P t − 1 ) + N ( 0 , Σ m ) p(x_{t}|x_{t-1})= AN(x_{t-1},P_{t-1})+N(0,\Sigma_{m}) p(xtxt1)=AN(xt1,Pt1)+

<think>好的,用户想学习卡尔曼滤波算法,需要入门教程、原理讲解和实例分析。首先,我需要整理卡尔曼滤波的基本概念,确保自己理解正确。卡尔曼滤波是一种用于估计动态系统状态的方法,尤其在有噪声的情况下效果显著。用户可能对它的应用场景和数学基础不太清楚,需要分步骤解释。 先回忆卡尔曼滤波的核心思想,比如预测和更新两个阶段。然后考虑如何将这些步骤用简单的中文表达出来,避免过于专业的术语。可能需要引用用户提供的参考资料中的例子,比如引用[4]中的温度估计问题,这样用户更容易理解。 接下来是数学公式部分。根据系统指令,行内公式用$...$,独立公式用$$...$$。需要检查每个公式的LaTeX语法是否正确,比如状态预测方程和协方差更新方程。同时要确保公式编号正确,并在引用时标注正确的引用标识,比如引用[3]提到的ESKF方法。 然后,用户可能需要实例分析。参考引用[2]中的多传感器融合示例,可以举一个简单的温度估计的例子,或者引用代码库中的Python示例。需要确认代码是否正确,是否符合用户提供的GitHub链接中的内容。这里可能需要简化代码,只展示关键部分,如预测和更新步骤,并添加注释帮助理解。 用户问题中还要求生成相关问题,需要根据内容提出相关问题,比如卡尔曼滤波的假设、与扩展卡尔曼滤波的区别、在机器人导航中的应用等。这些问题应该覆盖原理、应用和进阶内容,帮助用户进一步学习。 最后,检查所有引用是否正确,引用标识是否对应到正确的资料。比如引用[1]是基础卡尔曼滤波器的代码步骤,引用[2]涉及传感器融合,引用[3]关于ESKF,引用[4]是状态估计的例子。确保每个引用在适当的地方出现,比如在讲解预测步骤时引用[3],在实例分析时引用[2]和[4]。 可能还需要注意避免信息过载,保持解释的简洁性,同时覆盖关键点。例如,卡尔曼滤波的五个核心公式可能需要逐个解释,但用简短的说明,再结合实例。同时,提醒用户卡尔曼滤波的假设条件,如线性系统和高斯噪声,这样用户知道其局限性。 总结步骤:介绍卡尔曼滤波的基本概念,分步骤讲解预测和更新过程,给出数学公式,提供实例代码,最后列举应用场景和相关问题。过程中注意引用正确,格式符合要求,语言清晰易懂。</think>### 卡尔曼滤波算法详解 #### 1. 核心思想 卡尔曼滤波是一种**动态系统状态估计**算法,通过融合传感器测量值和系统模型预测值,在噪声环境中实现最优状态估计[^4]。其核心是“预测-更新”循环: - **预测阶段**:利用系统模型预测当前状态 - **更新阶段**:通过测量值修正预测结果 #### 2. 数学原理(五个核心公式) $$ \begin{aligned} &\text{预测方程} \\ &\hat{x}_k^- = F_k\hat{x}_{k-1} + B_ku_k \quad \text{(状态预测)}[^1] \\ &P_k^- = F_kP_{k-1}F_k^T + Q_k \quad \text{(协方差预测)}[^3] \\ &\text{更新方程} \\ &K_k = P_k^-H_k^T(H_kP_k^-H_k^T + R_k)^{-1} \quad \text{(卡尔曼增益)} \\ &\hat{x}_k = \hat{x}_k^- + K_k(z_k - H_k\hat{x}_k^-) \quad \text{(状态更新)}[^2] \\ &P_k = (I - K_kH_k)P_k^- \quad \text{(协方差更新)} \end{aligned} $$ 其中$F_k$为状态转移矩阵,$H_k$为观测矩阵,$Q_k$为过程噪声协方差,$R_k$为观测噪声协方差。 #### 3. Python实现示例(温度估计) ```python class KalmanFilter: def __init__(self, F, H, Q, R, P, x): self.F = F # 状态转移矩阵 self.H = H # 观测矩阵 self.Q = Q # 过程噪声协方差 self.R = R # 测量噪声协方差 self.P = P # 估计误差协方差 self.x = x # 状态向量 def predict(self): self.x = self.F @ self.x # 状态预测 self.P = self.F @ self.P @ self.F.T + self.Q def update(self, z): K = self.P @ self.H.T @ np.linalg.inv(self.H @ self.P @ self.H.T + self.R) # 卡尔曼增益计算 self.x = self.x + K @ (z - self.H @ self.x) # 状态更新[^4] self.P = (np.eye(len(self.x)) - K @ self.H) @ self.P ``` #### 4. 应用场景 | 领域 | 应用案例 | 特点 | |------------|-----------------------------------|--------------------------| | 自动驾驶 | 多传感器数据融合(激光雷达+毫米波雷达)[^2] | 提升障碍物跟踪精度 | | 航天控制 | 火箭发动机温度估计[^4] | 处理不可直接测量的状态量 | | 机器人导航 | IMU数据融合(ESKF算法)[^3] | 处理非线性系统 | #### 5. 学习资源推荐 1. **入门教程**:《概率机器人》第3章(状态估计基础) 2. **在线课程**:Coursera "Robotics: Estimation and Learning" 3. **代码实践**:GitHub ExtendedKalmanFilter项目 4. **进阶阅读**:论文《A New Approach to Linear Filtering and Prediction Problems》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值