slam小白版(2)-- 贝叶斯滤波

6 篇文章 0 订阅
2 篇文章 1 订阅
1、原理

在SLAM问题上,可以用贝叶斯框架来进行描述。简单来说,SLAM是一个状态估计问题,就是要估计状态量(姿态、位置速度和三维点坐标) x 1 : k = { x 1 , … , x k } x_{1:k}=\left\{x_{1}, \ldots, x_{k}\right\} x1:k={x1,,xk}

给定一组传感器观测量(即在当前状态下所看到的特征点的像素坐标) z 1 : k = { z 1 , … , z k } {z_{1:k}}=\left\{z_{1}, \ldots, z_{k}\right\} z1:k={z1,,zk},有以下关系为

{ x k = f ( x k − 1 , u k ) + w k z k = h ( x k ) + v k k = 1 , … , N \left\{\begin{array}{l}\boldsymbol{x}_{k}=f\left(\boldsymbol{x}_{k-1}, \boldsymbol{u}_{k}\right)+\boldsymbol{w}_{k} \\ \boldsymbol{z}_{k}=h\left(\boldsymbol{x}_{k}\right)+\boldsymbol{v}_{k}\end{array} \quad k=1, \ldots, N\right. {xk=f(xk1,uk)+wkzk=h(xk)+vkk=1,,N

其中 f ( . ) f(.) f(.)为状态方程, h ( . ) h(.) h(.)为观测方程。 x k − 1 x_{k-1} xk1是上一时刻k-1的状态, u k u_{k} uk是传感器的读数, w k w_{k} wk是随机测量噪声, v k v_{k} vk是像素误差。

这里要先明白两个概念,

  • 先验:根据0 ~ k-1时刻的各种数据来推测 k k k时刻的状态
  • 后验:结合了k时刻观测数据的k时刻状态

那我们希望的目的,就是根据0 ~ k时刻所有的数据,来观测当前的状态

既然是状态估计问题,我们就可以将SLAM问题转化为求解后验概率的问题: P ( x 1 : k ∣ z 1 : k , x 0 ) P\left(x_{1: k} \mid z_{1: k}, x_{0}\right) P(x1:kz1:k,x0)

直接求后验概率比较困难,但是求一个状态最优估计,使得在该状态下,后验概率最大化(Maximize A Posterior,MAP)是可行的:

x M A P ∗ = argmax ⁡ P ( x 1 : k ∣ z 1 : k , x 0 ) x_{M A P}^{*}=\operatorname{argmax} P\left(x_{1:k} \mid z_{1: k}, x_{0}\right) xMAP=argmaxP(x1:kz1:k,x0)

换句话说,就是求最可能的状态是什么

那么我们一般只关心当前时刻的状态,最大后验概率问题就变成了

x M A P ∗ = argmax ⁡ P ( x k ∣ z 1 : k , x 0 ) x_{M A P}^{*}=\operatorname{argmax} P\left(x_{k} \mid z_{1: k}, x_{0}\right) xMAP=argmaxP(xkz1:k,x0)

概括一下,

  • SLAM问题是状态的估计问题,就是说我们要估计相机或空间点的状态。
  • 理论上要求的:在这个观测值的前提下,相机的状态最有可能是怎样的?
  • 实际上求的:在这个相机状态下,最可能观测到什么。

目前SLAM方法大致可分为两类:

  • 基于概率模型的方法:基于卡尔曼滤波的完全SLAM、压缩滤波、FastSLAM等。
  • 非概率模型方法:SM-SLAM、扫描匹配、数据融合(dataassociation)、基于模糊逻辑等。
2、贝叶斯滤波

按照上面说的, P ( x k ∣ z 1 : k , x 0 ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) P(xkz1:k,x0)就是我们要求的,我们可以在马尔科夫假设下,用迭代贝叶斯滤波去求解

先回顾下贝叶斯法则:

P ( B i ∣ A ) = P ( A ∣ B i ) P ( B i ) ∑ j = 1 n P ( A ∣ B j ) P ( B j ) ∝ P ( A ∣ B i ) P ( B i ) P\left(B_{i} \mid A\right)=\frac{P\left(A \mid B_{i}\right) P\left(B_{i}\right)}{\sum_{j=1}^{n} P\left(A \mid B_{j}\right) P\left(B_{j}\right)} \propto P\left(A \mid B_{i}\right) P\left(B_{i}\right) P(BiA)=j=1nP(ABj)P(Bj)P(ABi)P(Bi)P(ABi)P(Bi)

贝叶斯等式左边的正比于贝叶斯等式右边的分子,因为分母是在求和,不会有选择和改变的余地。

因此,式子写成:

P ( x k ∣ z 1 : k , x 0 ) ∝ P ( z 1 : k , x 0 ∣ x k ) ∗ P ( x k ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) \propto P\left(z_{1: k}, x_{0} \mid x_{k}\right)*P(x_{k}) P(xkz1:k,x0)P(z1:k,x0xk)P(xk)

然后对于第一项 P ( z 1 : k , x 0 ∣ x k ) P\left(z_{1: k}, x_{0} \mid x_{k}\right) P(z1:k,x0xk),显然k时刻的先验并不能决定除了 z k z_{k} zk以外的在k时刻之前的数据,因此第一项就等于 P ( z k ∣ x k ) P\left(z_{k}\mid x_{k}\right) P(zkxk)。那第二项单独一个 P ( x k ) P(x_{k}) P(xk)是做什么呢?是没有 z k z_{k} zk情况下的k时刻状态,它也就等于在前面的记录的 ( z 1 : k − 1 , x 0 ) (z_{1: k-1}, x_{0}) (z1:k1,x0)发生情况下产生的数据,即 P ( z k ∣ x k ) P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(zkxk)P(xkz1:k1,x0)

因此,式子又可以写为 P ( x k ∣ z 1 : k , x 0 ) ∝ P ( z k ∣ x k ) P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) \propto P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(xkz1:k,x0)P(zkxk)P(xkz1:k1,x0)

来看下每部分含义

  • 等式左边是我们想要知道的,根据0~k时刻所有的数据,来得到当前的状态,即后验概率

  • 等式右边第一项,是给定了一个先验 x k x_{k} xk的情况下,什么观测数据 z k z_{k} zk最能符合这个先验的概率,即似然概率

  • 等式右边第二项,是根据0 ~ k-1时刻的观测数据,推测得知k时刻的先验状态,即先验概率

  • 把整个式子联合起来看,”根据0 ~ k时刻所有的数据得到的k时刻的状态”所服从的概率分布,是正比于”根据0 ~ k-1的观测数据,推测得知k时刻的先验状态”的概率分布与 “由k时刻产生的先验状态的基础上最符合的观测数据 z k z_{k} zk”的概率分布的乘积! 即: 后 验 = 似 然 ∗ 先 验 后验=似然*先验 =

再来看下这个先验概率公式 P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(xkz1:k1,x0)

根据全概率公式 P ( B ) = ∑ i = 1 n P ( A i ) P ( B ∣ A i ) P(B)=\sum_{i=1}^{n} P\left(A_{i}\right) P\left(B \mid A_{i}\right) P(B)=i=1nP(Ai)P(BAi),B就是先验 x k x_{k} xk,把 x k − 1 x_{k-1} xk1当成是A。另外对离散的A求和,和对连续的状态求积分是一样的,所以先验概率公式有以下等式

P ( x k ∣ z 1 : k − 1 , x 0 ) = ∫ P ( x k − 1 ∣ z 1 : k − 1 , x 0 ) P ( x k ∣ z 1 : k − 1 , x 0 , x k − 1 ) d x k − 1 P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) = \int P\left(\boldsymbol{x}_{k-1} \mid \boldsymbol{z}_{1: k-1} ,\boldsymbol{x}_{0}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}, \boldsymbol{x}_{k-1}\right) \mathrm{d} \boldsymbol{x}_{k-1} P(xkz1:k1,x0)=P(xk1z1:k1,x0)P(xkz1:k1,x0,xk1)dxk1

然后可以把这个先验的展开式代回 后 验 = 似 然 ∗ 先 验 后验=似然*先验 =的公式中,就可以得到很多论文中出现的马尔科夫链:

P ( X k ∣ Z k ) ∝ P ( Z k ∣ X k ) ∫ P ( X k − 1 ∣ Z k − 1 ) P ( X k ∣ X k − 1 ) d X k − 1 P\left(X_{k} \mid Z_{k}\right) \propto P\left(Z_{k} \mid X_{k}\right) \int P\left(X_{k-1} \mid Z_{k-1}\right) P\left(X_{k} \mid X_{k-1}\right) d X_{k-1} P(XkZk)P(ZkXk)P(Xk1Zk1)P(XkXk1)dXk1

这就说明, 后 验 = 似 然 ∗ 先 验 的 展 开 后验=似然*先验的展开 =,似然意味着给定状态解释当前测量的概率,先验的展开意味着系统的动态变化。

总结一下,整体公式就是

P ( x k ∣ z 1 : k , x 0 ) = P ( z 1 : k , x 0 ∣ x k ) ∗ P ( x k ) ∑ j = 1 n P ( z 1 : k , x 0 ∣ x k ) ∗ P ( x k ) ∝ P ( z k ∣ x k ) P ( x k ∣ z 1 : k − 1 , x 0 ) = P ( z k ∣ x k ) ∫ P ( x k − 1 ∣ z 1 : k − 1 , x 0 ) P ( x k ∣ z 1 : k − 1 , x 0 , x k − 1 ) d x k − 1 P\left(x_{k} \mid z_{1: k}, x_{0}\right) = \frac{P\left(z_{1: k}, x_{0} \mid x_{k}\right)*P(x_{k})}{\sum_{j=1}^{n} P\left(z_{1: k}, x_{0} \mid x_{k}\right)*P(x_{k})} \propto P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) = P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) \int P\left(\boldsymbol{x}_{k-1} \mid \boldsymbol{z}_{1: k-1} ,\boldsymbol{x}_{0}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}, \boldsymbol{x}_{k-1}\right) \mathrm{d} \boldsymbol{x}_{k-1} P(xkz1:k,x0)=j=1nP(z1:k,x0xk)P(xk)P(z1:k,x0xk)P(xk)P(zkxk)P(xkz1:k1,x0)=P(zkxk)P(xk1z1:k1,x0)P(xkz1:k1,x0,xk1)dxk1

这里 P ( z k ∣ x k ) P(z_{k} \mid x_{k}) P(zkxk)表示观测模型, P ( x k − 1 ∣ z 1 : k − 1 , x 0 ) P(x_{k-1} \mid z_{1:k-1}, x_{0}) P(xk1z1:k1,x0)表示上一时刻的状态分布, P ( x k ∣ z 1 : k − 1 , x 0 , x k − 1 ) P(x_{k} \mid z_{1:k-1}, x_{0}, x_{k-1}) P(xkz1:k1,x0,xk1)表示预测模型

到这里为止,如果认为k时刻的状态只与k-1时刻有关,那就是用扩展卡尔曼滤波器(EKF)来做。如果觉得和所有状态都有关,那就是用非线性优化来做。目前主流是非线性优化。

最后总结下贝叶斯滤波步骤:

  • 预测:从上一时刻状态分布预测当前时刻状态分布
    • P ( x k ∣ z 1 : k − 1 , x 0 ) = ∫ P ( x k − 1 ∣ z 1 : k − 1 , x 0 ) P ( x k ∣ z 1 : k − 1 , x 0 , x k − 1 ) d x k − 1 P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) = \int P\left(\boldsymbol{x}_{k-1} \mid \boldsymbol{z}_{1: k-1} ,\boldsymbol{x}_{0}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}, \boldsymbol{x}_{k-1}\right) \mathrm{d} \boldsymbol{x}_{k-1} P(xkz1:k1,x0)=P(xk1z1:k1,x0)P(xkz1:k1,x0,xk1)dxk1
    • P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(xkz1:k1,x0)表示预测值
  • 更新:使用当前时刻观测量更新后验概率
    • P ( x k ∣ z 1 : k , x 0 ) ∝ P ( z k ∣ x k ) P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) \propto P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(xkz1:k,x0)P(zkxk)P(xkz1:k1,x0)
    • P ( x k ∣ z 1 : k , x 0 ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) P(xkz1:k,x0)表示后验概率
    • P ( z k ∣ x k ) P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P(zkxk)表示观测值
    • P ( x k ∣ z 1 : k − 1 , x 0 ) P\left(\boldsymbol{x}_{k} \mid \boldsymbol{z}_{1: k-1}, \boldsymbol{x}_{0}\right) P(xkz1:k1,x0)表示预测值
  • 最后是反复迭代求值

那贝叶斯滤波和卡尔曼滤波有什么关系?卡尔曼滤波是贝叶斯滤波的特例,当状态分布、预测模型和观测模型均服从高斯分布,那么这样的滤波称为卡尔曼滤波。卡尔曼滤波以后看懂了再写吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值