分类于: Robotics
关键词: 概率机器人

概率机器人测距仪波束模型

基本模型

《概率机器人》中针对测距仪,建立了一个波束模型。将测距仪在测量过程中的误差分为四类:测量噪声、意外对象引起的误差、由测距仪物理原理引起的误差和随机意外噪声。

测量噪声

理想情况下,测距仪总是测量位于其测量领域内的最近物体的正确距离。这个测量值是理想意义下准确的,假设由 $z_t^k $ 表示。但是,在实际情况中,由于各种误差的存在,是的我们获取的测量值与理想情况下的值存在一定的误差,在此由 $z_t^{k * } $ 表示,并且用一个均值为 $z_t^{k * } $ 、标准差为 $\sigma_{hit} $ 的高斯分布来建模这个误差的情况。因此,测量的概率有下式给出:

$$ \begin{align} p_{hit}(z_t^k|x_t, m) & = \eta N(z_t^k; z_t^{k * }, \sigma_{hit}^2) \quad 0 \le z_t^k \le z_{max}\\ N(z_t^k; z_t^{k * }, \sigma_{hit}^2) & = \frac{1}{\sqrt{2 \pi \sigma_{hit}^2}}e^{ - \frac{1}{2} \frac{(z_t^k - z_t^{k * })^2}{\sigma_{hit}^2}}\\ \eta & = (\int_0^{zmax} N(z_t^k; z_t^{k * }, \sigma_{hit}^2) dz_t^k )^{-1} \end{align} $$

意外对象引起的误差

由于移动机器人的环境是动态的,而导航的地图 $m$ 是静态的。因此,地图中不包含的对象可能会引起测距仪测量上的误差。最典型的对象就是与机器人在同一空间中的人。处理这类对象的一般方法有2种:1.将这类对象作为状态向量的一部分来处理;2.把他们当做测量噪声进行处理。

在波束模型中,将这类对象当做测量的噪声进行处理。由于这类对象的出现,测距仪探测到的信息会出现与环境特定的距离明显有减少,而且总是只返回距离测距仪最近的距离信息。所以用数学上的指数分布来对他进行描述。

$$ \begin{align} p_{short}(z_t^k|x_t,m) & = \eta \lambda_{short}e^{-\lambda_{short}z_t^k}\\ \eta &= \frac{1}{1-e^{-\lambda_{short}z_t^{k * }}} \end{align} $$

由测距仪物理原理引起的误差

有时环境中障碍会被完全忽略。例如,在声呐传感器遇到了镜面反射时,会经常发生此情况。当用激光测距仪检测到黑色吸光的对象时,或者某些激光系统在明媚的阳光下测量物体时,也会发生检测失败。

传感器检测失败(sensor failure)的典型结果是最大距离测量(max-range measurement)间题:传感器返回它的最大允许值 $z_{max}$ 。由于这样的事件经常发生,那么在测量模型中明确地建立最大测量范围的模型就很必要。

波束模型使用一个以 $z_{max}$ 的点群分布来建立模型:

$$ p_{max}(z_t^k|x_t, m) = I(z=z_{max}) = \left { \begin{array}{rl} 1 \quad & z=z_{max}\\ 0 \quad & 其他 \end{array} \right. $$

随机意外噪声

最后,测距仪偶尔会产生完全无法解释的测量 (unexplainable measurements) 。例如,当超声波被几面墙反弹或者它们受到不同传感器之间的串扰时,声呐常产生幻读。为了使之简单化,对千这样的测量,这里将使用一个分布在完整传感器测量范围 $[0,z_{max}]$ 的均匀分布来建立模型:

$$ p_{rand}(z_t^k|x_t, m) = \left { \begin{array}{rl} \frac{1}{z_{max}} \quad & 0 \le z_t^k \le z_{max}\\ 0 \quad & 其他 \end{array} \right. $$

波束模型的综合

上面给出了波束模型可能遇到的4中噪声,波束模型中,将上面4中噪声通过四个参数: $z_{hit}、 z_{short}、z_{max}、 z_{rand}$ 进行加权平均混合,且 $z_{hit}+z_{short}+z_{max}+z_{rand}=1$,有:

$$ p(z_t^k| x_t,m) = \left ( \begin{array}{ccc} z_{hit}\\ z_{short}\\ z_{max}\\ z_{rand} \end{array} \right )^T \cdot \left ( \begin{array}{ccc} p_{hit}(z_t^k|x_t,m)\\ p_{short}(z_t^k|x_t,m)\\ p_{max}(z_t^k|x_t,m)\\ p_{rand}(z_t^k|x_t,m) \end{array} \right ) $$

beam_range_finder_model 算法

$$ \begin{align} \text{1:} \qquad \qquad & \text{Algorithm beam_range_finder_model}(z_t,x_t,m)\\ \text{2:} \qquad \qquad & q=1\\ \text{3:} \qquad \qquad & \text{for } k=1 \text{ to } K \text{ do}\\ \text{4:} \qquad \qquad & \qquad \text{compute } z_t^{k * } \text{ for the measurement } z_t^k \text{ using ray casting}\\ \text{5:} \qquad \qquad & \qquad q = z_{hit} \cdot p_{hit}(z_t^k|x_t,m) + z_{short} \cdot p_{short}(z_t^k|x_t,m) + z_{max} \cdot p_{max}(z_t^k|x_t,m) + z_{rand} \cdot p_{rand}(z_t^k|x_t,m)\\ \text{6:} \qquad \qquad & \qquad q = q \cdot p\\ \text{7:} \qquad \qquad & \text{return } q \end{align} $$

模型调参

这个模型调参的有一个通用方法就是:手动调参。手动调参需要基于工程经验来,我没有调过,也不知道怎么调。这里介绍一下《概率机器人》书中提到的调节模型餐宿的算法(adjusting model parameters)。

模型调参算法

$$ \begin{align} \text{1:} \qquad \qquad & \text{Algorithm learn_intrinsic_parameters}(Z,X,m)\\ \text{2:} \qquad \qquad & \text{repeat until convergence ceitierion satisfied}\\ \text{3:} \qquad \qquad & \text{for all } z_i \text{ in } Z \text{ do}\\ \text{4:} \qquad \qquad & \qquad \eta = [z_{hit} \cdot p_{hit}(z_t^k|x_t,m) + z_{short} \cdot p_{short}(z_t^k|x_t,m) + z_{max} \cdot p_{max}(z_t^k|x_t,m) + z_{rand} \cdot p_{rand}(z_t^k|x_t,m)]^{-1}\\ \text{5:} \qquad \qquad & \qquad \text{caclulate } z_i^{ * } \\ \text{6:} \qquad \qquad & \qquad e_{i,hit} = \eta \cdot p_{hit}(z_t^k|x_t,m)\\ \text{7:} \qquad \qquad & \qquad e_{i,short} = \eta \cdot p_{short}(z_t^k|x_t,m)\\ \text{8:} \qquad \qquad & \qquad e_{i,max} = \eta \cdot p_{max}(z_t^k|x_t,m)\\ \text{9:} \qquad \qquad & \qquad e_{i,rand} = \eta \cdot p_{rand}(z_t^k|x_t,m)\\ \\ \text{10:} \qquad \qquad & z_{hit} = |Z|^{-1} \sum_i e_{i,hit}\\ \text{11:} \qquad \qquad & z_{short} = |Z|^{-1} \sum_i e_{i,short}\\ \text{12:} \qquad \qquad & z_{max} = |Z|^{-1} \sum_i e_{i,max}\\ \text{13:} \qquad \qquad & z_{rand} = |Z|^{-1} \sum_i e_{i,rand}\\ \text{14:} \qquad \qquad & \sigma_{hit} = \sqrt{\frac{1}{\sum_i e_{i,hit}}\sum_i e_{i,hit}(z_i - z_i^{ * })^2}\\ \text{15:} \qquad \qquad & \lambda_{short} = \frac{\sum_i e_{i,short}}{\sum_i e_{i,short} z_i}\\ \text{16:} \qquad \qquad & \text{return } \Theta = \left { z_{hit}, z_{short}, z_{max}, z_{rand}, \sigma_{hit}, \lambda_{short} \right } \end{align} $$

模型调参的数学推导

暂时略过。

实际应用考虑

从计算的角度来看,计算所有传感器读数的密度是非常复杂的。因为对每一个波束扫描和每一个可能的姿态都要进行射线投射操作,因此不能总是实时地将整个扫描综合到当前的置信度中。解决这一问题的典型方法就是仅综合所有测量的小子集(如每次激光测距扫描只综合8个等间隔测量,而不是360个)。这种方法有一个种重要的额外好处:因为一次测距扫描中的相邻波束往往不是独立的,这样做,状态估计过程就会变得不易受到相邻测量的相关噪声的影响。

波束模型的局限性

具体来说,基于波束的模型表现出缺乏光滑性(lack of smoothness)。在有许多小障碍的混乱环境中,分布 $p(z_t^k|x_t,m)$$x_t$, 处是很不光滑的。

缺乏光滑性有两个后果。 - 第一,任何近似置信度表示法都存在错过正确状态的风险,因为邻近的状态可能具有截然不同的后验似然。这就限制了近似的准确性。近似的准确性如果不满足,将会增加后验的结果误差。 - 第二,由于在这样不光滑模型中有大量的局部极大值,因此用爬坡算法找到最可能的状态容易出现局部极小问题。