最简单的直方图滤波示例(naive demo for Histogram Filter)
我们先抛开历史简介,抛开数学推导,先来看看最简单的Histogram Filter的示例(如下图所示):
直方图滤波简介(intro to Histogram Filter)
现在用大白话来翻译一下Histogram filter(直方图滤波)的示例:
- 蓝色:机器人真正的”位置”
- 绿色:机器人,待估计的状态仅包含“位置”(即在x轴上的坐标)和”处于不同直方图网格的位置的概率”(注意:位置的概率不一定符合高斯分布,可以是任意多峰分布)
- 黑色:门,作为地图,这里是已知信息,门的不确定度事实上是机器人的测量误差,这里为了方便,假设测量误差符合高斯分布
- 灰色:机器人位置的概率分布的熵(熵代表混乱程度,越小越好,越大越混乱/不可信)
- 额外说明:这里的“位置”和其“误差”(不确定度)用直方图分布表示,“位置”即“直方图各个位置的加权平均”,因为直方图分布可以是任意概率分布的近似,所以这里的“误差”可以用“熵”来描述、理解
- 示例代码
一开始,我们通过其他的传感器(如廉价的GPS)知道机器人在坐标轴的[0.0, 9.5]的区间里,但是具体在哪不知道,也没有该区间的置信度信息,所以我们就在[0.0, 9.5]的区间里,以0.5m的分辨率(每个网格我们称之为bin)建立直方图,概率均匀地赋给每个bin。
假设我们对机器人设定好了程序,让它以0.5m/s的速度,向x正轴前行,因为我们用的传感器比较差,虽然程序告诉它了速度,但传达到轮子最终执行的时候,总会有那么点误差(不确定度),这里假设误差为0.5(m/s)^2,噪声符合高斯分布;
额外说明:
- 噪声大点可以更直观地看到量测更新对定位效果的作用;
- 这里控制输入的噪声符合高斯分布只是为了编码方便,直方图滤波可以支持任意概率分布;
假设我们在机器人上检测了“检测门”的传感器,当这个传感器距离门小于0.01m的时候,可以检测到门的存在,这就保证了每次只能检测一个门;
假设在x正轴方向上有5扇一模一样的门,我们事先通过测距的方式得到了各个门的精确位置,假设地图里的位置完全没有误差,但是机器人身上的传感器比较廉价,测量时会有较大的误差,图中的黑色概率分布代表测量时的误差分布。
好的,机器人开始运行,由于我们一开始就是均匀分布,每个bin的概率相同,完全没有信息量,所以在测量值到来之前,一直保持均匀分布的状态。但是由于输入的控制信息有噪声,所以我们看到估计的机器人的位置(绿色)相对真实的机器人的位置(蓝色)在“乱跳”。熵本身没有任何变化,因为概率分布一直保持着均匀分布。
机器人终于检测到第一个门了,由于当前直方图覆盖的区域上有两个门(门1和门2),所有门都是一模一样,机器人并不确定自己是在门1还是门2,因此,门1和门2附近都有很高的概率,这个时候的概率分布呈现双峰。可以看到量测更新后,信息熵迅速下降,机器人获取了很多信息。
机器人继续往前走,检测到第二个门,由于当前直方图覆盖的区域上有两个门(门2和门3),所有门都是一模一样,机器人并不确定自己是在门2还是门3,因此,门2和门3附近都有很高的概率,这个时候的概率分布依然呈现双峰。可以看到量测更新后,门2和门3位置处的置信度进一步上升,其他位置处的置信度迅速下降,置信度分布更加集中,信息熵继续下降。
机器人继续往前走,检测到第三个门,由于当前直方图覆盖的区域上只有一个门(门3),所以机器人非常确定自己就在门3处,因为门3处的bin有非常高的置信度,附近的bin置信度非常低,这个时候绿色的机器人位置和蓝色真实的机器人位置非常接近,信息熵进一步下降。
请注意,在运动预测阶段,因为没有额外信息输入,概率分布的集中程度在下降,可以想象,如果一直没有量测更新,最终的概率分布会变成均匀分布,毫无信息量。
之后的故事就是“重复之前的故事”,没有额外信息输入的时候,机器人的不确定度越来越大,又遇到门的时候,不确定度骤降……
小结一下:
- 直方图滤波,就是不断重复“预测”和“更新”的过程,“预测”由于没有额外信息输入,误差(不确定度)不断增大;“更新”由于有额外信息输入,误差(不确定度)骤降;
- 直方图滤波,可以处理多峰问题,如果内存足够大,我们可以使用直方图覆盖整个地图,用来做全局定位;
- 因为直方图滤波可以用来做全局定位,所以它也可以处理kidnaped的情况(比方说有人把机器人拿到地图中的其他地方重新开始)
- 因为内存不可能无穷大,所以直方图滤波一般需要一个粗糙的初始化位置,即使一开始有多个定位结果(多峰),也会随着量测信息越来越多而集中概率分布(单峰)