SLAM | LIO-SAM 节点架构与代码解析 文章目录概述一、语义定位因子(一)、出处(二)、GPT 解读(三)、个人解读二、地图文件说明三、四大节点(一)、imuPreintegration.cpp(IMU 预积分)1. IMUPreintegration2. TransformFusion(二)、imageProjection.cpp(畸变校正)(三)、featureExtraction.cpp(特征提取)(四)、mapOptimization.cpp(建图优化)四、代码详解(mapOptimization 节点)(一)、入口函数 `int main(int argc, char** argv)`(二)、线程一:主处理线程1. `class mapOptimization : public ParamServer`2. `mapOptimization()` 构造函数3. 前提:`void allocateMemory()`4. `void laserCloudInfoHandler(const lio_sam::cloud_infoConstPtr msgIn)`4.1、`void updateInitialGuess()`4.2、`void extractSurroundingKeyFrames()`4.2.1、`void extractNearby()`4.2.2、`void extractCloud(pcl::PointCloudPointType::Ptr cloudToExtract)`4.3、`void downsampleCurrentScan()`4.4、`void scan2MapOptimization()`4.4.1、`void cornerOptimization()`4.4.2、`void surfOptimization()`4.4.3、`void combineOptimizationCoeffs()`4.4.4、`bool LMOptimization(int iterCount)`4.4.5、`void transformUpdate()`4.4.5.1、`float constraintTransformation(float value, float limit)`4.5、`void saveKeyFramesAndFactor()`4.5.1、`bool saveFrame()`4.5.2、`void addOdomFactor()`4.5.3、`void addGPSFactor()`4.5.4、`void addLoopFactor()`4.5.5、`void updatePath(const PointTypePose pose_in)`4.6、`void correctPoses()`(三)、线程二:回环检测线程5. `void loopClosureThread()`5.1、`void performLoopClosure()`5.1.1、`bool detectLoopClosureExternal(int *latestID, int *closestID)`5.1.2、`bool detectLoopClosureDistance(int *latestID, int *closestID)`5.1.3、`void loopFindNearKeyframes(pcl::PointCloudPointType::Ptr nearKeyframes, const int key, const int searchNum)`概述本文是 LIO-SAM 的学习笔记,内容涵盖语义定位因子、地图文件说明、四大核心节点的订阅/发布关系,以及mapOptimization.cpp节点的详细代码解读(包含主线程和回环检测线程)。一、语义定位因子(一)、出处在 LIO-SAM 之后发布了 LVI-SAM——在 LIO-SAM 基础上又加入了语义定位因子。(二)、GPT 解读"语义定位因子"通常指在机器人技术和自动驾驶领域中使用的一种概念,用于帮助确定车辆或机器人当前位置的方法之一。它指的是利用周围环境的语义信息(比如地标、道路标识、建筑物等)来辅助进行定位的一种技术。语义定位因子可以包括以下内容:地标识别:通过识别特定的地标或场景特征来确定位置,这些地标可以是符号、标志、建筑物或其他显著的可识别特征。环境语义信息:利用周围环境的语义信息,比如道路布局、交通标志、建筑物轮廓等,来辅助定位。图像或传感器数据的分析:通过分析摄像头、激光雷达等传感器获取的数据,识别环境中的语义信息,从而确定当前位置。语义定位因子的引入可以提高定位的准确性和鲁棒性,尤其是在 GPS 信号不佳或者缺少精确定位信息的情况下。通过结合传统的定位技术(比如惯性导航、全球定位系统等)和环境语义