2021@SDUSC
2021年10月11日星期一——2021年10月14日星期四
一、学习背景:
结束了论文的学习之后,我们下一步的学习目标就是关键的代码了,但是在此之前,我们还仍然需要先把整个项目的信息流分析明白,这样才能有助于我们更好地进行后续的阅读学习代码工作。
结束了信息流的分析之后,我们的第二个工作目标就是对于lidar_odometry包的代码分析。相较于第一个视觉处理的系统而言,这个雷达处理的系统更为简单一些,分析起来也相对较为容易。我们首先分析的目标是较小的三个文件,剩下的那一个较大的代码文件:图优化,我们下一周再处理。这一周,我负责的部分是特称提取的功能,也就是“featureExtraction.cpp”。
因为第二项工作任务较多,所以考虑到篇幅,所以我把信息流的部分摘取了出来,单独列为了一篇文章,下一次再写出来。
二、特征提取(featureExtraction.cpp):
1、开头导入文件:
代码开头导入的两个文件当中,一个是本地文件夹下的utility,一个是lvi-slam下的cloud_info。这里特别要注意的是第二个头文件。第一个头文件中包含了本系统中所需要的各种初始定义,位于本地文件夹下,而第二个头文件则是点云的基本信息,除此之外,也包含了“imu”和“odom”的成员变量。
之后,作者又定义了两个数据结构,分别用来存储和计算( )信息。
2、基本的定义:
在这个大类当中,作者首先给出了相应的定义。
因为是首次接触点云这个概念,而且长时间没有接触cpp,有些陌生,所以阅读代码起来稍微有些吃力。
因此我参考了知乎上的注释来入手(见文末)。在这里,注释者基本上介绍了作者缩写代码的思路。
-
ros::下:创建了订阅者Subscriber和发布者Publisher,其中发布者有三个,分别是pubLaserCloudInf,pubCornerPoints和pubSurfacePoints,他们分别用来完成发布不同的点云信息:激光帧提取特征之后的点云信息,激光帧提取到的角点点云以及平面点点云。
ros::Subscriber subLaserCloudInfo; ros::Publisher pubLaserCloudInfo; ros::Publisher pubCornerPoints; ros::Publisher pubSurfacePoints;
-
pcl::下:这里有牵扯到pcl这个概念,所以需要说明一下。
-
pcl:是一种数据结构,在ROS最新版本中用来存储点云的信息。
-
而这里作者给出的定义也符合它的功能,设计了三个集合来存储点云的信息:extractedCloud、cornerCloud和surfaceCloud。
-
pcl::PointCloud<PointType>::Ptr extractedCloud; pcl::PointCloud<PointType>::Ptr cornerCloud; pcl::PointCloud<PointType>::Ptr surfaceCloud; pcl::VoxelGrid<PointType> downSizeFilter;
-
-
lvi-sam和std_msgs下的两个定义变量用来存储当前激光帧的全部信息,包括所有的历史数据。
lvi_sam::cloud_info cloudInfo; std_msgs::Header cloudHeader;
这个地方我不太理解,lvi_sam下是什么?难道这是本包下的基础类型?他是怎么储存所有的历史数据的?
-
std::vector与Float变量下的集合用来存储激光帧点云的曲率。
std::vector<smoothness_t> cloudSmoothness; float *cloudCurvature;
-
*cloudNeighborPicked
-
int变量一个是标记,一个是标签,分别用来表示是否提取和提取的类型:角点还是平面点。
int *cloudLabel int *cloudNeighborPicked
2、函数分析一:初始化
首先的两个函数 FeatureExtraction和 initializationValue就是用来初始化的。
它们初始化了订阅者和发布者的信息,并且给上文所定义的各个变量进行了初始化。
FeatureExtraction() { // 订阅当前激光帧运动畸变校正后的点云信息 subLaserCloudInfo = nh.subscribe<lio_sam::cloud_info>("lio_sam/deskew/cloud_info", 1, &FeatureExtraction::laserCloudInfoHandler, this, ros::TransportHints().tcpNoDelay()); // 发布当前激光帧提取特征之后的点云信息 pubLaserCloudInfo = nh.advertise<lio_sam::cloud_info> ("lio_sam/feature/cloud_info", 1); // 发布当前激光帧的角点点云 pubCornerPoints = nh.advertise<sensor_msgs::PointCloud2>("lio_sam/feature/cloud_corner", 1); // 发布当前激光帧的面点点云 pubSurfacePoints = nh.advertise<sensor_msgs::PointCloud2>("lio_sam/feature/cloud_surface", 1); // 调用初始化函数 initializationValue(); } // 初始化各个变量信息 void initializationValue()