NDT定位实践总结(参数含义及设置)
这篇是关于无人车通过NDT匹配提前建好的点云地图的介绍,主要依托于这个ROS项目。
NDT简介
NDT是利用已有的高精度点云地图和激光雷达实时测量数据实现高精度定位的技术。它通过比较激光雷达扫描得到的点云和已经准备好的地图点云来实现定位。
NDT并没有比较两个点云点与点之间的差距,而是先将参考点云(即高精度地图)转换为多维变量的正态分布,如果变换参数能使得两幅激光数据匹配的很好,那么变换点在参考系中的概率密度将会很大。因此,可以考虑用优化的方法求出使得概率密度之和最大的变换参数,此时两幅激光点云数据将匹配的最好。
如上图中,灰色的点为预先建立好的点云地图,黄色点为当前扫描的点,二者实现正确匹配即可确定车辆的位置。
NDT参数设置
项目链接:https://github.com/AbangLZU/ndt_localizer
主要需要修改的参数如下:
map_loader.launch
中:
<arg name="roll" default="0.0" />
<arg name="pitch" default="0.0" />
<arg name="yaw" default="0.0" />
<arg name="x" default="0.0" />
<arg name="y" default="0.0" />
<arg name="z" default="0.0" />
这些参数代表ndt中map坐标系相对于原先建的地图的原点的偏移;
ndt_localizer.launch
中:
trans_epsilon
即设置变换的 ϵ(两个连续变换之间允许的最大差值),这是判断我们的优化过程是否已经收敛到最终解的阈值
step_size
即设置牛顿法优化的最大步长。
resolution
即设置网格化时立方体的边长,网格大小设置在NDT中非常重要,太大会导致精度不高,太小导致内存过高,并且只有两幅点云相差不大的情况才能匹配。
max_iterations
即优化的迭代次数,我们这里设置为35次,即当迭代次数达到35次或者收敛到阈值时,停止优化。
converged_param_transform_probability
匹配失败的阈值。
points_downsample.launch
中:
leaf_size为降采样时选取的立方体的边长(单位为m),在这个立方体中只保留一个点。这个一般根据激光雷达的线数来设定:如果采用16线的激光雷达,那么leaf_size设置为1-2m合适;如果采用32及以上,可以设置为2-3m。
输出
终端输出中,有个trans_prob
参数,它也是transform_probability
话题的内容,值越大表示匹配效果越好。
converged_param_transform_probability
设置时,如果设置为3,表示trans_prob大于3即表示匹配成功。一般情况下,匹配比较好的时候大于6,甚至7。