slam定位学习笔记(六)

学习内容来自这篇文章,主要是将模块进行划分以及根据划分的模块对前面的代码结构进行调整。

一、模块划分

之前的文章主要介绍了这几个功能的实现:传感器时间同步点云去畸变实时显示点云精度评价前端里程计。将它们区分成三个模块:

1)数据预处理:主要包括传感器时间同步和点云去畸变。

2)前端里程计:主要就是计算并输出点云位姿。

3)显示模块:主要是生成点云地图,局部地图和全局地图。

之后还会添加两个模块后端优化闭环检测,这样共计五个模块,一个基础的slam框架就搭建好了。之后的学习就是在五个模块里面学习。

二、代码文件管理思路

确定整个工程有五个模块后,就应该对于不同的模块进行分析,对之前的代码进行结构优化。分析这五个模块,第一个模块是建图和定位功能共有的模块,而后面四个模块单独是建图功能独有的模块。所以把第一个模块分离出来,后面四个模块的实现放在mapping文件夹内。然后就是为了代码的简洁,将整个模块划分为输入输出流程管理核心代码实现以及node文件的调用三个部分。

1)核心功能实现:用类进行封装,放在对应的文件夹下,文件名和功能模块名相同。

2)输入输出流程管理:负责输入输出功能,使用智能指针进行调用核心功能的类,以_flow结尾进行区分。(原来是这个原因)

3)node文件的调用:使用ros里面的spinOnce和while的循环来控制不同的模块。在app文件夹下以_node结尾。

4)yaml文件使用:针对不同模块进行不同的配置文件的撰写。

三、代码结构分析

首先分析src文件夹:

slam定位学习笔记(六)_第1张图片

其中apps文件里面是不同的node文件,主要作用是控制不同的模块,前端、后端、数据预处理和显示模块的实现。

slam定位学习笔记(六)_第2张图片

然后就是data_pretreat和mapping两个文件夹就是前面说的,将数据预处理和其它四个模块的实现区分开来。其中mapping里就是前端、后端、显示和闭环这四个模块的实现。区分为核心实现和以flow结尾的流程调用。

slam定位学习笔记(六)_第3张图片

 models文件夹内保存的是点云处理滤波器、点云关键帧配准和点云畸变矫正这三个点云预处理的功能实现。

slam定位学习笔记(六)_第4张图片

sensor_data文件夹内保存的是工程需要用到的传感器数据格式有gnss、imu、点云数据和速度数据以及需要通过计算出来的位姿数据、关键帧数据。区分方法是通过里面是否定义了SyncData函数,这个函数是用来同步不同传感器的时间戳。

slam定位学习笔记(六)_第5张图片

然后就是subscriber文件夹和publisher两个文件夹。主要变化是subscriber和publisher文件夹内都新增了两个关键帧的文件:key_frame_subscriber.hppkey_frames_subscriber.hpp,它们的区别是回调函数使用的指针不同,一个使用的是geometry_msgs::PoseStamped,另一个是nav_msgs::Path

查看两个数据格式的对比:

slam定位学习笔记(六)_第6张图片

可以发现两个最下面的都是geometry_msgs/Pose,然后Path里面多了一个header信息并且它的还包含了geometry_msgs/PoseStamped[] poses是数组的形式。所以path是用在了key_frames里面,另一个用在key_frame里面,应该是对于多了对于位置信息的使用。

然后就是tf_listener文件用来获取imu-gnss和lidar之间刚性距离位姿关系和tools里面的对文件夹,文件路径操作的文件。

里面所有的源码,在之前的笔记中都记录过了,这里就不再重复。对定位系列文章学习终于过半。希望本月可以将最后的后端优化、闭环检测和定位结束,希望寒假前可以完成传感器融合系列的学习。

你可能感兴趣的:(slam,学习)