常规的动态物体过滤方法按策略可以分为两类:(一)SLAM过程中在线去除动态点云,考虑了过往帧的信息(局部信息);(二)用后处理的方式,考虑整个地图提供的信息(全局信息),去除动态点云。
第一类策略可以细分为以下三种方法
segmentation-based。该类方法通常基于聚类,比如,Litomisky等人基于确定视角下的特征分布直方图(VFH, Viewpoint Feature Histogram)来从静态聚类中区分出动态聚类;Yin等人则认为相邻帧配准过程中匹配误差较大的点很可能是动态点,用这些点作为种子进行区域生长,搜索出的聚类既是动态聚类;此外,Yoon等人也提出了一种基于区域生长过滤动态聚类的方案。基于分割的方法中不得不提的还有基于深度学习的语义分割方法(deep-learning based semantic segmentation),语义分割直接label出了哪些点是动态物体,建图算法只需要直接弃掉这些点即可,简单粗暴。但是,深度学习只能分割出训练过的动态类别,对其它类别的动态物体则无能为力。
ray tracing based method
这类方法非常典型地要结合栅格去实现,可以是普通的占据栅格或者八叉树栅格。其基本原理是,激光点打到的cell,hits计数+1,激光光束穿过的cell,misses计数+1,通过hits和misses计算cell的占据概率,占据概率低于阈值,则抹除掉这个cell内的所有点。这种方法利用了动态点只会短暂地hit到某个cell,这个cell在随后的大部分时间里都会被miss的特点。这种方法的 缺点是消耗计算资源,因为一个激光点不仅产生了一个hit,同时又产生非常多的misses。当然,这个方法也可以用后处理的方式去做,比如Cartographer 3Dvisibility-based (基于可见性的方法)。这类方法的基本假设是:如果一个新激光点会穿过某个旧激光点的位置(共线),那么这个旧激光点就是动态点。这个假设逻辑上说得通,但实现起来有两个问题:其一,入射角接近90度时的误杀问题,如下图所示,红色箭头指向的旧点因为与新激光点(五角星)光路很接近,会被误杀掉,考虑到激光点测量本身的角度误差、测距误差、光斑影响等,这种误杀会更严重。其二,遮挡问题,比如对于一些大型动态物体,它们完全挡住了激光雷达的视线,激光雷达没有机会看到这些动态物体后方的静态物体,意味着这些动态点永远不会被新的激光点穿过,此时就绝无可能把这些动态点滤除掉了。
cartographer处理动态障碍的逻辑太简单了,效果不好,需要研究其他方法。