占据栅格地图(occupancy grid maps) -- 二值贝叶斯滤波应用
其实,我想讲的关键点是二值状态的最优估计问题,而不仅仅是栅格地图。
Anyway,that is a good example.
机器人的地图表示方式有多种,如拓扑地图、特征地图、直接表征法、栅格地图等。其中,栅格地图应用广泛,方便用于机器人的导航规划中(我也比较喜欢)。以下地图就是栅格图表示(每一个像素可以认为是一个格子),图一是概率机器人书本中的例子,图二是国内某品牌扫地机的清扫记录(白色为清扫轨迹)。
图一
图二
接着,咱们来分析下栅格地图是如何构建的(以二维激光雷达为例)。
二维激光雷达传感器会扫描出空间中某一高度的平面,相当于给整个环境来一刀,得到一个切面(内侧)。栅格图中的线条对应环境中障碍物的内侧边界。
雷达扫描过程中,光线撞到(hit)的地方所处坐标位置就对应一种灰度值,没有撞到(miss)的地方所处坐标位置对应另外的灰度值。栅格图中,一个格子某一时刻只有两种状态,要么被光线撞到了要么没有;但是该格子可能多次被撞到或多次没被撞到。如果某个格子多次被撞到了,说明它很有可能是被占用了(有障碍物的意思)。因此,咱们可以用概率的方式来表示某个格子有多大的可能被占用了。
那么问题来了,一方面,格子的概率如何表示?另一方面,格子多次被撞这种事情的概率要怎么算?
第一个问题,咱们可以利用图像的灰度值来表达概率,只要有一张“灰度 -- 概率”对应表。如下图所示,纵坐标可以换算为八位的灰度值,横坐标为概率值。图中曲线为单调函数,这样就能从灰度图中直观的看出概率大小(颜色越深代表可能性越大/小)。一般情况下,纯黑色(灰度值为0)概率为0,代表占用;灰色(灰度值为127)概率为0.5,代表未知;纯白色(灰度值为255)概率为1,代表空闲。
图三
接着,咱们来讨论第二个问题,以及图三灰度 -- 概率”对应表的曲线由来。
在实际环境中,栅格只有两种状态,要么occupied,要么free。假设已知格子x被hit一次,格子occupied的概率是Po(x) = 0.9,free的概率是Pf(x)= 1 - Po(x) = 0.1;格子x被miss一次,格子occupied的概率是Po(x) = 0.2,free的概率是Pf(x)= 1 - Po(x) = 0.8。如果格子x被连续hit三次,miss一次,那么格子x的概率Po(x)该如何计算?
咱们对格子x的概率换一种表达方式,用概率对数的形式:
p(x) / p(¬x) =p(x)/(1 − p(x)) // 该事件发生的概率除以该事件不发生的概率。(1)
l(x) := log(p(x)/(1 − p(x))) //对上式取对数,以自然常数e为底数。(2)
换了这种表达方式后,格子x的置信度(对应原来的概率)取值范围变成(−∞, ∞),同时避免了概率接近0或者1引起的截断问题。
图三中的曲线就是(2)式的体现,横坐标表示概率值或置信度,纵坐标表示图像灰度值。
从(2)式中可得,p(x) = 1 - 1 / (1 + exp{l(x)}) (3)
回到原来的问题,如果格子x被连续hit三次,miss一次,置信度要如何计算?
首先给出结论,计算套路如下:
也就是说,原来求概率的乘法运算,现在变成了加法。
事实上,任何对测量做出反应的变量的递增和递减都可以解释为贝叶斯滤波的概率对数形式。
以下引用《Probabilistic Robotics》中对二值贝叶斯滤波的推导过程。(太懒了,就不自己写公式了)
根据(4.20)式子,结合栅格地图定义,可得:
从贝叶斯定理推导出来的结论(4.20)式子很巧妙,如果想要知道当前时刻格子x被occupied的置信度,只需要知道上一时刻的置信度值(可以认为是已知的,是迭代的过程量),当前时刻的观察信息(格子x被hit或miss),以及初值(一般是常数)即可,避免了求格子x在occupied的条件下,格子被hit的概率值(这种概率就不容易求解了)。
咱们来计算下格子x被hit三次,miss一次的occupied概率:
初值L0 = log(0.5 / (1-0.5)) = 0.
L1 = L0 + log(0.9 / (1-0.9)) - L0 = log9;
L2 = L1 + log(0.9 / (1-0.9)) - L0 = log9 + log9 ;
L3 = L2 + log(0.9 / (1-0.9)) - L0 = log9 + log9 + log9 ;
L4 = L3 + log(0.2 / (1-0.2)) - L0 = log9 + log9 + log9 - log4 ;
即L4 = log(9*9*9/4) ≈ 5.2。
由于式子(3): p(x) = 1 - 1 / (1 + exp{l(x)})
因此,此时格子x被occupied的概率P(x) ≈ 0.9945,其对应的灰度值就是L4*某系数。
从L4的计算过程可知,如果格子x被hit一次,加log9,被miss一次,减log4;看起来,求状态的概率的过程就是加加减减。
二值贝叶斯滤波方法除了能应用在占据栅格地图之外,还可以在其他二值状态估计中应用。比如,扫地机器人的跌落传感器检测。Drop sensor触发一次,机器人处于悬崖边缘的概率是0.9(为什么不是1?一方面sensor有噪声,另外一方面环境有干扰),drop sensor不触发一次,机器人不处于悬崖边缘的概率是0.8,那么drop sensor连续触发三次,第四次不触发,此时机器人处于悬崖边缘的概率是多少?这个问题跟格子x的问题是一样的,答案也是一样的。咱们可以规定,当机器人处于悬崖边缘的概率达到99.9%时,机器人会执行后退动作,保护自己。通过这种估计方法,机器人能很好的过滤噪声,估计出更加可信的状态,以便更合理的执行动作。
还有很多很多的例子能应用二值贝叶斯滤波方法,这里就不一一赘述了。