lego-loam阅读理解笔记 二

本文是lego-loam阅读理解笔记的第二部分,主要解析了featureAssociation.cpp中的关键函数,包括runFeatureAssociation()的激光点云坐标变换与畸变补偿,adjustDistortion()的IMU投影与时间对齐,calculateSmoothness()的平滑度计算,markOccludedPoints()的不可靠点标记,以及extractFeatures()的特征点提取过程。通过对这些函数的解读,深入理解lego-loam在3D激光SLAM中的点云处理策略。

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

目录

 

目录

前言

一、runFeatureAssociation()解读

二、adjustDistortion()解读

 三、calculateSmoothness()解读

 四、markOccludedPoints()解读

五、extractFeatures()理解

 六、剩下函数简要注释



前言

featureAssociation.cpp主要实现点云相对于IMU的坐标变换,特征提取,特征匹配等功能

一、runFeatureAssociation()解读

    该函数是整个cpp的主要功能函数

void runFeatureAssociation()
    {
        //没有新的数据来,就不处理
        if (newSegmentedCloud && newSegmentedCloudInfo && newOutlierCloud &&
            std::abs(timeNewSegmentedCloudInfo - timeNewSegmentedCloud) < 0.05 &&
            std::abs(timeNewOutlierCloud - timeNewSegmentedCloud) < 0.05){
            newSegmentedCloud = false;
            newSegmentedCloudInfo = false;
            newOutlierCloud = false;
        }else{
            return;
        }
        // 特征提取
        adjustDistortion(); //主要进行的处理是将点云数据进行坐标变换,进行插补等工作
        calculateSmoothness(); // 按照论文中的方法计算曲率,并保存结果
        markOccludedPoints();// 标记瑕点,loam论文中:1.平行scan的点(可能看不见);2.会被遮挡的点
        extractFeatures();//根据曲率对点云分类,然后分别保存到cornerPointsSharp等等队列
        publishCloud(); // 发布cornerPointsSharp等4种类型的点云数据便于可视化
		//Feature Association
        if (!systemInitedLM) {
            checkSystemInitialization();
            return;
        }
        updateInitialGuess(); // 预测位姿
        updateTransformation(); // 更新变换
        integrateTransformation(); // 积分总变换
        publishOdometry();
        publishCloudsLast(); // cloud to mapOptimization
    }
};

二、adjustDistortion()解读

    该函数实现点的水平夹角在π~3π之间,一帧点云空间时间都统一到IMU坐标系中。也就是激光点云的畸变补偿。激光雷达在不断的扫描时,也在运动,所以一帧从头扫到尾,激光点坐标并没有在同一坐标系中,如图1所示。

 

                                                   

                                                                                             图 1

 所以,要计算每一点激光点相对于起始点的时间间隔,图1中的b点相对起始点a点的时间间隔为△t△t。本论文是把一帧激光点云统一到IMU坐标系中

          //点归为到π~3π
            float ori = -atan2(point.x, point.z);
            if (!halfPassed) {
                if (ori < segInfo.startOrientation - M_PI / 2)
                    ori += 2 * M_PI;
                else if (ori > segInfo.startOrientation + M_PI * 3 / 2)
                    ori -= 2 * M_PI;

                if (ori - segInfo.startOrientation > M_PI)
                    halfPassed = true;
            } else {
                ori += 2 * M_PI;
                if (ori < segInfo.endOrientation - M_PI * 3 / 2)
                    ori += 2 * M_PI;
                else if (ori > segInfo.endOrientation + M_PI / 2)
                    ori -= 2 * M_PI;
            }

计算每一个点相对于起始点的间隔数,其中segInfo.orientationDiff = 377°,这个值在阅读理解笔记一中有提到过

 float relTime = (ori - segInfo.startOrientation) / segInfo.orientationDiff;  //计算每一个点相对于起始点的间隔数

计算每一个点相对于起始点的时间。scanPeriod是激光雷达水平相邻两束激光的间隔时间

 float pointTime = relTime * scanPeriod;  //计算每一个点相对于起始点的时间

 

                 if (i == 0) {  //某帧激光的第一个点
                    imuRollStart = imuRollCur;
                    imuPitchStart = imuPitchCur;
                    imuYawStart = imuYawCur;
                    imuVeloXStart = imuVeloXCur;
                    imuVeloYStart = imuVeloYCur;
                    imuVeloZStart = imuVeloZCur;
                    imuShiftXStart = imuShiftXCur;
                    imuShiftYStart = imuShiftYCur;
                    imuShiftZStart = imuShiftZCur;
                    if (timeScanCur + pointTime > imuTime[imuPointerFront]) {
                        imuAngularRotationXCur = imuAngularRotationX[imuPointerFront];
                        imuAngularRotationYCur = imuAngularRotationY[imuPointerFront];
                        imuAngularRotationZCur = imuAngularRotationZ[imuPointerFront];
                    }else{
                        int imuPointerBack = (imuPointerFront + imuQueLength - 1) % imuQueLength;
                        float ratioFront = (timeScanCur + pointTime - imuTime[imuPointerBack]) 
                                                         / (imuTime[imuPointerFront] - imuTime
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值