本章介绍两个全局定位算法,与第七章介绍的高斯方法有所不同:
第一个算法叫栅格定位。它使用一个直方图滤波器来表示后验置信。缺点是,如果栅格划分很细,则计算量很大。如果划分粗糙,则离散化时信息丢失会影响滤波器表现。
第二个算法叫蒙特卡洛定位(MCL)算法,也是目前最流行的。它使用粒子滤波器来估计后验。
算法伪代码:
1····for all k k k do
2········ p ˉ k , t = Σ i p i , t − 1 m o t i o n _ m o d e l ( m e a n ( x k ) , u t , m e a n ( x i ) ) \bar{p}_{k,t}=\Sigma_i p_{i,t-1} \bm{motion\_model} (mean(\bm{x}_k),u_t, mean(\bm{x}_i)) pˉk,t=Σipi,t−1motion_model(mean(xk),ut,mean(xi))
3········ p k , t = η m e a s u r e m e n t _ m o d e l ( z t , m e a n ( x k ) , m ) p_{k,t}=\eta\ \bm{measurement\_model} (z_t, mean(\bm{x}_k),m) pk,t=η measurement_model(zt,mean(xk),m)
4····endfor
5····return { p k , t p_{k,t} pk,t}
以上是一个离散贝叶斯滤波器,其中后验概率为离散的概率值的集合,即 b e l ( x t ) = { p k , t } bel(x_t)=\{p_{k,t}\} bel(xt)={pk,t},而 p k , t p_{k,t} pk,t是定义在格子 x k \bm{x}_k xk上的。
在基础的栅格定位中,对空间的划分是均匀(通常15厘米、5度分辨率)且时不变的。
栅格定位的一个关键变量是分辨率。有两种极端选择,都挺好用:
使用粗糙分辨率时,应当在测量和运动模型中对分辨率的粗糙度进行补偿,不能只评估格子的重心。例如,如果运动模型每秒更新一次,机器人运动10厘米,而分辨率1米,则由格子重心向任何方向运动,都会回到这个格子,因此状态永远不转换。
一种普遍的做法是放大测量和运动模型中的噪声。例如,可以把测距模型的主高斯锥的方差增大半个分辨率。再例如,运动模型可以加入一个随机进入相邻格子的概率,此概率与步长成正比。
当使用分辨率高的网格时,计算可能无法实时:运动模型对3D栅格进行卷积,是一个6D运算。测量模型是一个3D运算,但是计算所有scan的可能性的运算量非常大。
减小计算复杂度的方法:
在算力足够的情况下,栅格越细越好。
略过…
基于粒子滤波器,可以应用于局部定位和全局定位。这个算法非常流行,容易实现。
算法MCL( χ t − 1 , u t , z t , m \chi_{t-1},u_t,z_t,m χt−1,ut,zt,m):
1···· χ ˉ t = χ t = ϕ \bar{\chi}_t=\chi_t=\phi χˉt=χt=ϕ
2····for m = 1 m=1 m=1 to M M M do
3········ x t [ m ] = s a m p l e _ m o t i o n _ m o d e l ( u t , x t − 1 [ m ] ) x_t^{[m]}=\bm{sample\_motion\_model}(u_t,x_{t-1}^{[m]}) xt[m]=sample_motion_model(ut,xt−1[m])
4········ w t [ m ] = m e a s u r e m e n t _ m o d e l ( z t , x t [ m ] , m ) w_t^{[m]}=\bm{measurement\_model}(z_t,x_t^{[m]},m) wt[m]=measurement_model(zt,xt[m],m)
5········ χ ˉ t = χ ˉ t + ⟨ x t [ m ] , w t [ t ] ⟩ \bar{\chi}_t=\bar{\chi}_t+\langle x_t^{[m]},w_t^{[t]}\rangle χˉt=χˉt+⟨xt[m],wt[t]⟩
6····endfor
7····for m = 1 m=1 m=1 to M M M do
8········draw i i i with probability ∝ w t [ i ] \propto w_t^{[i]} ∝wt[i]
9········add x t [ i ] x_t^{[i]} xt[i] to χ t \chi_t χt
10···endfor
11···return χ t \chi_t χt
基础MCL算法使用M个粒子来代表置信度 b e l ( x t ) bel(x_t) bel(xt)。粒子滤波器首先使用运动模型的概率分布来采样粒子,然后用测量模型判断这个粒子的权重(不改变粒子分布),最后根据权重重新采样(原来权重高的粒子周围产生更多新粒子,但新产生的粒子权重一样)。初始置信度是均匀分布粒子,权重为 M − 1 M^{-1} M−1。
MCL可以近似任何形式的分布,而不是仅限于参数化的分布(如EKF),而近似的精确度由粒子的个数决定。粒子个数的选择要权衡计算的精确度和复杂度。一种常用策略是不停地采样,直到下一组控制和测量到来。这种可以自适应计算资源的方法,难以用于栅格定位和高斯方法的定位。
MCL可以表示非常复杂的多模型概率分布,并且可以与窄高斯分布无缝混合。这让MCL可以进行全局定位,同时有高精度的位置追踪。
MCL不可以解决绑架问题,也不能处理全局定位失败。有时,粒子只存在于某一个位姿周围,如果这个位姿是错的,算法无法恢复。
这个问题非常重要。任何概率的方法都会有所有粒子都错误的可能性,如MCL的二次采样,当粒子少或者空间很大的时候尤为明显。
解决这个问题的思路非常简单:增加随机的粒子。即使没有绑架的情况,这种方法也可以增加鲁棒性。
增加粒子的数目:可以加固定数量,也可以根据定位精度 p ( z t ∣ z t − 1 , u t , m ) p(z_t|z_{t-1},u_t,m) p(zt∣zt−1,ut,m)。由于权重是精度的概率估计,也就是 p ( z t ∣ z t − 1 , u t , m ) ≈ 1 M Σ m = 1 M w t [ m ] p(z_t|z_{t-1},u_t,m)\approx \frac{1}{M}\Sigma_{m=1}^M w_t^{[m]} p(zt∣zt−1,ut,m)≈M1Σm=1Mwt[m]
可以在一个时间窗口内求平均,来平滑这个估计。
增加粒子的分布:可以是位姿空间上的均匀分布,然后使用当前的观测设定权重,也可以在某些方法中根据观测的可能性直接分配粒子。
算法 Augmented_MCL:
01····static w s l o w w_{slow} wslow, w f a s t w_{fast} wfast
02···· χ ˉ t = χ t = ϕ \bar{\chi}_t=\chi_t=\phi χˉt=χt=ϕ
03····for m = 1 m=1 m=1 to M M M do
04········ x t [ m ] = s a m p l e _ m o t i o n _ m o d e l ( u t , x t − 1 [ m ] ) x_t^{[m]}=\bm{sample\_motion\_model}(u_t,x_{t-1}^{[m]}) xt[m]=sample_motion_model(ut,xt−1[m])
05········ w t [ m ] = m e a s u r e m e n t _ m o d e l ( z t , x t [ m ] , m ) w_t^{[m]}=\bm{measurement\_model}(z_t,x_t^{[m]},m) wt[m]=measurement_model(zt,xt[m],m)
06········ χ ˉ t = χ ˉ t + ⟨ x t [ m ] , w t [ t ] ⟩ \bar{\chi}_t=\bar{\chi}_t+\langle x_t^{[m]},w_t^{[t]}\rangle χˉt=χˉt+⟨xt[m],wt[t]⟩
07········ w a v g = w a v g + 1 M w t [ m ] w_{avg}=w_{avg}+\frac{1}{M}w_t^{[m]} wavg=wavg+M1wt[m]
08····endfor
09···· w s l o w = w s l o w + α s l o w ( w a v g − w s l o w ) w_{slow}=w_{slow}+\alpha_{slow}(w_{avg}-w_{slow}) wslow=wslow+αslow(wavg−wslow)
10···· w f a s t = w f a s t + α f a s t ( w a v g − w f a s t ) w_{fast}=w_{fast}+\alpha_{fast}(w_{avg}-w_{fast}) wfast=wfast+αfast(wavg−wfast)
11····for m = 1 m=1 m=1 to M M M do
12········with probability m a x ( 0.0 , 1.0 − w f a s t / w s l o w ) max(0.0, 1.0-w_{fast}/w_{slow}) max(0.0,1.0−wfast/wslow) do
13············add random pose to χ t \chi_t χt
14········else
15············draw i ∈ { 1 , . . . , N } i\in\{1,...,N\} i∈{1,...,N} with probability ∝ w t [ i ] \propto w_t^{[i]} ∝wt[i]
16············add x t [ i ] x_t^{[i]} xt[i] to χ t \chi_t χt
17········endwith
18····endfor
19····return χ t \chi_t χt
第9行和第10行实在进行指数滤波,而系数 α s l o w , α f a s t \alpha_{slow}, \alpha_{fast} αslow,αfast是衰减速率, 0 ≤ α s l o w ≪ α f a s t 0\leq\alpha_{slow}\ll\alpha_{fast} 0≤αslow≪αfast。
MCL的一个限制是它的提议机制,即使用运动模型作为提议分布,但试图近似这个分布下的产物。提议分布和目标分布的区别越大,就需要更多样本。
这导致了MCL中的一种失败模式:如果传感器理想(无噪声),则会定位失败,即使这个传感器并不会产生足够的定位信息。问题在于,EKF是结合了测量数据来生成新的均值,而MCL只使用运动模型来生成。
解决方案有两种,一种是放大测量模型中的噪声;另一种更好的是对于一小部分粒子,反转测量模型和运动模型的角色:首先根据测量模型生成新粒子,即 x t [ m ] ∼ p ( z t ∣ x t ) x_t^{[m]}\sim p(z_t|x_t) xt[m]∼p(zt∣xt),然后根据运动模型计算权重,即 w t [ m ] = ∫ p ( x t [ m ] ∣ u t , x t − 1 ) b e l ( x t − 1 ) d x t − 1 ) w_t^{[m]}=\int p(x_t^{[m]}|u_t,x_{t-1})bel(x_{t-1})dx_{t-1}) wt[m]=∫p(xt[m]∣ut,xt−1)bel(xt−1)dxt−1)。这种方法称为MCL with mixture distribution,或mixture MCL。这种模型不可以单独使用,因为生成粒子的时候完全无视粒子之前的位置。通常用这种模型生成5%的新粒子。
这种方法的问题在于,两个步骤都有可能难以实现。只有当测量模型的逆有closed form解时,才容易从测量模型中采样,但通常并非如此。运动模型中的积分难算,因为 b e l ( x t − 1 ) bel(x_{t-1}) bel(xt−1)是用粒子表示的。
前文提到的定位算法都有一个关键限制:静态环境假设,或马尔科夫假设。概率机器人学可以把动态物体视作噪声,可有一定鲁棒性;但是假设不同时刻到来的噪声互相独立,而没有建模的动态障碍物通常都会有一定持续性。如果这种效应非常明显,基于静态假设的概率定位方法可能失败。
两种方法:一种将隐藏状态状态变量,由滤波器一同估计,数学上更泛化,但计算复杂度大,且变量的数量本身也是变量;另一种对传感器数据进行预处理,扔掉隐藏状态影响的测量数据,这种方法在特定受限的场景下工作良好。下面讨论第二种方法。
思路是探究传感器测量的生成,然后拒绝掉有可能是受动态物体影响的测量数据。在第六章中说,测量模型由四种模型组成,即 p h i t , p s h o r t , p m a x , p r a n d p_{hit},p_{short},p_{max},p_{rand} phit,pshort,pmax,prand,其中 p s h o r t p_{short} pshort是与意料之外的物体相关联的。定义变量 c ˉ t k \bar{c}_t^k cˉtk,可以分别取{hit,short,max,rand}四个值,那么根据贝叶斯定律,可以计算:
p ( c ˉ t k = s h o r t ∣ z t k , z 1 : t − 1 , u 1 : t , m ) = p ( z t k ∣ c ˉ t k = s h o r t , z 1 : t − 1 , u 1 : t , m ) p ( c ˉ t k = s h o r t ) ∑ c p ( z t k ∣ c ˉ t k = c , z 1 : t − 1 , u 1 : t , m ) p ( c ˉ t k = c ) p(\bar{c}_t^k=short|z_t^k,z_{1:t-1},u_{1:t},m)=\frac{p(z_t^k|\bar{c}_t^k=short,z_{1:t-1},u_{1:t},m)p(\bar{c}_t^k=short)}{\sum_cp(z_t^k|\bar{c}_t^k=c,z_{1:t-1},u_{1:t},m)p(\bar{c}_t^k=c)} p(cˉtk=short∣ztk,z1:t−1,u1:t,m)=∑cp(ztk∣cˉtk=c,z1:t−1,u1:t,m)p(cˉtk=c)p(ztk∣cˉtk=short,z1:t−1,u1:t,m)p(cˉtk=short)
上式中 p ( z t k ∣ c ˉ t k = c , z 1 : t − 1 , u 1 : t , m ) = ∫ p ( z t k ∣ x t , c ˉ t k = c , m ) b e l ˉ ( x t ) d x t p(z_t^k|\bar{c}_t^k=c,z_{1:t-1},u_{1:t},m)=\int p(z_t^k|x_t,\bar{c}_t^k=c,m)\bar{bel}(x_t)dx_t p(ztk∣cˉtk=c,z1:t−1,u1:t,m)=∫p(ztk∣xt,cˉtk=c,m)belˉ(xt)dxt。
由于 p ( z t k ∣ x t , c ˉ t k = c , m ) p(z_t^k|x_t,\bar{c}_t^k=c,m) p(ztk∣xt,cˉtk=c,m)可以简写为 p h i t , p s h o r t , p m a x , p r a n d p_{hit},p_{short},p_{max},p_{rand} phit,pshort,pmax,prand,所以可以得到想要的概率的表达式:
p ( c ˉ t k = s h o r t ∣ z t k , z 1 : t − 1 , u 1 : t , m ) = ∫ p s h o r t ( z t k ∣ x t , m ) z s h o r t b e l ˉ ( x t ) d x t ∫ Σ c p c ( z t k ∣ x t , m ) z c b e l ˉ ( x t ) d x t p(\bar{c}_t^k=short|z_t^k,z_{1:t-1},u_{1:t},m)=\frac{\int p_{short}(z_t^k|x_t,m)z_{short}\bar{bel}(x_t)dx_t}{\int\Sigma_cp_c(z_t^k|x_t,m)z_c\bar{bel}(x_t)dx_t} p(cˉtk=short∣ztk,z1:t−1,u1:t,m)=∫Σcpc(ztk∣xt,m)zcbelˉ(xt)dxt∫pshort(ztk∣xt,m)zshortbelˉ(xt)dxt
上面这些积分没有closed-form解,为了计算,需要用代表后验概率 b e l ˉ ( x t ) \bar{bel}(x_t) belˉ(xt)的样本来近似,这些样本可以是可能性栅格,也可以是MCL中的粒子。如果某个测量的上述概率超过一定阈值,那么这个测量会被认做是受到动态物体影响,进而舍弃。
下面给出一种结合了这种技巧的粒子滤波器:
算法 test_range_measurement( z t k , χ ˉ t , m z_t^k, \bar{\chi}_t, m ztk,χˉt,m):
01···· p = q = 0 p=q=0 p=q=0
02····for m = 1 m=1 m=1 to M M M do
03········ p = p + z h i t ⋅ p h i t ( z t k ∣ x t [ m ] , m ) p=p+z_{hit}\cdot p_{hit}(z_t^k|x_t^{[m]},m) p=p+zhit⋅phit(ztk∣xt[m],m)
04········ q = q + ∑ c z c ⋅ p c ( z t k ∣ x t [ m ] , m ) q=q+\sum_c z_c\cdot p_c(z_t^k|x_t^{[m]},m) q=q+∑czc⋅pc(ztk∣xt[m],m)
05····endfor
06····if p / q ≤ χ p/q \leq \chi p/q≤χ then
07········return accept
08····else
09········return reject
10····endif
使用以上算法的效果就是,意外地短的测量被筛除,而意外地长的测量被保留。这样一个不对称性可以扔掉被动态障碍物影响的测量,同时保持了定位失败恢复的能力。总的来讲,做测量的筛选总是个好主意。这样的不对称性可能并不适用于其他数据。
关于定位算法的选择,首先要考虑的是,是否应当从传感器测量数据中提取特征。
关于前两章五种定位算法的比较:
\ | EKF | MHT | 粗糙(拓扑)栅格 | 细致(均匀)栅格 | MCL |
---|---|---|---|---|---|
测量 | 地标 | 地标 | 地标 | 原始数据 | 原始数据 |
测量噪声 | 高斯 | 高斯 | any | any | any |
后验 | 高斯 | 混合高斯 | 直方图 | 直方图 | 粒子 |
内存效率 | ++ | ++ | + | - | + |
时间效率 | ++ | + | + | - | + |
易于实现 | + | - | + | - | ++ |
分辨率 | ++ | ++ | - | + | + |
鲁棒性 | - | + | + | ++ | ++ |
全局定位 | no | no | yes | yes | yes |
当实现一个定位算法时,应当调整参数。可以首先采集参考数据集,然后调参。这是因为无论模型多准确,永远会有没有建模的情况,并且系统误差也会影响结果。