LIO-SAM源码解析(二):代码结构

news2024/11/15 19:53:09

1. 代码整体框架

首先看看工程目录结构,主要有五个文件,分别是utility.h,featureExtraction.cpp, imageProjection.cpp,imuPreintegration.cpp,mapOptmization.cpp

LIO-SAM/
  config/
    params.yaml             # 参数配置
  include/
    utility.h               # 读取参数,提供一些工具方法
  launch/
    run.launch              # 启动文件
  src/
    featureExtraction.cpp   # 点云计算曲率,提取特征(角点、平面点)
    imageProjection.cpp     # 激光点云运动畸变校正
    imuPreintegration.cpp   # imu预积分因子图优化,计算每时刻imu里程计
    mapOptmization.cpp      # scan-to-map匹配,因子图优化,闭环优化

对照LIO-SAM作者给出的下面这张系统架构图,我们首先获取一个整体上的印象。

LIO-SAM代码结构,数据流向图

 

首先对于一个SLAM系统,后端优化是一个核心模块,有较早的卡尔曼滤波器、现在流行的图优化、因子图优化。LIO-SAM则采用因子图优化方法,包含四种因子。

LIO-SAM因子:IMU预积分因子,激光里程计因子,GPS因子,闭环因子。

下图是LIO-SAM的因子图结构,变量节点是关键帧。相邻的关键帧之间,通过IMU数据计算预积分,获得位姿变换,构建IMU预积分因子。每个关键帧还有对应的GPS数据参与校正。如果有闭环出现,闭环帧之间可以构建约束。关键帧之间有若干普通帧,这些帧不参与图优化,但是会执行scan-to-map的配准,优化每帧位姿。

LIO-SAM因子图

2. 整体流程

  • 激光运动畸变校正。利用当前帧起止时刻之间的IMU数据、IMU里程计数据计算预积分,得到每一时刻的激光点位姿,从而变换到初始时刻激光点坐标系下,实现校正。
  • 提取特征。对经过运动畸变校正之后的当前帧激光点云,计算每个点的曲率,进而提取角点、平面点特征。
  • scan-to-map匹配。提取局部关键帧map的特征点,与当前帧特征点执行scan-to-map匹配,更新当前帧的位姿。
  • 因子图优化。添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿。
  • 闭环检测。在历史关键帧中找候选闭环匹配帧,执行scan-to-map匹配,得到位姿变换,构建闭环因子,加入到因子图中一并优化。

下面在整体上给出这四个文件对应模块的功能,以及模块之间数据的发布-订阅关系。

2.1. ImageProjection 激光运动畸变校正

2.1.1. 功能简介

  • 利用当前激光帧起止时刻间的imu数据计算旋转增量,IMU里程计数据(来自ImuPreintegration)计算平移增量,进而对该帧激光每一时刻的激光点进行运动畸变校正(利用相对于激光帧起始时刻的位姿增量,变换当前激光点到起始时刻激光点的坐标系下,实现校正);
  • 同时用IMU数据的姿态角(RPY,roll、pitch、yaw)、IMU里程计数据的的位姿,对当前帧激光位姿进行粗略初始化。

2.1.2. 订阅

  • 订阅原始IMU数据;
  • 订阅IMU里程计数据,来自ImuPreintegration,表示每一时刻对应的位姿;
  • 订阅原始激光点云数据。

2.1.3. 发布

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

2.2. FeatureExtraction 点云特征提取

2.2.1. 功能简介

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

2.2.2. 订阅

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

2.2.3. 发布

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

2.3. ImuPreintegration IMU预积分

2.3.1. TransformFusion类

  • 功能简介

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

  • 订阅

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

订阅imu里程计,来自ImuPreintegration。

  • 发布

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

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

2.3.2. ImuPreintegration类

  • 功能简介

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

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

  • 订阅

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

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

  • 发布

发布imu里程计;

2.4. MapOptimization 因子图优化

2.4.1. 功能简介

  • scan-to-map匹配:提取当前激光帧特征点(角点、平面点),局部关键帧map的特征点,执行scan-to-map迭代优化,更新当前帧位姿;
  • 关键帧因子图优化:关键帧加入因子图,添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿;
  • 闭环检测:在历史关键帧中找距离相近,时间相隔较远的帧设为匹配帧,匹配帧周围提取局部关键帧map,同样执行scan-to-map匹配,得到位姿变换,构建闭环因子数据,加入因子图优化。

2.4.2. 订阅

  • 订阅当前激光帧点云信息,来自FeatureExtraction;
  • 订阅GPS里程计;
  • 订阅来自外部闭环检测程序提供的闭环数据,本程序没有提供,这里实际没用上。

2.4.3. 发布

  • 发布历史关键帧里程计;
  • 发布局部关键帧map的特征点云;
  • 发布激光里程计,rviz中表现为坐标轴;
  • 发布激光里程计;
  • 发布激光里程计路径,rviz中表现为载体的运行轨迹;
  • 发布地图保存服务;
  • 发布闭环匹配局部关键帧map;
  • 发布当前关键帧经过闭环优化后的位姿变换之后的特征点云;
  • 发布闭环边,rviz中表现为闭环帧之间的连线;
  • 发布局部map的降采样平面点集合;
  • 发布历史帧(累加的)的角点、平面点降采样集合;
  • 发布当前帧原始点云配准之后的点云;

参考文献

LIO-SAM源码解析:准备篇 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何借助低代码开发平台 YonBuilder 填补应用开发 “产能缺口”?

低代码平台本身是各类模型、引擎的重新组合,目的是为了填补应用开发需求远超开发者产能这一缺口,那如何理解填补应用开发需求和开发者产能的缺口? 完成一个企业级的应用复杂度随着技术的进步、需求的细化、业务要求的变化并不是逐渐降低而是…

原创|对接三方服务商回调鉴权的程序代码设计

文章目录一、背景二、详细设计1、UML设计2、程序设计2.1、AuthenticateActionEnum2.2、AuthenticateDispatcher2.3、BaseAuthenticateContext<Request>2.3.1、ActivityStatusChangeAuthenticateContext2.3.2、VodEventNotifyAuthenticateContext2.4、AbstractAuthenticat…

【Python+Appium】自动化测试(十一)location与size获取元素坐标

目录 前言 一&#xff0c;获取元素坐标的方法 1&#xff0c;size获取元素的宽、高 2&#xff0c;location获取元素左上角坐标 3&#xff0c;由此可以计算出元素其他的坐标 二&#xff0c;使用场景 结语 前言 appium做app自动化测试过程中&#xff0c;有时需要获取控件元…

git clean 命令详解

1. git clean 介绍 2. git clean 使用 3. clean 和 reset 命令 1. git clean 介绍 git clean 命令用于删除工作目录中没有被 tracked 的文件 这个命令很多人都不知道&#xff0c;也不去用它&#xff0c;而是通过手动去删除这些文件 这个命令一定要慎用&#xff0c;当你对这…

智源社区AI周刊No.108:Meta发布玩外交游戏的Cicero,登Science;Neuralink实现猴子意念打字...

汇聚每周AI热点&#xff0c;不错过重要资讯&#xff01;欢迎扫码&#xff0c;关注并订阅智源社区AI周刊。Meta发布外交谈判策略系统Cicero&#xff1a;模拟人类参与战略决策&#xff0c;已登《Science》期刊近日&#xff0c;Meta发布人工智能系统Cicero&#xff0c;该系统结合神…

【云原生】k8s 管理平台 rancher

文章目录一、概述二、Rancher 架构三、安装 Rancher1&#xff09;安装Helm2&#xff09;安装ingress-controller3&#xff09;为 Rancher 创建命名空间4&#xff09;选择 SSL 配置5&#xff09;安装 cert-manager6&#xff09;通过 Helm 安装 Rancher2&#xff09;添加 Helm Ch…

电子签名-为你的数据签字画押

博主&#xff1a;爱码叔 个人博客站点&#xff1a; icodebook 公众号&#xff1a;漫话软件设计 专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上&#xff0c;欢迎大家关注访问&#xff01; 更多密…

[附源码]Python计算机毕业设计SSM绝味鸭脖连锁店信息系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2023年天津天狮学院专升本市场营销专业《管理学》考试大纲

2023天津天狮学院高职升本科市场营销专业入学考试《管理学》考试大纲一、考试性质 《管理学》专业课程考试是天津天狮学院市场营销专业高职升本入学考试的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《管理学》考试大纲的编…

xcode登陆appleid报错:连接appleid服务器时出错

问题现象&#xff1a; xcode登陆appleid时一直报错&#xff1a;连接appleid服务器时出错 更换连接的wifi也一样报错&#xff0c;怀疑是因为Charles代理导致 解决办法&#xff1a; 网络连接 → 高级 → 代理 → 去掉 勾选【网页代理(HTTP)】

自动化之路:telnet的自动登录脚本

前言 为了测试telnet&#xff0c;首先&#xff0c;要保证系统已经安装了telnet&#xff0c;并且还得有一个端口能用,就是1-65536那个PORT。 一 搭建telenet环境并测试 1 首先查看telnet运行状态&#xff1a; lkmaoubuntu:~$ netstat -a | grep telnet lkmaoubuntu:~$ 输出为…

Linux 文本处理命令 - chmod

chmod命令&#xff1a;修改文件或目录的权限 chmod命令使用数字修改文件权限 Linux 系统中&#xff0c;文件的基本权限由 9 个字符组成&#xff0c;以 rwxrw-r-x 为例&#xff0c;我们可以使用数字来代表各个权限&#xff0c;各个权限与数字的对应关系如下&#xff1a; r --…

【c/c++算法】曼哈顿算法简单运用

✨曼哈顿算法&#x1f996;1.曼哈顿距离算法&#xff1a;&#x1f422;2.例题&#xff1a;打印菱形曼哈顿算法讲解&#xff1a;&#x1f995;3.曼哈顿算法例题解释&#xff1a;&#x1f996;1.曼哈顿距离算法&#xff1a; 我们很早以前就学过了两点间距离公式&#xff0c;欧式…

vue纯手写思维导图,拒绝插件(代码cv即用)

vue纯手写思维导图&#xff0c;拒绝插件(代码cv即用) 已完成功能点&#xff1a;折叠、放大、缩小、移动 后续增加功能点&#xff1a;添加、删除 先看结果&#xff1a; 有这么个需求&#xff0c;按照层级关系&#xff0c;把表格放在思维导图上&#xff0c;我第一时间想到用插件…

【Matplotlib绘制图像大全】(十六):Matplotlib绘制虚线折线图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

三翼鸟,用两年开启下一个十年

这段时间以来&#xff0c;我和亲朋好友的居家生活时间都增加了&#xff0c;以前一直存在但被忽视的不便体验&#xff0c;也开始凸显出来。比如在家就餐频次高了&#xff0c;厨房小白会为不会做饭而苦恼&#xff1b;智能设备的很多功能&#xff0c;依然需要手动操作……这些琐碎…

【大数据入门核心技术-Zookeeper】(二)ZAB协议介绍

目录 一、什么是Zab协议 二、Zab协议的4个阶段 1、选举阶段(Leader Election) 2、发现阶段(Discovery) 3、同步阶段(Synchronization) 4、广播阶段(Broadcase) 一、什么是Zab协议 ZAB协议&#xff0c;全称 Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议…

Keras文本和序列(三)

本篇涉及的内容 如何对文本分词 什么是词嵌入&#xff0c;如何使用词嵌入 什么是循环网络&#xff0c;如何使用循环网络 如何堆叠 RNN 层和使用双向 RNN&#xff0c;以构建更加强大的序列处理模型 如何使用一维卷积神经网络来处理序列 如何结合一维卷积神经网络和 RNN 来处…

焱融全闪系列科普| 为什么 SSD 需要 NVMe?

NVMe 的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口&#xff0c;接口协议为 AHCI&#xff0c;是 Intel 联合多家公司研发的系统接口标准。AHCI 最大队列深度为 32&#xff0c;即主机最多可以发 32 条命令给 HDD 或 SSD 执行&…

【观察】软通动力:以数智化技术创新,赋能每一个降碳场景

毫无疑问&#xff0c;“碳达峰、碳中和”已成为当今世界最为紧迫的使命&#xff0c;目前全球已有110多个国家相继承诺“碳中和”目标。同样&#xff0c;2020年9月&#xff0c;中国也提出了到2030年实现“碳达峰”&#xff0c;并努力争取2060年前实现“碳中和”的“双碳”目标&a…