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(xk−1,uk)+wkzk=h(xk)+vkk=1,…,N
其中 f ( . ) f(.) f(.)为状态方程, h ( . ) h(.) h(.)为观测方程。 x k − 1 x_{k-1} xk−1是上一时刻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:k∣z1: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:k∣z1: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(xk∣z1: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(xk∣z1: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(Bi∣A)=∑j=1nP(A∣Bj)P(Bj)P(A∣Bi)P(Bi)∝P(A∣Bi)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(xk∣z1:k,x0)∝P(z1:k,x0∣xk)∗P(xk)
然后对于第一项 P ( z 1 : k , x 0 ∣ x k ) P\left(z_{1: k}, x_{0} \mid x_{k}\right) P(z1:k,x0∣xk),显然k时刻的先验并不能决定除了 z k z_{k} zk以外的在k时刻之前的数据,因此第一项就等于 P ( z k ∣ x k ) P\left(z_{k}\mid x_{k}\right) P(zk∣xk)。那第二项单独一个 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:k−1,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(zk∣xk)P(xk∣z1:k−1,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(xk∣z1:k,x0)∝P(zk∣xk)P(xk∣z1:k−1,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(xk∣z1:k−1,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(B∣Ai),B就是先验 x k x_{k} xk,把 x k − 1 x_{k-1} xk−1当成是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(xk∣z1:k−1,x0)=∫P(xk−1∣z1:k−1,x0)P(xk∣z1:k−1,x0,xk−1)dxk−1
然后可以把这个先验的展开式代回 后 验 = 似 然 ∗ 先 验 后验=似然*先验 后验=似然∗先验的公式中,就可以得到很多论文中出现的马尔科夫链:
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(Xk∣Zk)∝P(Zk∣Xk)∫P(Xk−1∣Zk−1)P(Xk∣Xk−1)dXk−1
这就说明, 后 验 = 似 然 ∗ 先 验 的 展 开 后验=似然*先验的展开 后验=似然∗先验的展开,似然意味着给定状态解释当前测量的概率,先验的展开意味着系统的动态变化。
总结一下,整体公式就是
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(xk∣z1:k,x0)=∑j=1nP(z1:k,x0∣xk)∗P(xk)P(z1:k,x0∣xk)∗P(xk)∝P(zk∣xk)P(xk∣z1:k−1,x0)=P(zk∣xk)∫P(xk−1∣z1:k−1,x0)P(xk∣z1:k−1,x0,xk−1)dxk−1
这里 P ( z k ∣ x k ) P(z_{k} \mid x_{k}) P(zk∣xk)表示观测模型, P ( x k − 1 ∣ z 1 : k − 1 , x 0 ) P(x_{k-1} \mid z_{1:k-1}, x_{0}) P(xk−1∣z1:k−1,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(xk∣z1:k−1,x0,xk−1)表示预测模型
到这里为止,如果认为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(xk∣z1:k−1,x0)=∫P(xk−1∣z1:k−1,x0)P(xk∣z1:k−1,x0,xk−1)dxk−1
- 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(xk∣z1:k−1,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(xk∣z1:k,x0)∝P(zk∣xk)P(xk∣z1:k−1,x0)
- P ( x k ∣ z 1 : k , x 0 ) P\left(x_{k} \mid z_{1: k}, x_{0}\right) P(xk∣z1:k,x0)表示后验概率
- P ( z k ∣ x k ) P\left(\boldsymbol{z}_{k} \mid \boldsymbol{x}_{k}\right) P(zk∣xk)表示观测值
- 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(xk∣z1:k−1,x0)表示预测值
- 最后是反复迭代求值
那贝叶斯滤波和卡尔曼滤波有什么关系?卡尔曼滤波是贝叶斯滤波的特例,当状态分布、预测模型和观测模型均服从高斯分布,那么这样的滤波称为卡尔曼滤波。卡尔曼滤波以后看懂了再写吧。