【学习记录】入坑SLAM一年后的理解

news/2024/7/5 1:41:58

一、前言

入坑SLAM也有一年了,也看了不少视觉SLAM的方法,最近也开始涉猎一些激光SLAM的方法,在看的这些方法中,大多数的重点都放在了前端的部分,因为师兄说过大多数的SLAM方法后端都没什么变化,都是画因子图然后做BA优化,趁着疫情在宿舍封控,理顺一下这一年看SLAM的理解。

二、前端

首先明确前端的用途,个人理解前端就是计算两帧之间的位姿变换关系T,对于视觉SLAM来说,就是用两帧图像来计算,而对于激光SLAM来说就是用两帧点云来计算,但最终目标都是计算这个T。

针对于这两大SLAM分支,不同的分支有不同的计算方法,这是针对于传感器得到数据的特点做的适应性处理。对于视觉SLAM,数据是两帧图像,也就是两张照片,相较于点云,图像表示方便而且数据量要小,对于一些光照特征有着很好的表现性能,所以在视觉SLAM中延伸出特征点法、直接法和半直接法,这三种方法都用的是图像上的局部特征。而对于激光SLAM,点云规模大而且不规则,所以没有办法像视觉SLAM那样海量提取特征,一般使用像NDT/ICP/LOAM这些方法来进行位姿计算,激光SLAM中位姿计算的过程貌似也可以称为点云配准。

前端其实是大多数SLAM方案玩花样玩得最多的地方,拿视觉SLAM来说,从计算帧间位姿的方法可以分为特征点法、直接法和半直接法。特征点法顾名思义,用图像中的特征点进行匹配,匹配之后先通过对极几何计算出两帧之间的位姿,再用位姿进行三角化恢复特征点的空间信息,也就是恢复出深度信息。深度信息是视觉SLAM一个很关键的问题,因为视觉不能像激光SLAM那样直接就得到深度,必须要经过三角化这个步骤来计算深度,当然双目相机和RGBD相机除外,双目相机可以利用视差计算深度,RGBD也可以利用传感器获得深度,而对于单目相机来说,就只能用相邻的两帧图像来计算深度。在特征点法的基础上,又延伸出特征线甚至特征面法,因为线和面包含的特征信息是要比点多的,所以按道理这些方法是可以提升视觉SLAM的性能的,但是貌似是受限于优化和匹配的方法,所以目前的主流依然还是点特征。特征点法典型的算法包括ORBSLAM/VINS-MONO,简直就是视觉SLAM必须要看的论文。而线特征和面特征显然要少很多,线特征比较出名的是PL-SLAM/PL-SVO,但它是基于半直接法的。

直接法则少了提取特征点并匹配的过程,个人理解这种方法实际上就是利用了一个图像局部相似性,省略了在当前帧图像上提取特征的步骤。它的核心是将上一帧的特征点直接投影到当前帧,然后比较投影位置的局部相似程度,其实和我们提取特征点是相同的,只不过我们直接用局部相似性而不做提取的步骤。这个方法貌似没看到很出名的论文使用这个方法,很大一个可能是本人论文涉猎程度不广。

半直接法则介于前面两种方法之间,有点不伦不类的味道了,这个方法有一个很出名的论文就是前面提到的SVO,准确的说半直接法就是SVO这篇论文里面提出来的。但是现在仔细想想,这个半直接法貌似和直接法区别不那么大,可以查看以前记录的SVO的论文笔记。

二、后端

前端得到的位姿,是一个小范围的位姿,由于累积误差的存在,这个偏差会越来越大,所以需要回环检测和校正来优化这个流程。当然,回环检测和优化是出现回环时才用得到,而没有回环时,也就需要后端去承担一定的责任。

之前对后端理解一直不到位,这几天看了点网课,稍微加深了一点理解。简单来说,和神经网络差不多,后端也是个最小化偏差的过程,而这个误差,其实就是前面前端过程中的观测关系的累积。一般的优化,优化的对象就是前面相机的位姿以及路标点的坐标,而这些量都会作为一个整体,也就是待优化向量参与到优化过程,既然是优化,那么必然有一个损失函数,考虑到不同方法传感器类型的差别,所以损失函数这里我们就按照各个偏差的和来理解,我们希望总体的误差最小,就需要不断对待优化向量做调整,来逐步减小损失函数的值。这个过程涉及到一些数值优化的方法,比如牛顿法、高斯牛顿法等,牵扯到雅可比矩阵和海森矩阵的计算,这些都是一些比较乱的数学计算,当然能理顺清楚的话其实也没那么难,这里可以参考教学视频的讲解。

而在实际的SLAM项目中,并不会暴力去计算后端的这些内容,因为大多数时间我们都是在使用现成的库文件,比如g2o库等,使用这些库,像库中描述图优化的一些边、点的约束条件,剩下的就交给库去执行计算了,因为可以使用一些图论的知识,所以在一些情况下计算的时间开销会更加优秀。不仅如此,一些IMU等约束条件也可以一起加入其中,在此基础上又延伸出紧耦合和松耦合这些区别,这些其实就涉及到多传感器融合的部分了,紧耦合将其他传感器的内容作为约束一起优化得到一个结果,而松耦合将不同传感器计算结果分别计算后融合多个结果。

BA优化将位姿和地图点都作为优化的对象,在运行一段时间之后,开销会明显增大,所以又出现了因子图优化,它的意义在于在优化几次以后把特征点固定住不再优化,只当做位姿估计的约束,之后主要优化位姿。
在这里插入图片描述
至于因子图优化和BA优化有啥区别,网上说啥的都有,有说是一个东西的,也有说要分开理解的。本人更倾向于将其都看做一种东西,位姿图优化和BA优化都是slam中的具体问题,可以使用前面提到的优化方法进行优化,BA优化中,路标点和位姿都是不确定的,都是优化变量。位姿图优化,假设路标点是确定的,优化变量只有位姿,路标点成了约束。

简单总结一下,因子图优化和BA优化都是后端优化的具体方法,区别在于路标点是作为约束还是作为优化的量,解决这两个优化问题,都需要使用到非线性优化的方法,也就是图优化的知识,其中涉及到图论和高斯牛顿法等理论知识。两种方法的目的都是让整体更加准确,这也就是后端的目标。
参考链接:https://www.zhihu.com/question/389810365


http://lihuaxi.xjx100.cn/news/74310.html

相关文章

Mac安装docker(轻松解决安装)

Mac安装docker(轻松解决安装) 1、docker是什么? Docker的三个基本概念: Image(镜像) Container(容器) Repository(仓库) Docker的思想来自于集装箱,集装箱解决了什么问题? 在一艘大船上,可以把货物规整的…

第06章 所有的晕厥都不可掉以轻心

【晕倒后第一时间要做的快速检查】这是一段真实的故事,大家听完不许笑。 大家都知道我是一名医生,大家都知道在中国看病很困难,所以大家都知道在中国认识一名医生是一件很重要的事,所以我从来没有被小学同学、初中同学、高中同学&…

MySQL数据库_02_数据库基础知识

一. 数据库和文件 数据库和文件一样存储的介质可以是内存也可以是磁盘。为什么有文件了还需要数据库?因为文件的安全性不高,也不利于大量数据的存储,查询和管理,在程序中控制也不怎么方便。 二. 数据库服务器,数据库&a…

Debezium系列之:详细记录数据库迁移debezium保证数据不丢失的方法和步骤流程

Debezium系列之:详细记录数据库迁移debezium保证数据不丢失的方法和步骤流程 一、背景二、方法一:新起debezium connector三、方法二:设置mysql位点步骤1:DBA提供位点步骤2:准备新域名debezium connector的配置步骤3:删除采集旧域名数据库的debezium connector步骤4:写入…

将Bean交给Spring容器管理有几种方式?

Spring核心 Spring核心是 IOC 和 AOP 。 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。 至于更详细的说明,或者去深入理解Spring这两大核心,不是此篇文章的目的,暂不细说了。 …

层次分析法原理讲解 python手搓实现-故事带入小白详解版

层次分析法 在参加研究生数学建模的时候用到了层次分析法,然后就写了个程序,比完赛了想着代码别浪费了拉出来写个教程,虽然这个算法很经典但是和往常一样我搜索了很多资料没有看起来比较舒服的,那就自己来吧。 问题构建-我应该选…

Drf从入门到精通八(内置认证、权限、频率的补充、DjangoSettings配置说明、过滤补充、全局异常处理、API接口文档)

前言 本章节将会熟悉DRF更多功能的使用,在我们编写API时能够省却大量不必要的重复代码,以及在整体上提升代码的可读性,降低维护成本。在编写代码时,避免过度重复造轮子,感兴趣可以多研究现有比较好用功能的源码&#…

设计模式-创建型模式

创建型模式 一、定义 :它提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象 二、常见设计模式 1、单例模式:全局共享一个实例,且只需要初始化一次的场景 恶汉模式:全局变量在包被加载时创建…