lego-loam阅读理解笔记 一

本文主要介绍了Lego-LOAM中的imageProjectionc.cpp文件,包括findStartEndAngle()、projectPointCloud()和groundRemoval()等关键函数的解读。通过理解这些函数,读者可以深入掌握Lego-LOAM的点云处理和地面去除过程。文章还提供了相关资源链接,帮助读者进一步学习和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、imageProjectionc.cpp阅读理解

1、解读 findStartEndAngle()

2、解读 projectPointCloud()

3、解读 groundRemoval()

 4、解读cloudSegmentation()


前言

论文:https://ieeexplore.ieee.org/abstract/document/8594299

Lego-loam源码地址: https://github.com/RobustFieldAutonomyLab/LeGO-LOAM

文章原理讲解除了看论文,看看这些博客:

LeGO-LOAM:轻量级地面优化的建图

LeGo-LOAM激光雷达定位算法源码阅读(一)

其他博客代码理解推荐:https://blog.csdn.net/orange_littlegirl/article/details/95238586

安装编译运行:https://www.cnblogs.com/zhangjcblog/p/10580683.html

代码前期变量定义

首先PointType是带intensity的PointXYZ:
typedef pcl::PointXYZI  PointType;
 这些参数是根据雷达品牌来定的,比如这是16线、每线1800个点的数据:
 // VLP-16
extern const int N_SCAN = 16;
extern const int Horizon_SCAN = 1800;
extern const float ang_res_x = 0.2;//水平上每条线间隔0.2°
extern const float ang_res_y = 2.0;//竖直方向上每条线间隔2°
extern const float ang_bottom = 15.0+0.1;//竖直方向上起始角度是负角度,与水平方向相差15.1°
extern const int groundScanInd = 7;//以多少个扫描圈来表示地面
在点云分割时的必要参数:
extern const float sensorMountAngle = 0.0;
extern const float segmentTheta = 1.0472;//点云分割时的角度跨度上限(π/3)
extern const int segmentValidPointNum = 5;//检查上下左右连续5个点做为分割的特征依据
extern const int segmentValidLineNum = 3;//检查上下左右连续3线做为分割的特征依据
extern const float segmentAlphaX = ang_res_x / 180.0 * M_PI;//转成弧度
extern const float segmentAlphaY = ang_res_y / 180.0 * M_PI;//转成弧度
而 PointTypePose指的是具备姿态角的特定点:
//增加新的PointT类型常规操作
struct PointXYZIRPYT定义点类型结构
{
    PCL_ADD_POINT4D // 该点类型有4个元素
    PCL_ADD_INTENSITY;
    float roll;
    float pitch;
    float yaw;
    double time;
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW// 确保new操作符对齐操作
} EIGEN_ALIGN16;// 强制SSE对齐

pcl::PointCloud<PointType>::Ptr laserCloudIn;//雷达直接传出的点云
pcl::PointCloud<PointType>::Ptr fullCloud;//投影后的点云
pcl::PointCloud<PointType>::Ptr fullInfoCloud;//整体的点云 其中的intensity保存的是深度值
pcl::PointCloud<PointType>::Ptr groundCloud;//只包含地面点云
pcl::PointCloud<PointType>::Ptr segmentedCloud;//分割后的部分,含地面点云
pcl::PointCloud<PointType>::Ptr segmentedCloudPure;//分割后的部分的几何信息,不含地面点云
pcl::PointCloud<PointType>::Ptr outlierCloud;//在分割时出现的异常

一、imageProjectionc.cpp阅读理解

这个cpp主要函数如下,接收到消息回调函数内容

    void cloudHandler(const sensor_msgs::PointCloud2ConstPtr& laserCloudMsg){

        // 1. ros消息格式的点云转化为PCL格式的点云
        copyPointCloud(laserCloudMsg);

        // 2. 一帧点云的起始点与结束点之间的夹角
        findStartEndAngle();

        // 3. 把一帧3D点云映射到一张带有深度值的平面图
        projectPointCloud();

        // 4. 标记出地面上的点云
        groundRemoval();

        // 5. 点云分割
        cloudSegmentation();

        // 6. 发布分割后的各种点云
        publishCloud();

        // 7. 重置参数,准备处理下一帧点云
        resetParameters();
    }

1、解读 findStartEndAngle()

    这个函数刚开始,也是不知道干啥的,后来想想,激光一圈一圈的转,一圈是360°,原以为一帧点云数据也是标准的360°的内的点云,但是仔细想想不一定,一帧点云的多少

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值