LIO_SAM框架的一些学习记录和细节
开源代码地址:https://github.com/TixiaoShan/LIO-SAM
3、FeatureExtraction部分
主要的功能为提取去畸变后的角点和平面点。calculateSmoothness()根据公式计算每一个点云的光滑度。
markOccludedPoints()主要的功能为滤除遮挡点,遮挡点定义如下,A点和B点是相邻点,但是A点在B点后面很多,所以A点之前的5个点很容易被遮挡,因此他们被滤除。平行点。当激光照射到一个和激光入射角接近的平面时,很容易误识别角点,所以这些点被滤除。
extractFeatures()首先空间区域被均匀分成六份,每个区域的点按照光滑度有小到大排列,每个区域至多取20个角点。另外,当取得一个角点时,为防止聚集,他周围10个相邻像素的点都会被滤除。
4、mapOptimization部分
主要的功能就在于构建因子图实现全局优化,重点的函数是帧间匹配的LM算法。laserCloudHandler()接受imageProjection节点中去畸变后的点云,该点云有三部分的消息,去畸变的点云的角点和平面点,imu的原始信息,imu里程计的信息。
updateInitialGuess(),transformTobeMapped这个六维向量首先用imu的原始值填充RPY。 如果odomAvailiable,transFinal这个齐次矩阵存放的是增量后的map系下的初值,然后赋值给到transformTobeMapped的其他项。 如果imuAvailable,那么重复上述操作,应该是防止上述的odom不可用。
extractSurroundingKeyFrames()。主要的函数是extractNearby()。该函数首先得到surroundingKeyPosesDS,这个是当前帧点云附近的一些关键帧位置的降采样。然后送入到extractCloud()这个函数中,该函数的主要作用为根据之前的附近关键位置,将其上的点云信息变换到map系下,生成Corner和Surf点云:laserCloudCornerFromMap,laserCloudSurfFromMap,然后将他们注册到laserCloudMapContainer。这个容器超过1000会自动重置,里面存放的临时的laserCloud的角点和平面点。
downsampleCurrentScan(),这个函数的主要作用为当前帧的角点和平面点点云降采样。 scan2MapOptimization(),这个函数主要的作用就是LM优化了,在本函数中一共设置了30次的优化限制。
之后就是将scan-to-map得到的初值加入到因子图里面,然后回环线程就是将检测到的回环加入到因子图里面优化。