躺了一年多的动态环境下激光定位的坑,忍不住来强答一发。标签虽然是视觉SLAM,但不管激光也好视觉也好,SLAM也好定位也好,都会面临环境动态性问题。
环境中的物体通常可以分成三类:
-
静态物体:长时间稳定不变的物体,如墙、柱子等。
-
半静态物体:大部分时间是静止的,但会在某个时刻发生变化。如时而开时而关的门,路边的停车。
- 动态物体:移动的物体,如移动的行人、车辆。
通常的SLAM、定位算法都是基于静态环境假设的,也就是假设环境中都是第一类物体,显然,现实环境中并不是这样。不过,视觉中的RANSAC匹配,2D下的MCL等算法都有一定的鲁棒性,能够适应少量的动态变化,所以只要第二、三类物体在环境中占的比重不大,那些基于静态假设的算法一般也还是work的。当然,动态环境的挑战还是要直面的,特别是在项目已经接了,发现现场环境全是二、三类物体,再说做不了已经晚了,必须得硬着头皮上的情况下,o(╯□╰)o。
处理动态环境其实就是处理第二、三类物体,思路一般就两种:要么剔掉,要么建模。通常的作法是:
1. 对于第三类物体,直接当做outlier剔掉。因为这类物体在连续观测帧中是移动的,所以先将相邻帧进行匹配,得到匹配关系R,t,再将不满足匹配关系的关联对当做outlier剔除,图像中可以用RANSAC,激光帧可以ICP。值得注意的是,新出现在视野中的点,也无法与历史帧关联,但不应该被当成outlier,可以先通过视野判断,将新出现在视野中的点抽离出来,剩下的再去剔outlier。但在一些情况仍然有问题,这些极端情况目前也没有太好的解决方法(也可能是我了解的太少,大家如果有思路,欢迎交流。)
2. 对于第二类物体,一般是环境发生的变换,所以需要把这些变化建模、更新到地图当中,也就是动态地图更新。在2D-SLAM中,如果用的栅格地图,环境变化后可以根据新的观测对栅格地图的值进行更新(如Gmapping),更厉害的就是直接构建动态地图模型,比如对每个栅格用HMM构建动态模型。Graph-SLAM中,因为存的是一些关键帧或者点云,所以当发现环境变化时,需要找到历史的那几帧过期的关键帧剔掉。VSLAM了解的不是太多,特征点地图、关键帧地图一般也是可以更新的吧。地图更新会来带的一个新的问题在它依赖于定位或匹配的稳定性和精度,如果匹配失败,地图可能会被错误的更新,当地图被错误更新后,在错误地图上的定位出的位置就也有可能是错的,进而地图进一步被错误更新,恶性迭代...虽然最后也能形成一张新的地图,老的地图被完全覆盖掉了,但是对于导航而言,之前在老地图上的导航目标点等没有被更新,新的地图已经无法再进行导航了。
动态环境问题对SLAM或定位来说,仍然没有很好的解决方案。所以现在一般通过多传感器融合来规避这些问题,像激光、视觉、惯导里程等,因为通常环境变化不会对所有传感器产生影响,实在不行,还有惯导可以起作用。另外,有一种比较新的思路是抛弃全局SLAM,不再建模全局地图,而是进行相对SLAM,因为对机器人来说SLAM的目的还是用来导航,导航只关心机器人能够准确的移动到环境中的某个位置,并不关心地图是不是有误差,所以只需要构建一张位姿的拓扑图,机器人沿着拓扑路径就可以导航到某个点。