ROS-3DSLAM(4):lidar_odometry包浅析

这篇博客主要分析了ROS中的lidar_odometry包,特别是featureExtraction.cpp文件,涉及点云处理和特征提取。文章介绍了文件导入、数据结构定义,重点讲解了特征提取函数,包括计算平滑度、标记闭塞点、特征点的提取等。通过这些功能,该包实现了从激光雷达数据中提取特征点,为自动驾驶系统的SLAM算法提供关键信息。
摘要由CSDN通过智能技术生成

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值