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基本上实现了低成本雷达,低计算资源消耗,实时优化,精度尚可。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

确保云原生部署中的网络安全

数字环境正在以惊人的速度发展,组织正在迅速采用云原生部署和现代化使用微服务和容器构建的应用程序(通常运行在 Kubernetes 等平台上),以推动增长。 无论我们谈论可扩展性、效率还是灵活性,对于努力提供无与伦比的用…

<Linux> 线程的同步与互斥

目录 前言: 一、资源共享问题 (一)多线程并发访问 (二)临界资源与临界区 (三)“锁” 是什么 二、多线程抢票场景 (一)并发抢票 (二)并发访…

用云服务器构建gpt和stable-diffusion大模型

用云服务器构建gpt和stable-diffusion大模型 一、前置知识二、用云端属于自己的聊天chatGLM3step1、项目配置step2、环境配置1、前置知识2、环境配置流程 step3、创建镜像1、前置知识2、创建镜像流程 step4、通过 Gradio 创建ChatGLM交互界面1、前置知识2、创建ChatGLM交互界面…

MacBook 使用——彻底卸载并删除软件:NTFS for Mac

问题 之前因MacBook读写NTFS格式移动硬盘,我安装并使用了 Paragon NTFS for Mac ,试用期结束后将其从【应用程序】中卸载移除了。但之后每次开机启动时,系统还是会弹出【激活】通知,如下图 解决 Step1、在用户目录下的 Library 目…

综合实验---Web---进阶版

实验配置: 7-1为内网Nginx服务器;7-2和7-3为Web服务器;7-4为网关服务器;7-5为外网客户机; yum安装Nginx;yum安装Mysql; 编译安装PHP;编译安装 由于我们Nginx和Mysql都是yum安装&…

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

【分布式websocket 】前端vuex管理客户端消息crud!使用localStorage来存储【第19期】

前言 聊天系统客户端是要存储消息的,因为所有所有的历史消息都从服务器拉的话一方面服务器压力大,另一方面也耗费用户流量。所以客户端存储消息是势在必行的。如何存储呢上一篇文章也写了,大概就是浏览器的话是localStorage或者IndexedDB。然…

使用Lua编写Wireshark解析ProtoBuf插件

文章目录 Wireshark Protobuf Lua-dissectorStep 1: 获取 WiresharkStep 2: 配置ProtoBuf相关设置添加ProtoBuf查找路径 Step 3 运行和调试Lua代码1. 添加Lua脚本2. 运行和调试 Step 4: 写Lua Dissector代码 :)Step 5(Optional): Decode AsGithub工程地址 Wireshark Protobuf L…

THM学习笔记—RootMe

nmap扫描,发现22端口和80端口打开 dirsearch扫描,注意到/panel和/uploads,在浏览器中打开 可以上传文件,尝试反弹shell 在尝试过程中发现网站不能上传.php文件,只需要将后缀更改为.php5之类即可 成功 查找文件&#x…

Tomcat Session 集群 ---------会话保持

一、 负载均衡、反向代理 环境搭建: nginx服务器192.168.246.7 tomcat 1服务器192.168.246.8 tomcat 2服务器192.168.246.9 7-1 nginx服务器搭建 [rootzzcentos1 ~]#systemctl stop firewalld [rootzzcentos1 ~]#setenforce 0 [rootzzcentos1 ~]#yum install …

【网络】详解HTTPS及探究加密过程

目录 一、什么是HTTPS1、加密解密是什么2、为什么要加密3、常见的加密方式1、对称加密2、非对称加密 二、探究HTTPS如何实现加密1、方案一----只使用对称加密2、方案二----只使用非对称加密3、方案三----双方都使用非对称加密4、方案四----非对称加密 对称加密5、中间人攻击6、…

【Java】List, Set, Queue, Map 区别?

目录 List, Set, Queue, Map 区别? Collection和Collections List ArrayList 和 Array区别? ArrayList与LinkedList区别? ArrayList 能添加null吗? ArrayList 插入和删除时间复杂度? LinkedList 插入和删除时间复杂度&…