SLAMesh论文及代码阅读与思考<二>Real-time LiDAR Simultaneous Localization and Meshing

发布时间 2023-08-31 18:20:42作者: CodeEverything

前言

由于之前安装cuda、ros、boost版本等一些问题,环境配置竟然花了两天时间,期间遇到各种版本冲突,最后把环境重新配置到最直接的版本即可,cuda暂时就先卸载了。
在整个代码中,一个鲜明的特色是作者使用一个Log类来做整个pipeline的信息管理,之前用的比较少,看代码才发现通过日志来管理代码的运行在调试和优化上具有较大优势。另外,核心代码都在Map类的函数中,cell类定义了高斯过程和mesh等核心的操作,lidarfactor类对基础的数据结构和基础的函数进行了定义。在博客中放置整段代码我觉得不会给读者带来太大的信息量,想看代码直接在IDE中看更方便。本文还是通过白话文的形式来介绍下对代码的理解。下面对几个核心函数的基本原理进行介绍。前提是看了论文和SLAMesh作者的视频解读。

getPointCloud()

该函数是获取激光雷达数据的接口函数,将从文件读取和接收ros topic消息都集成在了一个函数中,较为方面,可以在config文件中调整相应参数来设置如何获取数据。本人倾向于使用ros topic订阅的方式。但是在一开始进入ros::spinOnce()之后就出现段错误,核心问题是电脑中安装了两个版本的boost库,出现了冲突,后来卸载后重新安装即可。但是代码中有一个bug是,SLAMesh节点启动后,进入process函数中while循环,然后进入到getPointCloud()中的等待ros消息的while循环,如果在接收一段消息后,处理完队列中所有的消息后,代码会一直在while循环中等待新的消息,想要停止代码就必须ctrl+c,这样就无法进入process()函数中while循环后面的模型保存函数了。后来我增加了新的判断条件解决了这一问题。

dividePointsIntoCell()

这个函数是将点云分配到相应的cell中,并对新的包含了足够的点的cell进行高斯过程重建。

registerToMap()

这个函数是迭代地建立点到mesh的匹配,计算位姿优化量,以及对点和cell进行更新。

updateMap()

这个函数是根据重叠的栅格对地图进行更新。

visualize()

可视化。