基于描述符匹配的激光点云定位
目的:
- 使用纯激光点云进行实时全局定位。
- 点云的全局匹配比较困难,即使使用NDT也只能在一个先验位置附近搜索。
- NDT匹配运算量较大。
- 动态物体影响较大。
效果:
- 每次匹配在100ms左右,还有提升空间。
- 适用于小到100平米大到3000平米区域的全局匹配。
- 全局定位水平平均精度在30cm,垂直精度在60cm
- 滤波后水平平均精度在20cm,垂直精度在20cm
方法:
- 主要算法基于https://github.com/ethz-asl/segmap
- 对地图点云进行分割后,提取每个分割的描述符。
- 使用cartographer得到一个局部地图,对地图点云进行分割提取描述符后,和全局地图进行匹配。
- 描述符一共7个float,代表点云的对称度,扩散度等信息。
- 同时使用深度学习得到的描述符,其匹配能力更强,但是速度更慢。因为简单的描述符已经能够满足需求,就没有用深度学习得到的描述符。
- 适应kd-tree进行描述符匹配,得到原始匹配
- 使用ransac进行排除错误的匹配,最终得到局部地图和全局地图之间的变换关系
- 使用cartographer作为滤波器中predict的方式。
- 使用UKF融合cartographer得到相对位置和描述符匹配的到的全局位置。
挑战:
- 分割算法的前提是点云需要取出地面,尝试了地面法线提取取出,但是速度较慢。考虑到不太需要精确的去除地面,最终采用简单的通过IMU得到重力方向,然后剔除一定高度以下的点。
- 在应用到室内的时候,一开始是利用空间关系来删除局部地图中旧的点,结果因为场景太小,整个场景都能被一个局部地图所包含,所以就删除不了任何点了。后面改为通过时间加空间关系来删除旧点,就解决了这个问题。
- 观察发现,基本能被匹配上的点都是比较小的点。所以通过调整分割的大小来删除大量候选点来提高速度。
- 调整各种参数得到对算法运算量和效果之间的平衡调整最有效的参数。
代码:https://github.com/rabienrose/lidar_localization
能力和知识:
- KD-Tree
- 决策树
- C++
- RANSAC
- UKF
- Cartographer
文章:TBA
未来改进点:
- 使用Inverted File代替KD-Tree,实现更快的运行速度。目前一般的时间花费在原始匹配上。
- 使用随机森林来训练描述符之间的距离公式,让匹配更有效。
可视化:
- 彩色的是分割后的局部地图,不同颜色代表不同分割
- 白色是去地面并分割后的定位地图
- 绿色垂直的线代表分割之间的匹配
- 红色和蓝色小点分别代表定位结果和gps的位置