Code Monkey home page Code Monkey logo

lio-sam-detailednote's Introduction

LIO-SAM-DetailedNote

LIO-SAM源码详细注释,3D SLAM融合激光、IMU、GPS,因子图优化。

LIO-SAM的代码十分轻量,只有四个cpp文件,很值得读一读呢。

关于LIO-SAM的论文解读,网上已经有很多文章啦,同系列的LOAM、A-LOAM、LEGO-LOAM等,在网上都可以找到相关的解读文章。所以本文旨在对源代码进行阅读学习,积累一些工程上的经验。这里记录下来,希望可以帮到有需要的同学,如有错误的地方,请您批评指正。

:) 如果对您有帮助,帮我点个star呦~

目录(知乎)

整体流程

代码结构图 Image

因子图 Image

1、激光运动畸变校正。利用当前帧起止时刻之间的IMU数据、IMU里程计数据计算预积分,得到每一时刻的激光点位姿,从而变换到初始时刻激光点坐标系下,实现校正。

2、提取特征。对经过运动畸变校正之后的当前帧激光点云,计算每个点的曲率,进而提取角点、平面点特征。

3、scan-to-map匹配。提取布局关键帧map的特征点,与当前帧特征点执行scan-to-map匹配,更新当前帧的位姿。

4、因子图优化。添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿。

5、闭环检测。在历史关键帧中找候选闭环匹配帧,执行scan-to-map匹配,得到位姿变换,构建闭环因子,加入到因子图中一并优化。

一、激光运动畸变校正(ImageProjection)

功能简介

1.利用当前激光帧起止时刻间的imu数据计算旋转增量,IMU里程计数据(来自ImuPreintegration)计算平移增量,进而对该帧激光每一时刻的激光点进行运动畸变校正(利用相对于激光帧起始时刻的位姿增量,变换当前激光点到起始时刻激光点的坐标系下,实现校正);

2.同时用IMU数据的姿态角(RPY,roll、pitch、yaw)、IMU里程计数据的的位姿,对当前帧激光位姿进行粗略初始化。

订阅

1.订阅原始IMU数据;

2.订阅IMU里程计数据,来自ImuPreintegration,表示每一时刻对应的位姿;

3.订阅原始激光点云数据。

发布

1.发布当前帧激光运动畸变校正之后的有效点云,用于rviz展示;

2.发布当前帧激光运动畸变校正之后的点云信息,包括点云数据、初始位姿、姿态角、有效点云数据等,发布给FeatureExtraction进行特征提取。

二、点云特征提取(FeatureExtraction)

功能简介

对经过运动畸变校正之后的当前帧激光点云,计算每个点的曲率,进而提取角点、平面点(用曲率的大小进行判定)。

订阅

订阅当前激光帧运动畸变校正后的点云信息,来自ImageProjection。

发布

1.发布当前激光帧提取特征之后的点云信息,包括的历史数据有:运动畸变校正,点云数据,初始位姿,姿态角,有效点云数据,角点点云,平面点点云等,发布给MapOptimization;

2.发布当前激光帧提取的角点点云,用于rviz展示;

3.发布当前激光帧提取的平面点点云,用于rviz展示。

三、IMU预积分(ImuPreintegration)

1.TransformFusion类

功能简介

主要功能是订阅激光里程计(来自MapOptimization)和IMU里程计,根据前一时刻激光里程计,和该时刻到当前时刻的IMU里程计变换增量,计算当前时刻IMU里程计;rviz展示IMU里程计轨迹(局部)。

订阅

1.订阅激光里程计,来自MapOptimization;

2.订阅imu里程计,来自ImuPreintegration。

发布

1.发布IMU里程计,用于rviz展示;

2.发布IMU里程计轨迹,仅展示最近一帧激光里程计时刻到当前时刻之间的轨迹。

2. ImuPreintegration类

功能简介

1.用激光里程计,两帧激光里程计之间的IMU预计分量构建因子图,优化当前帧的状态(包括位姿、速度、偏置);

2.以优化后的状态为基础,施加IMU预计分量,得到每一时刻的IMU里程计。

订阅

1.订阅IMU原始数据,以因子图优化后的激光里程计为基础,施加两帧之间的IMU预计分量,预测每一时刻(IMU频率)的IMU里程计;

2.订阅激光里程计(来自MapOptimization),用两帧之间的IMU预计分量构建因子图,优化当前帧位姿(这个位姿仅用于更新每时刻的IMU里程计,以及下一次因子图优化)。

发布

1.发布imu里程计;

四、因子图优化(MapOptimization)

功能简介

1.scan-to-map匹配:提取当前激光帧特征点(角点、平面点),局部关键帧map的特征点,执行scan-to-map迭代优化,更新当前帧位姿;

2.关键帧因子图优化:关键帧加入因子图,添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿;

3.闭环检测:在历史关键帧中找距离相近,时间相隔较远的帧设为匹配帧,匹配帧周围提取局部关键帧map,同样执行scan-to-map匹配,得到位姿变换,构建闭环因子数据,加入因子图优化。

订阅

1.订阅当前激光帧点云信息,来自FeatureExtraction;

2.订阅GPS里程计;

3.订阅来自外部闭环检测程序提供的闭环数据,本程序没有提供,这里实际没用上。

发布

1.发布历史关键帧里程计;

2.发布局部关键帧map的特征点云;

3.发布激光里程计,rviz中表现为坐标轴;

4.发布激光里程计;

5.发布激光里程计路径,rviz中表现为载体的运行轨迹;

6.发布地图保存服务;

7.发布闭环匹配局部关键帧map;

8.发布当前关键帧经过闭环优化后的位姿变换之后的特征点云;

9.发布闭环边,rviz中表现为闭环帧之间的连线;

10.发布局部map的降采样平面点集合;

11.发布历史帧(累加的)的角点、平面点降采样集合;

12.发布当前帧原始点云配准之后的点云;

如有错误请您批评指正,希望内容对您有帮助,更多细节可以查看代码注释~

lio-sam-detailednote's People

Contributors

smilefacehh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

lio-sam-detailednote's Issues

你好,看了你的文章对我帮助很大,但是存在一些小小的瑕疵

在mapOptmization.cpp的extractNearby()函数中,对关键帧进行降采样之后,原lio-sam是还有一段代码的,如下:
for(auto& pt : surroundingKeyPosesDS->points) { kdtreeSurroundingKeyPoses->nearestKSearch(pt, 1, pointSearchInd, pointSearchSqDis); pt.intensity = cloudKeyPoses3D->points[pointSearchInd[0]].intensity; }

dataset

同学,你有lio sam的官方数据集吗?

park.bag

Where can I download this dataset?

q

/usr/bin/ld: 找不到 -lBoost::timer
这个怎么解决?

坐标系变换

在lio-sam中,velodyne和imu的坐标系都是怎么定义的呢?
params.yaml文件中,extrinsicRot、extrinsicRPY分别是指什么呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.