卡尔曼滤波(Kalman filtering)基础

  • 前言
  • 一、SLAM问题的数学表述
  • 系统模型
  • 二、离散时间线性高斯系统批量式状态估计
  • 1.最大后验估计(Maximum A Posteriori, MAP)
  • 2.贝叶斯推断(Bayesian Inference)
  • 三、离散时间线性高斯系统递归式平滑算法
  • 1.平滑算法的引出——Cholesky解法
  • 2.Rauch-Tung-Striebel平滑算法(RTS Smoother)
  • 四、离散时间线性高斯系统的滤波算法
  • 卡尔曼滤波(Kalman filtering)
  • 总结



前言

参考书籍:
《视觉SLAM十四讲》
《机器人学中的状态估计》
知乎:如何通俗并尽可能详细地解释卡尔曼滤波?云羽落的回答 还需要一些高数、线性代数和概率论的基础。

本文主要是一些学习笔记与个人的总结,主要引用自上述的参考书籍中。


一、SLAM问题的数学表述

早期的SLAM问题是一个状态估计问题,被人们称为“空间状态不确定性估计”,正是如今的后端优化问题。这也反映了SLAM问题的本质:对运动主体自身和周围空间不确定的估计。为了解决这个问题,需要用到 状态估计 理论。而状态估计理论的经典代表就是以卡尔曼滤波为核心的 卡尔曼系列滤波器

状态估计:通过初始状态、各时刻的观测数据、输入数据,估计系统的真实状态。

系统模型

运动主体携带各种传感器在未知环境中运动,主要由以下两个事情描述:
(假设为:考虑离散时间的线性时变系统)

  1. 运动方程python 卡尔曼滤波器 gprs_算法
  2. 观测方程python 卡尔曼滤波器 gprs_c++_02

除了python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_03以外,其他变量均为随机变量;各个时刻的噪声互不相关;python 卡尔曼滤波器 gprs_c++_04称为转移矩阵;python 卡尔曼滤波器 gprs_slam_05称为观测矩阵。

其中各个变量含义:

  • 系统状态python 卡尔曼滤波器 gprs_算法_06 ; 输入python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_07
  • 初始状态python 卡尔曼滤波器 gprs_slam_08
  • 过程噪声python 卡尔曼滤波器 gprs_算法_09
  • 测量python 卡尔曼滤波器 gprs_自动驾驶_10 ; 测量噪声python 卡尔曼滤波器 gprs_c++_11

除系统模型之外,我们还知道:
带下帽子的变量称为先验,上帽子的称为后验。

  1. 初始状态python 卡尔曼滤波器 gprs_slam_12,以及它的初始协方差矩阵python 卡尔曼滤波器 gprs_自动驾驶_13。有时候不知道初始信息,必须在没初始信息的情况下进行推导.
  2. 输入量python 卡尔曼滤波器 gprs_自动驾驶_14,通常来自控制器,是已知的;它的噪声协方差矩阵是python 卡尔曼滤波器 gprs_c++_15.
  3. 观测数据python 卡尔曼滤波器 gprs_c++_16是观测变量python 卡尔曼滤波器 gprs_自动驾驶_17的一次实现(realization),它的协方差矩阵是python 卡尔曼滤波器 gprs_slam_18.

二、离散时间线性高斯系统批量式状态估计

1.最大后验估计(Maximum A Posteriori, MAP)

MAP:已知输入和观测,求最大概率的状态
python 卡尔曼滤波器 gprs_算法_19
用贝叶斯公式重写目标函数:
python 卡尔曼滤波器 gprs_slam_20
在这里,需要把不带下标的变量定义为宏观变量:
python 卡尔曼滤波器 gprs_自动驾驶_21
由于各时刻观测、输入的噪声都是无关的,上面两个项可以因式分解:
python 卡尔曼滤波器 gprs_slam_22
同时,对目标函数两边取对数,对数是个单调映射,不影响最优解:
python 卡尔曼滤波器 gprs_c++_23
这时因子相乘变成了对数项相加。
高斯分布取对数之后有较好的形式:
python 卡尔曼滤波器 gprs_算法_24python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_25python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_26
舍掉那些与python 卡尔曼滤波器 gprs_c++_27无关的项,定义:
python 卡尔曼滤波器 gprs_slam_28python 卡尔曼滤波器 gprs_算法_29
于是目标函数变为求这个式的最小化:
python 卡尔曼滤波器 gprs_自动驾驶_30
这个问题就是常见的无约束最小二乘。

写成更紧凑的矩阵形式(提升形式):
python 卡尔曼滤波器 gprs_slam_31python 卡尔曼滤波器 gprs_自动驾驶_32把运动和观测写在一起:
python 卡尔曼滤波器 gprs_c++_33
提升形式的目标函数:python 卡尔曼滤波器 gprs_c++_34它是个二次的,求其最小值,只要令自变量导数为零:
python 卡尔曼滤波器 gprs_自动驾驶_35
于是就解析地得到了最优解

  • 这个解等价于经典的批量最小二乘法,也等价于固定区间平滑算法,或者也等价于伪逆
  • 由于python 卡尔曼滤波器 gprs_c++_36具有特殊的稀疏结构,这个问题也有特殊的解法,不需要暴力算矩阵求逆

2.贝叶斯推断(Bayesian Inference)

在线性高斯系统中,可以根据运动方程和观测方程显式写出状态变量分布的变化过程:
运动方程:

  • k时刻状态更新:python 卡尔曼滤波器 gprs_算法_37
  • 提升形式:python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_38
    其中python 卡尔曼滤波器 gprs_c++_39

在上式中,右侧只有python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_40,故容易求得均值和协方差(python 卡尔曼滤波器 gprs_slam_41为确定的输入量,python 卡尔曼滤波器 gprs_slam_42是高斯,所以此处也是高斯分布的线性变换):

  • 均值:python 卡尔曼滤波器 gprs_slam_43
  • 协方差:python 卡尔曼滤波器 gprs_算法_44

所以,先验部分写作:python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_45
此处先验的意思为:仅考虑运动方程时的条件概率分布

观测模型:

  • 单次观测:python 卡尔曼滤波器 gprs_自动驾驶_46
  • 提升形式:python 卡尔曼滤波器 gprs_c++_47
    其中python 卡尔曼滤波器 gprs_算法_48

联合分布:
(由于已知python 卡尔曼滤波器 gprs_slam_41时,python 卡尔曼滤波器 gprs_c++_27的先验分布已经确定,所以python 卡尔曼滤波器 gprs_c++_51的分布也可确定)
python 卡尔曼滤波器 gprs_c++_52

条件分布:
下面是已知联合分布,求条件分布。
联合=条件*边缘
python 卡尔曼滤波器 gprs_算法_53

由下列高斯推断:

  • 联合分布:python 卡尔曼滤波器 gprs_自动驾驶_54
  • 条件分布:python 卡尔曼滤波器 gprs_slam_55
  • 边缘分布:python 卡尔曼滤波器 gprs_slam_56

代入得:python 卡尔曼滤波器 gprs_c++_57

SMW式:

  • python 卡尔曼滤波器 gprs_算法_58
  • python 卡尔曼滤波器 gprs_自动驾驶_59

故化简可得:
python 卡尔曼滤波器 gprs_算法_60

  • python 卡尔曼滤波器 gprs_c++_61即均值python 卡尔曼滤波器 gprs_算法_62
  • python 卡尔曼滤波器 gprs_算法_63 即后验协方差 python 卡尔曼滤波器 gprs_slam_64.

进一步整理:
均值部分:python 卡尔曼滤波器 gprs_c++_65
代入python 卡尔曼滤波器 gprs_slam_66python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_67,
得:python 卡尔曼滤波器 gprs_c++_68

这里由于A为下三角矩阵,故A逆有特殊的形式:
python 卡尔曼滤波器 gprs_slam_69

得出一些结论:

  • 按均值式:python 卡尔曼滤波器 gprs_c++_70
  • 定义:python 卡尔曼滤波器 gprs_slam_71
  • 得到:python 卡尔曼滤波器 gprs_c++_72

与MAP结果一致。

线性高斯系统的最优估计显然有以下要求:

  • python 卡尔曼滤波器 gprs_slam_73
  • 即要求python 卡尔曼滤波器 gprs_python 卡尔曼滤波器 gprs_74可逆,python 卡尔曼滤波器 gprs_算法_75
  • 协方差矩阵的对称正定性要求:python 卡尔曼滤波器 gprs_c++_76

三、离散时间线性高斯系统递归式平滑算法

1.平滑算法的引出——Cholesky解法

2.Rauch-Tung-Striebel平滑算法(RTS Smoother)


四、离散时间线性高斯系统的滤波算法

卡尔曼滤波(Kalman filtering)


总结

  • 卡尔曼滤波器给出了线性高斯系统下最优线性无偏估计(Best Linear Unbiased Estimate, BLUE)
  • 卡尔曼滤波器依赖于初始状态
  • 卡尔曼滤波器即Rauch-Tung-Striebel平滑算法(RTS Smoother)的前向部分
  • 在线性高斯系统中,最大后验估计(Maximum A Posteriori, MAP)和贝叶斯推断(Bayesian Inference)的结果等价于卡尔曼滤波器,原因是高斯分布的均值和模在同一点上
  • 在非线性系统中,可以使用扩展卡尔曼滤波器(EKF),此时最大后验估计(Maximum A Posteriori, MAP)、贝叶斯推断(Bayesian Inference)、扩展卡尔曼滤波器(EKF)估计的结果均不一样

该处使用的url网络请求的数据。