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

SLAM 算法综述

LiDAR SLAM
其主要思想是通过两个算法:一个高频激光里程计进行低精度的运动估计,即使用激光雷达做里程计计算两次扫描之间的位姿变换;另一个是执行低频但是高精度的建图与校正里程计,利用多次扫描的结果构建地图,细化位姿轨迹。

LOAM
论文:Lidar Odometry and Mapping in Real-time(RSS2014) Ji Zhang

LOAM使用了作者定义的特征点提取和匹配方法,主要去边角点和平面点。LOAM use a new defined feature system (corner and flat point), for the detail see its article.
LOAM假设每一次激光扫描过程中是匀速运动工程应用时要注意实际载体运动特性),并且用这个假设修正激光雷达数据的运动扭曲问题。在VLOAM中则是更进一步,使用视觉的里程计估计每一个扫描数据的运动。LOAM suppose linear motion within the scan swap (VLOAM further uses visual odometry to estimate it), and undistort the lidar points.
LOAM也有一个低频率调用的全局优化线程。

LOAM一文中提出,可以通过IMU进行辅助。所谓“辅助”就是在激光雷达两次扫描之间,利用IMU得到较为准确的变化轨迹,从而进行点云畸变的去除,从而不需要靠上次扫描获得的运动参数插值对这次的畸变进行去除,能够提升精度。但IMU的数据并没有参与到优化当中,所以IMU在LOAM算法中只起到了辅助作用

A-LOAM
代码:https://github.com/HKUST-Aerial-Robotics/A-LOAM,香港科技大学秦通博士

A-LOAM代码通过ROS运行。在LOAM原有代码基础上,使用Ceres-solver和Eigen库对其进行重构和优化,在保持原有算法原理的基础上,使其可读性大大增加。
主要区别:
1.LOAM中提供了使用IMU信息修正的接口, A-LOAM中省略了这一块。
2.A-LOAM中缺少了对提取到的特征点的筛选过程,具体可以参见LOAM的代码部分(对一些不好的边角点做了筛选)。
3.LOAM中作者解析地求出了雅各比的表达式(其中使用了一些小技巧统一了不同特征点的残差函数的导数表达),A-LOAM则是简单地使用了ceres提供的自动求导工具(这样可以节省开发的时间,得到了也是准确的解,但是运算时间会稍稍长些,具体可以参见ceres的官方文档)。

LeGO-LOAM
LeGO-LOAM:LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain .Tixiao Shan and B. Englot,
IEEE/RSJ International Conference on Intelligent Robots and Systems, 2018.

LeGO-LOAM 是Tixiao Shan在原有LOAM基础上,做了一些改进包括:1、对前端里程计的前量化改造,提取地面点更适配水平安装的LiDAR; 2、使用SLAM中的Keyframe概念以及回环检测位姿图优化的方式对后端进行重构。

从文章名称,可以看出,LeGO-LOAM相对于LOAM的提升主要在于轻量级和地面优化。接下来,我将从论文的整体框架入手,详解介绍LeGO-LOAM和LOAM的区别和联系。

在这里插入图片描述
核心四个部分:分割,特征提取,雷达里程计,雷达建图。

分割模块通过对一帧的点云重投影到图像中,进行地面分割,非地面点被分割出来;
特征提取模块基于分割后的点使用和LOAM一样的方法提取边缘点和平面点;
雷达里程计模块基于提取的特征点构建约束关系,使用两次LM优化,得到姿态变换矩阵;
雷达建图模块将得到的特征点进一步处理,构建 的约束关系,构建全局地图。

在这里插入图片描述
GTSAM

GTSAM(Georgia Tech Smoothing and Mapping)是基于因子图的C++库,它由佐治亚理工学院的教授和学生们创造。它可以解决slam和sfm的问题,当然它也可以解决简单或者更加复杂的估计问题。
因子图是一种图模型,非常适合于复杂的估计问题的建模,比如SLAM或者是SFM( Structure from Motion)。

因子图的三个基本组成部分:
因子图(factor graph):它属于一个二分图,由因子和变量连接而成。
变量(variables):估计问题中的未知随机变量。
因子(factors):非线性因子表示变量之间的约束,在slam中,可能为landmark或者odometry的读数。

LIO-Mapping
LIO-Mapping:Tightly Coupled 3D Lidar Inertial Odometry and Mapping,H. Ye, Y. Chen, and M. Liu,IEEE International Conference on Robotics and Automation, pp. 3144-3150, 2019.

主要是借鉴LOAM和VINS-Mono的思想进行联合状态估计,工程层面和VINS-Mono一样,只不过是前端视觉部分换成了Lidar的前端进行特征关联,这是第一篇开源的Lidar-IMU紧耦合SLAM算法。

见《https://blog.csdn.net/weixin_44580210/article/details/120541054》

LIO-SAM
LIO-SAM: *Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping.Tixiao Shan, Brendan Englot, Drew Meyers, Wei Wang, Carlo Ratti, and Daniela Rus.*2020

LIO-SAM 是Tixiao Shan在LeGO-LOAM的扩展,添加了IMU预积分因子和GPS因子:前端使用紧耦合的IMU融合方式,替代原有的帧间里程计,使得前端更轻量;后端沿用LeGO-LOAM,在此基础上融入了GPS观测。同时前端后端相互耦合,提高系统精度。

LIO-SAM中的扫描匹配优化部分代码是直接套用LOAM,该部分代码的最大特点是没有利用任何开源的优化库(ceres-solver, g2o, gtsam…)进行残差方程的优化,而是只基于Eigen库构造了高斯牛顿迭代算法对残差方程进行优化,获得最小二乘解.但是,为了提升对后端残差方程优化的理解,抛弃开源优化库只利用Eigen库构造优化过程是一个非常推崇的做法.

该算法是一个紧耦合的雷达惯导里程计(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM库中的方法。提出了一个利用GT-SAM的紧耦合激光雷达惯导里程计的框架。实现了高精度、实时的移动机器人的轨迹估计和建图。

框架的构成:
通过相对观测(两帧间的估计)及绝对观测(GPS),还包括回环检测,构成因子图。

这个框架必须要有激光雷达和IMU。可以没有回环和GPS。

IMU的作用:
用IMU的数据对激光雷达点云作畸变矫正为激光雷达里程计的优化提供一个初值

系统对IMU的作用:
获得的雷达里程计会用来估计IMU的零偏(bias)

点云匹配建图方式:
为了保障性能和实时,并不是将激光雷达一帧数据和全局地图进行匹配,而是和经过边缘化的历史地图进行匹配;这种当前帧和局部地图配置而不是全局地图的做法,可以显著提高系统的实时性。

局部地图构成:
通过选取关键帧的方式,利用滑窗的方法,将当前的关键帧和历史尺度和大小一致的子关键帧集合配准。

cartographer
谷歌于2016年开源了Cartographer的SLAM库。Cartographer可以使用2D或3D激光雷达来进行SLAM(同时定位与地图构建),用Grid(2D/3D)的形式建地图;局部匹配直接建模成一个非线性优化问题,通过IMU(惯性测量单元陀螺仪)获得比较靠谱的初值,再用Ceres库进行求解;后端用Graph来优化,用分支定界算法来加速;2D和3D的问题统一在一个框架下解决。

cartographer主要解决室内问题,LOAM室内外都可以,但是没有回环检测。Cartographer的3D部分,更像是2D的扩展:即用2D的思路去做3D的事情。而LOAM则主要解决3D问题,其核心思路难以解决2D问题。

Cartographer基本上实现了低成本雷达,低计算资源消耗,实时优化,精度尚可。

相关文章:

SLAM 算法综述

LiDAR SLAM 其主要思想是通过两个算法:一个高频激光里程计进行低精度的运动估计,即使用激光雷达做里程计计算两次扫描之间的位姿变换;另一个是执行低频但是高精度的建图与校正里程计,利用多次扫描的结果构建地图,细化位…...

搭建Hadoop3.x完全分布式集群

零、资源准备 虚拟机相关: VMware workstation 16:虚拟机 > vmware_177981.zipCentOS Stream 9:虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso Hadoop相关 jdk1.8:JDK > jdk-8u261-linux-x64.tar.gzHadoop 3.3.6&am…...

linux常用命令(二)

目录 前言 常用命令 1.ls命令 2. cd命令 3.pwd命令 4.mkdir 命令 5. rmdir 命令 6.rm 命令 7.cp命令 8.mv命令 9.touch命令 10.cat命令 11.more命令 12.less命令 13.head命令 14.tail命令 15.tail命令 16.find命令 17.tar命令 18.gzip命令 19.gunzip命令 …...

【Vue】Request模块 - axios 封装Vuex的持久化存储

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳中求进,晒太阳 Request模块 - axios 封装 使用axios来请求后端接口,一般会对axios进行一些配置(比如配置基础地址,请求响应拦截器…...

【2024第一期CANN训练营】4、AscendCL推理应用开发

文章目录 【2024第一期CANN训练营】4、AscendCL推理应用开发1. 创建代码目录2. 构建模型2.1 下载原始模型文件2.2 使用ATC工具转换模型2.3 注意事项 3. 模型加载3.1 示例代码 4. 模型执行4.1 获取模型描述信息4.2 准备输入/输出数据结构4.3 执行模型推理4.4 释放内存和数据类型…...

Rust 构建开源 Pingora 框架可以与nginx媲美

一、概述 Cloudflare 为何弃用 Nginx,选择使用 Rust 重新构建新的代理 Pingora 框架。Cloudflare 成立于2010年,是一家领先的云服务提供商,专注于内容分发网络(CDN)和分布式域名解析。它提供一系列安全和性能优化服务…...

MediaCodec源码分析 ACodec状态详解

前言 本文分析ACodec状态机,ACodec是MediaCodec的底层实现,在MediaCodec命令下切换不同状态进行编解码,基于7.0代码。 ACodec状态介绍 UninitializedState:未初始化状态。 在业务层调用MediaCodec. createByCodecName 完成后切换到LoadedState。 LoadedState:表示解码器…...

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考:ES的安装使用(windows版) elasticsearch的下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…...

如何快速搭建物联网工业云平台

随着物联网技术的快速发展,物联网工业云平台已经成为推动工业领域数字化转型的重要引擎。合沃作为专业的物联网云服务提供商,致力于为企业提供高效、可靠的物联网工业云平台解决方案。本文将深入探讨物联网工业云平台的功能、解决行业痛点的能力以及如何…...

Spring Data访问Elasticsearch----Elasticsearch对象映射

Spring Data访问Elasticsearch----Elasticsearch对象映射 一、元模型(Meta Model)对象映射1.1 映射注解概述1.1.1 控制向Elasticsearch写入和从其读取哪些属性1.1.2 日期格式映射1.1.3 Range类型1.1.4 映射的字段名1.1.5 Non-field-backed属性1.1.6 其他属性注解 1.2 映射规则1…...

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长,格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…...

Python入门教程(一)|基本语法概述

目录 1. 注释 2. 变量和数据类型 3. 控制流 4. 函数 5. 类与对象 6. 异常处理 7. 模块和包 8. 文件操作 1. 注释 在Python中,单行注释以#开始,多行注释使用三个引号 """ 或 。 # 这是单行注释""" 这是 多行 注释…...

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…...

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天,其实远远不止,前前后后,从资料搜集到最后整理成文,有近一个月了,大家看在整理不易的份上,给点个赞吧,不要光顾着收藏呀! 国内网站 AIGC 导航 https://www.aigc.cn 网…...

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息: 题目链接: 一维前缀和思路:求前缀和数组,sum dp[r] …...

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单,但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始,ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…...

​​SQLiteC/C++接口详细介绍之sqlite3类(十)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(九) 下一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十一) 30.sqlite3_enable_load_extension&#x…...

Vue中nextTick一文详解

什么是 nextTick? 在 Vue 中,当我们修改数据时,Vue 会自动更新视图。但是,由于 JavaScript 的事件循环机制,我们无法立即得知视图更新完成的时机。这时候,我们就需要使用 nextTick 来获取视图更新完成后的…...

爱奇艺 CTR 场景下的 GPU 推理性能优化

01 背景介绍 GPU 目前大量应用在了爱奇艺深度学习平台上。GPU 拥有成百上千个处理核心,能够并行的执行大量指令,非常适合用来做深度学习相关的计算。在 CV(计算机视觉),NLP(自然语言处理)的模型…...

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大,且…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...