简介:
- SegMap是一种点云全局对齐的方法,原工作主要是针对lidar点云的。
- SegMap的特点是速度非常快,鲁棒性很好,因为提取了特征描述符。
- 本工作主要把SegMap方法尝试在视觉生成的半稠密点云上应用。
- 具体原理见:https://blog.csdn.net/ziliwangmoe/article/details/87445298
测试方案:
- 使对统一条街,两次采集图像数据,用DSO生成半稠密点云
- 将两份点云使用segmap进行分割和提取描述符后进行匹配的对齐
测试结果:
- 红色和白色分别是两次采集的点云在被分割后的样子。两次采集只有中间的街道是重叠区域
- 中间的街道是两次采集重叠的区域,通过segmap匹配后,基本对齐了。
- 细致发现其实不是所有地方多对齐得很好。这个主要是因为两份地图的scale不是完全的一致。所以不可能做到远距离的匹配。其实上面的对齐并没有用到整条街道的匹配。只用了街道一端的匹配,所以另一段就没有完全对齐了。
- 单独用街道另外一端一小点点云和另外一个点云对齐就能对其上,虽然重合得不是太好,但是后续加上ndt就能完全对齐。
- segmap对点云分割的结果。还是扔掉了很多的点。
结论:
- SegMap的确是非常的robust,两份点云的确是非常的不一致。
- 全局的一致性对匹配效果影响很大,也就是source点云一定不要太大了。
- 在分割和描述的提取上还有很大的提升空间,可以更具场景的特点采用不同的策略。
代码:
- https://github.com/rabienrose/3d_vision/tree/master/visual_map/src/pointcloud_match/desc_matcher
- 使用catkin build编译,如果不知道catkin build是什么的,请先自行学习。
- 拷贝三方库
- 所有依赖都在拷贝的三方库中
使用:
- 需要文件:
- 配置文件:pc_match_config.yaml。里面主要是segmap算法的配置
- 启动脚本:gen_pc_desc.sh
- 配置文件和脚本都在代码库中,自行搜索
- source点云pcd
- target点云pcd
- 描述符文件,由描述符提取功能生成
- 流程:
- 脚本中修改./devel/lib/pcdesc_matcher/pcdesc_matcher ${root_dir} loc
- 执行文件路径
- 最后的loc是代表定位模式还是描述符提取模式,如果要提去描述符就设置为gen_map
- 修改点云文件名为:semi_pc.pcd
- 把所有需要的文件放在一个目录里面,比如如下:
- features_database.csv 生成的描述符文件,生成描述符的时候不需要
- segments_database.csv 生成的描述符文件,生成描述符的时候不需要
- pc_match_config.yaml
- semi_pc.pcd
- 最后使用gen_pc_desc.sh运行程序,gen_pc_desc.sh程序的入参就是上面包含所有文件的那个目录路径
- 脚本中修改./devel/lib/pcdesc_matcher/pcdesc_matcher ${root_dir} loc
重要的配置参数
- Segmenters
- radius_for_growing:设置越大,分割就越大快,越小就月零碎。分割太大不容易被匹配上,分割太小又会让产生更多噪音。
- min_cluster_size:主要根据点云的密度来设置,因为视觉点云相对lidar很稀疏,这里设置为最小值50
- GeometricConsistency
- resolution:决定误差在多少以内算作内点。设置太低,很难成功匹配上,太高的话会被匹配到错误的地方
- min_cluster_size:这个一般设置为6就行。意思是内点小于多少才算是成功被匹配,大于6基本对匹配成功与否判断比较准确,但是resolution不同也会影响这个的作用。
- Classifier
- n_nearest_neighbours:找一个描述符最相近的其他描述符的时候,需要找多少个点,也就是最相似的多少个描述符。一般设置为120。这个值越大,送入后面几何一致性判断模块的预先匹配就越多,也就是内点率就越低。