当前位置: 首页 > backend >正文

扩展卡尔曼滤波(EKF)的一阶泰勒展开(雅可比矩阵)详解

1. 雅可比矩阵介绍

概念
雅可比矩阵(Jacobian Matrix)是向量值函数的一阶偏导数构成的矩阵。对于一个从 RnR^nRn 映射到 RmR^mRm 的向量函数 F(x) ,其雅可比矩阵定义为:
在这里插入图片描述
核心原理
雅可比矩阵的本质是提供多变量函数在某一点的最佳线性近似,对于函数 F(x) ,在点 a 附近的线性近似为:
F(x)≈F(a)+J(a)(x−a)

作用与效果
雅可比矩阵描述了输入空间的小变化如何映射到输出空间,表示了在局部区域内,函数如何"拉伸"、"旋转"和"扭曲"空间,雅可比行列式(矩阵的行列式)表示了局部体积的变化率和方向,即雅可比矩阵的每个元素∂Fi∂xj\frac {\partial F_i}{\partial x_j}xjFi 表示当第 j 个输入变量发生微小变化时,第 i 个输出变量的变化率,在以下场景中至关重要:

  • 评估系统对参数变化的敏感度
  • 分析系统的稳定性
  • 优化问题中确定搜索方向

2. EKF-SLAM回顾

在EKF-SLAM中,需要对非线性的运动模型和观测模型进行一阶泰勒展开,以实现线性化处理。泰勒展开的核心是计算雅可比矩阵,它提供了函数在某一点的局部线性近似。

状态向量

x=[sTm1Tm2T⋯mnT]Tx = \begin{bmatrix} s^T & m_1^T & m_2^T & \cdots & m_n^T \end{bmatrix}^Tx=[sTm1Tm2TmnT]T

其中:

  • s=[x,y,θ]Ts=[x,y,θ] ^Ts=[x,y,θ]T 是机器人位姿(2D平面)
  • miT=[mx,i,my,i]Tm_i^T=[m_{x,i}, m_{y,i}]^TmiT=[mx,i,my,i]T 是第 i 个路标的坐标
  • n 是路标总数

算法流程

  1. 预测步骤:
    • 预测状态
    • 计算雅可比矩阵 FtF_tFt(对 xt−1x_{t−1}xt1 求导)
    • 预测协方差
  2. 更新步骤(对于每个观测到的路标 i ):
    • 计算观测预测
    • 计算雅可比矩阵 HtH_tHt (对 xtx_txt 求导)
    • 计算卡尔曼增益
    • 更新状态
    • 更新协方差

3.运动模型及其雅可比矩阵

3.1 运动模型

运动模型描述了机器人如何根据控制输入 utu_tut,从 xt−1x_{t−1}xt1 移动到 xtx_txt
xt=f(xt−1,ut)+wt\mathbf{x}_t = f(\mathbf{x}_{t-1}, \mathbf{u}_t) + \mathbf{w}_txt=f(xt1,ut)+wt
​其中 wtw_twt 是过程噪声,假设使用简单的速度运动模型,模型如下:

fx(xt−1,ut)=[xt−1+vtΔtcos⁡(θt−1+ωtΔt/2)yt−1+vtΔtsin⁡(θt−1+ωtΔt/2)θt−1+ωtΔt]f_x(x_{t-1}, u_t) = \begin{bmatrix} x_{t-1} + v_t\Delta t \cos(\theta_{t-1} + \omega_t\Delta t/2) \\ y_{t-1} + v_t\Delta t \sin(\theta_{t-1} + \omega_t\Delta t/2) \\ \theta_{t-1} + \omega_t\Delta t \end{bmatrix}fx(xt1,ut)=xt1+vtΔtcos(θt1+ωtΔt/2)yt1+vtΔtsin(θt1+ωtΔt/2)θt1+ωtΔt

其中 ut=[vt,ωt]Tu_t =[v_t ,ω_t ]^Tut=[vt,ωt]T 是线速度和角速度。

3.2 雅可比矩阵
运动模型的雅可比矩阵 FtF_tFt 是对前一时刻的状态 xt−1x_{t−1}xt1 求偏导,在估计值 x^t−1∣t−1\hat{x}_{t-1|t-1}x^t1∣t1 处计算:

Ft=∂f(xt−1,ut)∂xt−1∣x^t−1∣t−1\mathbf{F}_t = \left. \frac{\partial f(\mathbf{x}_{t-1}, \mathbf{u}_t)}{\partial \mathbf{x}_{t-1}} \right|_{\hat{\mathbf{x}}_{t-1|t-1}}Ft=xt1f(xt1,ut)x^t1∣t1

由于运动只影响机器人位姿,不影响地图特征,雅可比矩阵为分块结构:

Ft=[∂fs∂x03×203×2⋯03×202×3I202×2⋯02×202×302×2I2⋯02×2⋮⋮⋮⋱⋮02×302×202×2⋯I2]\mathbf{F}_t = \begin{bmatrix} \frac{\partial f_s}{\partial x} & \mathbf{0}_{3\times 2} & \mathbf{0}_{3\times 2} & \cdots & \mathbf{0}_{3\times 2} \\ \mathbf{0}_{2\times 3} & \mathbf{I}_2 & \mathbf{0}_{2\times 2} & \cdots & \mathbf{0}_{2\times 2} \\ \mathbf{0}_{2\times 3} & \mathbf{0}_{2\times 2} & \mathbf{I}_2 & \cdots & \mathbf{0}_{2\times 2} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ \mathbf{0}_{2\times 3} & \mathbf{0}_{2\times 2} & \mathbf{0}_{2\times 2} & \cdots & \mathbf{I}_2 \end{bmatrix}Ft=xfs02×302×302×303×2I202×202×203×202×2I202×203×202×202×2I2

其中,机器人位姿部分的雅可比子矩阵为:

∂ft∂x=[10−vtΔtsin⁡(θt−1+ωtΔt/2)01vtΔtcos⁡(θt−1+ωtΔt/2)001]\frac{\partial f_t}{\partial \mathbf{x}} = \begin{bmatrix} 1 & 0 & -v_t\Delta t \sin(\theta_{t-1} + \omega_t\Delta t/2) \\ 0 & 1 & v_t\Delta t \cos(\theta_{t-1} + \omega_t\Delta t/2) \\ 0 & 0 & 1 \end{bmatrix}xft=100010vtΔtsin(θt1+ωtΔt/2)vtΔtcos(θt1+ωtΔt/2)1

3.3 说明
运动模型雅可比矩阵的特点:

  • 只有机器人位姿部分有非零元素
  • 地图特征部分为单位矩阵,表示运动不影响地图特征

在预测步骤中,需要计算状态预测的协方差:
Pt∣t−1=FtPt−1∣t−1FtT​+QtP_{t∣t−1} =F_t P _{t−1∣t−1} F_t^ T ​+Q tPtt1=FtPt1t1FtT+Qt

这里 FtF_tFt 表示前一时刻状态的微小变化如何影响当前时刻的状态预测,因此需要对 xt−1x_{t−1}xt1 求导,用于状态预测和协方差预测。

4. 观测模型及其雅可比矩阵

4.1 观测模型
观测模型描述了机器人如何观测环境中的路标:

zt=h(xt)+vt\mathbf{z}_t = h(\mathbf{x}_t) + \mathbf{v}_tzt=h(xt)+vt

其中 vtv_tvt 是观测噪声,假设观测到路标 i ,观测模型的极坐标形式为:

h(xt)=[(mx,i−xt)2+(my,i−yt)2tan⁡−1(my,i−ytmx,i−xt)−θt]=[rϕ]h(\mathbf{x}_t) = \begin{bmatrix} \sqrt{(m_{x,i} - x_t)^2 + (m_{y,i} - y_t)^2} \\ \tan^{-1}\left(\frac{m_{y,i} - y_t}{m_{x,i} - x_t}\right) - \theta_t \end{bmatrix} = \begin{bmatrix} r \\ \phi \end{bmatrix}h(xt)=[(mx,ixt)2+(my,iyt)2tan1(mx,ixtmy,iyt)θt]=[rϕ]

其中 r 是距离,ϕ 是角度。

4.2 雅可比矩阵
观测模型的雅可比矩阵 HtH_tHt 是对当前时刻的状态 xtx_txt求偏导,在预测值 x^t∣t−1\hat x_{t∣t−1}x^tt1处计算:

Ht=∂h(xt)∂xt∣x^t∣t−1\mathbf{H}_t = \left. \frac{\partial h(\mathbf{x}_t)}{\partial \mathbf{x}_t} \right|_{\hat{\mathbf{x}}_{t|t-1}}Ht=xth(xt)x^tt1

雅可比矩阵也是分块结构,只对机器人位姿和被观测路标位置有非零元素:

Ht=[∂h∂s0⋯∂h∂mi⋯0]\mathbf{H}_t = \begin{bmatrix} \frac{\partial h}{\partial \mathbf{s}} & \mathbf{0} & \cdots & \frac{\partial h}{\partial \mathbf{m}_i} & \cdots & \mathbf{0} \end{bmatrix}Ht=[sh0mih0]

其中:∂h∂s\frac{\partial h}{\partial \mathbf{s}}sh 是观测模型对机器人位姿的雅可比子矩阵
∂h∂mi\frac{\partial h}{\partial \mathbf{m}_i}mih是观测模型对路标 i 位置的雅可比子矩阵
具体计算:
d=(mx,i−xt)2+(my,i−yt)2d=\sqrt{(m_{x,i} - x_t)^2 + (m_{y,i} - y_t)^2}d=(mx,ixt)2+(my,iyt)2

表示机器人到路标的距离,则:

∂h∂s=[−mx,i−xtd−my,i−ytd−1my,i−ytd2−mx,i−xtd20]\frac{\partial h}{\partial \mathbf{s}} = \begin{bmatrix} -\frac{m_{x,i} - x_t}{d} & -\frac{m_{y,i} - y_t}{d} & -1 \\ \frac{m_{y,i} - y_t}{d^2} & -\frac{m_{x,i} - x_t}{d^2} & 0 \end{bmatrix}sh=[dmx,ixtd2my,iytdmy,iytd2mx,ixt10]

∂h∂mi=[mx,i−xtdmy,i−ytd−my,i−ytd2mx,i−xtd2]\frac{\partial h}{\partial \mathbf{m}_i} = \begin{bmatrix} \frac{m_{x,i} - x_t}{d} & \frac{m_{y,i} - y_t}{d} \\ -\frac{m_{y,i} - y_t}{d^2} & \frac{m_{x,i} - x_t}{d^2} \end{bmatrix}mih=[dmx,ixtd2my,iytdmy,iytd2mx,ixt]

4.2 解释说明

观测模型雅可比矩阵的特点:

  • 只对机器人位姿和被观测路标有非零导数
  • 对其他路标的导数为零(条件独立性)
  • 这体现了SLAM问题中的稀疏结构
  • 当观测到新路标时,需要扩展状态向量并初始化新路标

在更新步骤中,需要计算卡尔曼增益:
Kt​=Pt∣t−1HtT​(Ht​Pt∣t−1​HtT​+Rt​)−1K_t ​=P_{t∣t−1 }H _t ^T ​(H _t ​P _{t∣t−1} ​H _t ^T ​+R _t ​) ^{−1}Kt=Ptt1HtT(HtPtt1HtT+Rt)1

这里 HtH_tHt 表示当前状态的微小变化如何影响观测预测,因此需要对 xtx_ txt 求导,用于计算卡尔曼增益和状态更新。

http://www.xdnf.cn/news/18242.html

相关文章:

  • 8 月中 汇报下近半个月都在做些什么
  • E10自定义统一认证+人员同步
  • C++高频知识点(三十)
  • IPSec安全概述
  • 【运维进阶】Linux 正则表达式
  • CANoe使用介绍
  • 副文本编辑器
  • 23种设计模式——构建器模式(Builder Pattern)详解
  • PDF如何在Adobe Acrobat 中用OCR光学识别文档并保存可编辑文档
  • week3-[分支嵌套]方阵
  • 【39页PPT】大模型DeepSeek在运维场景中的应用(附下载方式)
  • SpringBoot集成WebService
  • PostgreSQL 中的金钱计算处理
  • SpringBoot 整合 Langchain4j RAG 技术深度使用解析
  • [论文阅读] 人工智能 + 软件工程 | 从用户需求到产品迭代:特征请求研究的全景解析
  • 微美全息(NASDAQ:WIMI):以区块链+云计算混合架构,引领数据交易营销科技新潮流
  • STM32学习笔记16-SPI硬件控制
  • 力扣48:旋转矩阵
  • RAG拓展、变体、增强版(二)
  • redis执行lua脚本的原子性和数据库原子性的区别
  • C++STL-list 底层实现
  • GSPO:Towards scalable reinforcement learning for language models
  • Web 安全之延迟攻击(Delay Attack)详解
  • 从基础到本质:文件 IO 操作全解析
  • 【Linux仓库】进程等待【进程·捌】
  • vc++调试总结
  • E10 通过RPC实现账号批量锁定与解锁
  • 管理项目服务器连接数据库
  • 【语法】markdown非常用场景
  • 交叉编译.so到鸿蒙使用