LeGO_LOAM的labelComponents函数详解

        近几天开始慢慢整理一下自己的源码阅读笔记。

        首先,lego-loam的特点之一就是分割地面点,对非地面点进行聚类,对于有效聚类点再进行特征提取。首先,看看lego-loam的第一个处理节点imageProjection.cpp,以下是我总结的流程:

LeGO_LOAM的labelComponents函数详解_第1张图片

         这里主要讲解labelComponents这个聚类核心函数,以下是计算原理:

 对应的代码段:

                d1 = std::max(rangeMat.at(fromIndX, fromIndY),  rangeMat.at(thisIndX, thisIndY)); //取深度
                d2 = std::min(rangeMat.at(fromIndX, fromIndY),  rangeMat.at(thisIndX, thisIndY));

                if ((*iter).first == 0)     // 根据是行偏移还是列偏移,选择行/列分辨率
                    alpha = segmentAlphaX;
                else
                    alpha = segmentAlphaY;

                //点(thisIndX, thisIndY) 和 点(fromIndX, fromIndY)深度的角度差,判断是否突变
                angle = atan2( d2*sin(alpha), (d1 - d2*cos(alpha)) );

                if (angle > segmentTheta) {    // 如果夹角大于segmentTheta°(没有突变),则将这个邻点纳入到局部特征中,该邻点可以用来配准使用

                    queueIndX[queueEndInd] = thisIndX; 
                    queueIndY[queueEndInd] = thisIndY;
                    ... ...
                }

        接下来,函数第二步处理的就是对聚类有效性的判断,feasibleSegment标志:

对于此标志为true的条件有2个:

1、上一步处理的聚类数目直接>30,则feasibleSegment=true;
2、上一步处理的聚类数目>segmentValidPointNum,且有效聚类点所在的线束>第segmentValidLineNum根线束,则feasibleSegment=true;

 对应的代码段:

        bool feasibleSegment = false;
        if (allPushedIndSize >= 30)             // 如果是 allPushedIndSize 累加的数量增加到了30 个 则判断这部分点云属于一个聚类
            feasibleSegment = true;
        else if (allPushedIndSize >= segmentValidPointNum){    // 聚类不足30个点, 则如果垂直方向上点的数量大于5个,并且有效线束大于segmentValidLineNum,也是一个有效的聚类
                int lineCount = 0;                              
                for (size_t i = 0; i < N_SCAN; ++i)
                    if (lineCountFlag[i] == true)
                        ++lineCount;
                if (lineCount >= segmentValidLineNum)        
                    feasibleSegment = true;            
        }

你可能感兴趣的:(0_1SLAM,c++,算法,自动驾驶)