当前位置: 首页 > news >正文

LIO-SAM框架理解

LIO-SAM系统为四大线程的运行:

1.IMU预积分线程(IMU Pre-integration)

2.点云去畸变线程(Point Cloud Deskewing)

3.前端里程计线程(Odometry)

4.后端优化线程(Mapping / Factor Graph Optimization)

但是我考虑到与其他slam系统(如cartographer  vins mono等)做对比,还是按照初始化,前端,后端的结构来总结分析。

一 、初始化 

 LIO-SAM初始化阶段跟orbslam3类似,跟cartographer不一样。前者需要先有视觉/激光里程计,后面在与imu做松耦合的初始化。而cartographer的imu初始化则是隐式的,独立的,并不需要借助激光里程计,包括bias也是后续做帧间位姿估计的时候再独立优化。

阶段ORB-SLAM3LIO-SAM
初始传感器独立运行视觉单独跑一段,先估 pose激光 scan-matching 独立运行,先建地图
IMU bias 初始化方式用视觉位姿轨迹 + IMU 预积分对齐求 bias用激光位姿轨迹 + IMU 预积分对齐求 bias
是否联合优化初始化❌ 否,初始化阶段没有联合优化❌ 否
是否估计重力方向✅ 是(通过对齐)✅ 是
是否估计速度✅ 是✅ 是(一般设为 0)
后端优化是否紧耦合✅ 是(IMU + 视觉 + map point 进入因子图)✅ 是(IMU + scan to map 进入 GTSAM)

 

特性LIO-SAMCartographer
初始化是否显式✅ 显式初始化❌ 没有显式初始化步骤
IMU bias 估计方式显式估计初始 bias初期设为 0,靠滤波器逐渐估
是否构建因子图✅ GTSAM 因子图❌ 不建因子图,使用滤波器
是否预积分✅ 使用预积分(GTSAM IMU 因子)❌ 使用实时积分,无预积分
是否使用紧耦合优化✅ 后端因子图紧耦合❌ 前端滤波器松耦合为主
地图维护方式保存关键帧点云 + 后端回环优化Submap + sparse pose graph

 

 二 、前端

 

一、激光点云预处理(Feature Extraction)

位于模块 imageProjection.cpp

  1. 对原始点云进行畸变补偿(用 IMU 提供的角速度和线速度补偿旋转和运动)

  2. 将点云按扫描线投影到 range image

  3. 提取特征点:

    • 边缘特征(角点):曲率大的点

    • 平面特征(面点):曲率小的点

  4. 降采样、过滤异常点

📌 输出:cornerCloudsurfaceCloud(当前帧的角点和平面点)


二、IMU 预积分预测(IMU Preintegration)

位于模块 imuPreintegration.cpp

  1. 将 IMU 数据进行预积分,构建当前帧到上一帧的初始运动估计(预测变换)

  2. 这一步用于:

    • 提供 scan-matching 的初值

    • 构建后端的 IMU 因子

📌 输出:预测位姿、速度、bias 状态等


三、激光里程计匹配:Scan-to-Map Matching

位于模块 mapOptimization.cpp 中的 laserOdometryHandler()

  1. 将当前帧的角点和平面点,与局部地图(由历史关键帧构建)进行匹配

  2. 优化目标是最小化:

    • 当前角点 → 局部地图边缘线 的距离

    • 当前面点 → 局部地图平面 的距离

  3. 优化器(Levenberg-Marquardt)迭代求解当前帧的位姿

📌 输出:当前帧精确位姿估计(T_w_curr)


四、关键帧选择与地图维护

  1. 每隔一定距离或角度,将当前帧设为关键帧

  2. 将关键帧点云(降采样后的)加入局部地图(kd-tree)

地图是由关键帧组成的滑动窗口点云集合,包括:

  • 边缘点地图(局部角点)

  • 面点地图(局部平面点)


五、前端数据输出

前端的最终输出是:

  • 当前帧的实时估计位姿(odom

  • 关键帧及其点云(传给后端)

  • 优化初值(预测来自 IMU)

 需要注意一个点,LIO-SAM的局部地图概念跟vins mono类似又不完全一样,LIO-SAM的局部地图只用于当前关键帧的scan to map,但是呢局部地图范围内是没有图优化的(vins mono是有的)。然后这两者的局部地图都不会影响到全局地图的优化,全局都是在优化一个位姿图。

然后cartographer和orbslam3的子图的概念更加接近,两者的子图都会融合到全局地图里面。不同的点是orbslam3的子图也是有做图优化的,而cartographer的子图仅仅是做scan matching后就确定位置了,后续只在全局地图优化那里再做优化。

 

三、后端

 

✅ 1. 构建因子图(Factor Graph)

后端使用 GTSAM 构建因子图,节点为关键帧状态,边为多种约束:

  • 每个关键帧的状态变量包括:

    • 位姿 Pose3

    • 速度 Vector3

    • IMU Bias imuBias::ConstantBias

✅ 2. 添加不同因子(Factors)

LIO-SAM 后端将三种信息来源转化为图中的因子(约束):

因子类型来自用途
IMU 因子ImuFactorIMU 预积分约束帧间运动
里程计因子BetweenFactor轮速/视觉提供额外约束(可选)
激光因子LidarFactorscan-to-map 匹配结果提供当前位置观测值
回环因子BetweenFactor回环检测提供闭环位姿差约束

 

✅ 3. 关键帧插入逻辑

  • 每当前端判断当前帧为关键帧,后端就将其作为节点插入因子图;

  • 同时添加 IMU 和激光因子;

  • IMU bias 也作为变量加入图中,并加入 BetweenFactor 维持连续性。


✅ 4. 增量优化(ISAM2)

LIO-SAM 使用 GTSAM 的 iSAM2(增量优化)

  • 每加入一个关键帧,调用 isam->update(graph, initialEstimate)

  • 优化后会输出当前关键帧集合的全局最优状态(Pose/Vel/Bias);

  • 增量优化非常快,适合实时建图。


✅ 5. 回环检测与闭环优化(Loop Closure)

  • 后端周期性检测是否存在回环:

    • 使用 scan context 或距离检查;

    • 若发现回环,执行 scan-to-map 匹配,计算相对位姿;

  • 将回环约束添加为 BetweenFactor 到因子图中;

  • 再次触发全局优化,校正历史轨迹和地图,消除漂移。


✅ 6. 状态更新与地图拼接

  • 优化后提取关键帧的全局位姿

  • 将关键帧点云根据优化后的姿态拼接为全局地图;

  • 发布 /lio_sam/mapping/map 话题或保存地图文件。


✅ 7. 维护滑动窗口

虽然 LIO-SAM 默认不做窗口限制,但可以根据内存或性能做裁剪,例如:

  • 只保留最近 N 帧在因子图中;

  • 或保留所有帧但限制局部地图范围。


前端输出:
 └─ 当前帧位姿 + IMU预积分 + 特征点云
           ↓
    【后端因子图模块】
 ┌────────────────────────────┐
 │ 1. 添加关键帧为图节点        │
 │ 2. 加入 IMU/Lidar/Loop 因子 │
 │ 3. 使用 GTSAM iSAM2 优化    │
 │ 4. 更新全局状态估计         │
 │ 5. 输出地图、轨迹等         │
 └────────────────────────────┘

✅ 总结表:后端关键操作一览

步骤名称作用使用的库
1接收关键帧数据获取初估位姿/预积分ROS
2构建因子图表示各类约束GTSAM
3添加IMU因子提供连续运动约束IMU预积分
4添加Lidar因子当前帧scan-to-map匹配结果前端输出
5添加回环因子闭环检测Scan Context
6优化得到最优轨迹与地图iSAM2
7发布地图与轨迹给其他模块使用ROS 发布器

 

📌 最终结果

  • 全局一致轨迹;

  • 去漂移地图(支持回环);

  • 可保存并复用


 

 

 liosam是用因子图,理论上也是图优化的一种。这里对比一下几个优化工具的区别。

特性GTSAMg2oCeres Solver
建模风格因子图(Factor Graph)图优化(顶点+边)自动求导非线性最小二乘
主要目标SLAM/BA/Smoothing,强调多传感器融合SLAM 中 pose-graph/BA泛化数值优化器
支持的优化算法批量优化 + iSAM/iSAM2(增量)Gauss-Newton、LMGN、LM、Dogleg、信赖域
增量式优化✅(iSAM2)❌(但可近似实现)
IMU预积分支持✅(强支持)手动实现可实现,但较复杂
地图点优化支持✅(支持BA)✅(经典支持)✅(多数BA系统使用)
自动求导✅(强)❌(需手写雅可比)✅(强)
接口风格类似 Probabilistic GraphC++ 图类封装类似 C++ 函数优化接口
用户负担中等(理解因子图模型)高(需手写雅可比等)低(非常通用,易上手)
适合谁?SLAM、滤波/图优化研究者图优化研究者、工业系统任意非线性优化用户

 

相关文章:

  • 鸿蒙OSUniApp 实现精美的用户登录和注册页面#三方框架 #Uniapp
  • html5+css3实现傅里叶变换的动态展示效果(仅供参考)
  • Pytorch的Dataloader使用详解
  • 【USRP】在linux下安装python API调用
  • Oracle 中的虚拟列Virtual Columns和PostgreSQL Generated Columns生成列
  • 一分钟了解大语言模型(LLMs)
  • 基于ssm+mysql的高校设备管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • 音频分类的学习
  • De-biased Attention Supervision for Text Classifcation with Causality
  • 学习51单片机01(安装开发环境)
  • 基于Matlab的非线性Newmark法用于计算结构动力响应
  • STM32 之网口资源
  • 当 DeepSeek 遇见区块链:一场颠覆式的应用革命
  • 学习黑客蓝牙技术详解
  • SAP Fiori Elements Object Page
  • rocketmq 拉取消息
  • AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
  • 输入一个正整数,将其各位数字倒序输出(如输入123,输出321)
  • 【行为型之模板方法模式】游戏开发实战——Unity标准化流程与可扩展架构的核心实现
  • Prometheus 的介绍与部署(入门)
  • 今年前4个月上海对拉美国家进出口总值增长2%
  • 台行政机构网站删除“汉人”改为“其余人口”,国台办回应
  • 筑牢安全防线、提升应急避难能力水平,5项国家标准发布
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元
  • 威尼斯建筑双年展总策划:山的另一边有什么在等着我们
  • 时隔4年多,这一次普京和泽连斯基能见面吗?