综述
正态分布变换算法是一个配准算法,他应用于三维点的统计模型,使用标准最优化技术来确定联合和点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快。
应用
无人车的定位问题。实际上就是要找到无人车在地图上的当前位置(并且精度在厘米级别),其中一类方法是slam,他能实现导航定位而不需要地图,然而,真正实现无人车的SLAM是非常困难的,作为交通工具,远距离的行驶会使得实时构建地图的偏差变大。所以在已经拥有高精度地图的前提下去做无人车定位是更加简单,更加现实的。NDT(正太分布变换)就是一类利用高精度地图和实时的激光雷达数据进行高精度定位的技术。摘抄自大神博客:https://blog.youkuaiyun.com/adamshan/article/details/79230612
为了知道我们在高精度地图中的确切位置,我们比较lidar扫描得到的点云和我们的地图点云,其中一个问题在于:lidar扫描得到的点云可能和地图的点云存在细微的区别,这里的偏差可能来自于测量误差,也有可能这个“场景”发生了一下变化(比如说行人,车辆)。NDT配准就是用于解决这些细微的偏差问题。
NDT并没有比较两个点云点与点之间的差距,而是先将参考点云(target_cloud)(即高精度地图)转换为多维变量的正态分布,如果变换参数能使得两幅激光数据匹配的很好,那么变换点在参考系中的概率密度将会很大。因此,可以考虑用优化的方法求出使得概率密度之和最大的变换参数,此时两幅激光点云数据将匹配的最好。
API流程(个人理解)
给定input_cloud和target_cloud,其中先对input_cloud进行下采样得到filtered_cloud,然后计算filtered_cloud和target_cloud之间的变换矩阵T,根据该矩阵将input_cloud进行变换得到output_cloud。
NDT代码
//将输入的扫描过滤到原始尺寸的大概10%以提高匹配的速度。
//对第二次的扫描结果进行体素滤波(下采样)
pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::ApproximateVoxelGrid<pcl::PointXYZ> approximate_voxel_filter;
approximate_voxel_filter.setLeafSize (0.2, 0.2, 0.2);
approximate_voxel_filter.setInputCloud (input_cloud);
approximate_voxel_filter.filter (*filtered_cloud);//下采样之后的点云保存在filtered_cloud
std::cout << "Filtered cloud contains " << filtered_cloud->size ()
<< " data points from room_scan2.pcd" << std::endl;
//初始化正态分布变换(NDT)
pcl::NormalDistributionsTransfor