SLAM 02.整体框架

2023-05-16

 上一篇文章是从人类角度来分析SLAM技术,其实任何计算机技术的实现都是从人类思维出发去解决实际问题。本篇从技术实现角度讲解SLAM的实现框架。

SLAM在自主导航中的位置

在整个移动机器人自主导航(包括自动驾驶)中,区分为几大块:
感知(位姿、地图);
规划(局部、全局);
控制(包括轨迹跟踪)。
在这里插入图片描述
上图中的橙黄色部分的感知是可以加入人工智能技术进行目标识别,然后把目标识别出来的语义反馈给SLAM进行进一步的定位和建图。在整个机器人自主导航中SLAM占据中间枢纽的作用,是导航不可缺失的关键部分。
SLAM是同步定位与地图构建(Simultaneous Localization And Mapping)的缩写,最早由Hugh Durrant-Whyte 和 John J.Leonard提出。SLAM主要用于解决移动机器人在未知环境中运行时定位导航与地图构建的问题。SLAM更像是一个概念而不是一个算法。
这里说的同步定位和地图构建,其中的定位是指机器人对自身的定位,包括当前的位姿(位置和姿态)。地图构建是对周围环境的的重建,一般是3D环境。同步定位和建图是同步进行的,没有先后顺序。这里就存在一个先有鸡还是现有蛋的问题。

SLAM的整体框架

SLAM的整个框架如下:
在这里插入图片描述
一个完整的SLAM系统分为:传感器数据处理、前端视觉里程计、后端优化、建图和回环检测。

传感器数据标定和融合

通常SLAM按照传感器的实现分为:基于视觉SLAM和基于激光雷达的SLAM。但是个人觉得这种按照传感器方式划分的方法不科学。比较科学的划分方式是把外部所有的传感器都划分到一个模块中,进行传感器数据的统一处理。
对外界感知的传感器包括:相机、激光雷达和毫米波雷达等,这类传感器就如同人的眼睛和耳朵。相机通过被动接受光线感知外界,雷达通过发射光波或者声波反射后测定物体表面纹理和距离。
同时机器人也要知道自己的位姿和位置,例如需要小脑、前庭觉、本体感觉(感知肌肉和骨骼运动)等的配合。IMU(惯性测量单元)内部的陀螺仪及加速度计能知道机器人的位姿以及加速度,里程计数器通测定行走距离。
在这里插入图片描述
以上各种传感器的数据都要进入系统进行统一处理,这就需要数据融合和标定。这是因为不同传感器侧重点不同,数据类型不同,采样频率不同,时钟不同,安装位置和误差不同等等造成数据的差异性,所以需要从时间和空间上进行标定,把数据统一起来,这就叫数据融合。传感器数据的标定和融合是一个很基础性的问题,决定了将来数据处理的效果。

前端视觉里程计(VO)

机器人一边行走一边要知道自己的位置,同时要在自己的大脑中构建外部的环境地图:同时定位和建图。机器人只有知道了外部地图地标,才能准确知道自己的位置。同时只有知道自己的位置、位姿和行进路线,才能反过来在自己大脑中精确构架外部地图。

运动方程和观测方程结合

以人类为例,一种极端情况是对于一个盲人行走,这时没有眼睛得到外部信息,靠自身的运动感知。因为人体大脑和耳蜗中有方向性感知,腿部运动也能感知,例如向左了几步,向右走了几步,前进了几步,倒退了几步。通过这些盲人就基本能知道自己的位置。机器人自身位置数据通过对机器人轮胎运行圈数的估计可以得到机器人自身位置的一个估计。也可以通过IMU传感器,测量物体三轴姿态角(或角速率)以及加速度的装置。加上行程计数器,就能知道自身走了多少米,以及方向,自己的姿态等。这样也能得到一个基本的位置和姿态。然后在机器人中,根据运动方程式就能绘制出自己的轨迹和定位。
但是只根据运动方程式偏差较大,这时如果能借助周围的路标进行矫正则位置更准确。所以一个视力正常的人走路的定位要远远好于盲人,因为借助了外部环境的矫正。在使用机器人运动方程得到机器人位置估计后,我们可以使用测距单元得到的周围环境信息更正机器人的位置。例如我们从摄像机或者激光雷达获取的信息中心提取环境特征值,把这样叫做路标。
这种方法就是把运动方程和观测方程结合方式进行定位。在这里插入图片描述
上图中三角形表示机器人,星号表示路标;机器人首先使用测距单元测量地标相对于机器人的距离和角度。
在这里插入图片描述
然后机器人开始进行运动,到达一个新的位置,机器人根据其运动方程预测其现在所处于的新的位置。
在这里插入图片描述
在新的位置,机器人通过测距单元重新测量各个地标相对于机器人的距离和角度,测量得到的距离和角度与上述预测结果可能并不一致,因而,上述预测值可能并不是机器人准确位置。
在这里插入图片描述
在机器人看来,通过传感器获得的信息相对于通过运动方程得到的信息更为准确,因而,机器人将通过传感器的数据更新对机器人位置的预测值,如上图中实线三角形所示(虚线为第一步中通过运动信息预测的机器人位置)。
在这里插入图片描述
经过上述结合,我们重新估计得到的新的机器人位置如上图实线三角形所示,但由于测距单元精度有限,因而,此时,机器人可能实际处于上图点状三角形位置,但此时估计结果相对于初始预测结果已经有明显的改善。

特征点匹配

在机器人观测外部环境中,关键的就是要处理不同图像之间的关系,尤其是特征点之间的匹配。不同的图像帧虽然是在不同位置角度观测到的,但是在时空上具有连续性和关联性。所以机器人能够通过不同图像的变化来确定自己为位姿,同时把新的特征增加到地图中,更新地图。首先要找到两张图像中所有相同的特征点(代表同一个点),接着要把特征点匹配起来。
特征点一般是拐角、区块和边等灰度发生突变的地方,这些点容易被识别,找出特征点接着就是匹配了。寻找特征点有很多种方法,例如SIFT,SURF,ORB。其中ORB比较经典。
在这里插入图片描述

定位

两张图中特征点匹配的过程就是为了找出相同点,然后从相同点反过来推算机器人是如何移动。
在这里插入图片描述
根据相机成像原理,相邻的两帧图像中能观测出外界同一个点P的位置变化。反过来也可以将P作为不变外界点反推出相机坐标系的变化,从而给相机定位。
在这里插入图片描述
当相机为单目时,我们只知道 2D 的像素坐标,因而问题是根据两组 2D 点估计运动。该问题用对极几何来解决。(一个纯数学的方法)。双目、RGB-D 相机或其他已经得到了距离信息的方式:根据两组3D 点估计运动。该问题通常用 ICP 来解决。当知道了相机定位和周围物体的深度,即可反过来进行三维地图建模了。

建图

机器人知道了自己的位置,就可根据观测到的外部数据以及得到的特征值(路标)构架环境3D地图了。稀疏的地图只用特征点构造。但是只知道特征点的地图不行的,例如要避障、规划路径需要知道特征点之间的信息,所以需要更稠密的地图,这时使用稠密的点云而不是稀疏的点云。

小结

下图总结了视觉里程计的结构关系。本文重点讲了特征值法,对于直接法没有讲解。
在这里插入图片描述

后端优化

前端的视觉里程计只能求出短时间或者说相邻两帧的转换关系,并建立局部意义的地图。然而当时间延长或者规模变大之后,那么将会出现累积误差。而后端就是要解决这个长时间、大规模建图的问题。因此希望构建一个针对全局的更大规模的优化问题,得到最优的轨迹和地图,这里主要有两种解决思路:

(1)基于马尔可夫性假设的卡尔曼滤波器:马氏性假设可以简单地理解为“当前时刻状态只与上一时刻有关”。针对SLAM问题(非线性)的卡尔曼滤波器给出了单次线性近似下的最大后验估计,或者说是优化过程中一次迭代的结果。

(2)非线性优化:非线性优化考虑了当前及之前所有时刻的状态,同时优化所有时刻的相机位姿以及各个特征点的空间位置。使用光束法平差(BA)求得最优解。

一般情况下认为非线性优化算法比滤波器占有明显优势,应该重点关注非线性优化中的BA求解与图优化。使用图优化做后端已经成为当之无愧的首选,卡尔曼滤波的方法已经越来越少了。
后端优化在后面文章有具体讲解,本篇不展开论述。

回环检测

回环检测也在后端完成,主要目的是识别机器人是否达到了原先的位置,这样可以大大减少运算量。
回环检测要解决如下几个问题:

  • 是否达到了原先的地方
  • 识别达到的场景
  • 计算图像之间的相似性(使用词袋模型)。
    回环检测是一个太重要的话题了,即便到现在也是一个没有被完全解决的问题。其中最关键的核心在于当前端误差累计达到一定程度以后,场景重识别和位姿匹配都不能再以开环位姿为基础做判断,需要全局搜索和匹配了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SLAM 02.整体框架 的相关文章

  • 每日浅读SLAM论文——简析Cartographer

    文章目录 二维激光SLAM 简单框架 前端 scan matching Submaps构建 后端 分支定界优化csm CorrelativeScanMatch 代码实现框架 Cartographer 论文名 Real Time Loop C
  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编
  • No rule to make target

    No rule to make target 引言 解决方法 引言 报错 No rule to make target Thirdparty g2o lib libg2o so needed by lib libygz SLAM so 停止
  • LIO-SAM:在高斯牛顿法求解过程中用SO3代替欧拉角

    LIO SAM发表于IROS2020 是一个效果非常好的惯性 激光紧耦合里程计 我打算给我们的机器人搞一个激光里程计 于是打算把LIO SAM改一改搞过来 修改过程中发现一个问题 在里程计求解 mapOptimization的LMOptim
  • 《视觉SLAM十四讲》第一版源码slambook编译调试

    slambook master ch2 编译正常 log如下 slambook master ch2 mkdir build cd build cmake make j8 The C compiler identification is G
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • 视觉SLAM实践入门——(20)视觉里程计之直接法

    多层直接法的过程 1 读图 随机取点并计算深度 2 创建图像金字塔 相机内参也需要缩放 并计算对应点的像素坐标 3 应用单层直接法 使用G N L M等方法 或者使用g2o ceres库 进行优化 源码中有一些地方会引起段错误 修改方法见下
  • 从零开始一起学习SLAM(9)不推公式,如何真正理解对极约束?

    文章目录 对极几何基本概念 如何得到极线方程 作业 此文发于公众号 计算机视觉life 原文链接 从零开始一起学习SLAM 不推公式 如何真正理解对极约束 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后 感觉书上的内容没那么难了
  • vscode配置eigen3

    目录 1 头文件包含 2 c cpp properties json 3 CMakeList txt 4 完整代码 1 头文件包含 Eigen 核心部分 include
  • LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述

    一 github GitHub RobustFieldAutonomyLab LeGO LOAM 二 安装依赖 1 ROS Ubuntu 64 bit 16 04 ROS Kinetic 比较常规 就不赘述了 2 gtsam Georgia
  • 图像匹配算法

    图像匹配算法分为3类 基于灰度的匹配算法 基于特征的匹配算法 基于关系的匹配算法 1 基于灰度的模板匹配算法 模板匹配 Blocking Matching 是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像 基于灰度的匹配算法也称作
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • Eigen::aligned_allocator

    如果STL容器中的元素是Eigen库数据结构 例如这里定义一个vector容器 元素是Matrix4d 如下所示 vector
  • Ubuntu20.04安装各种库----简洁版

    目录 Eigen3 Sophus Pangolin Ceres g2o 建议先装anaconda再装ros python opencv啥该有的都有了 下面仅仅安装ros没有的库 Eigen3 作用 线性代数开源库 提供了有关线性代数 矩阵和
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • 快看!那个学vSLAM的上吊了! —— (一)综述

    不同于之前发布的文章 我将使用一种全新的方式 iPad Notability Blog的方式打开这个板块的大门 原因有两个 1 Notability更方便手写长公式 也方便手绘坐标系变换等等 2 之前Apple Pencil找不到了新破费买
  • LeGO-LOAM中的数学公式推导

    LeGO LOAM是一种在LOAM之上进行改进的激光雷达建图方法 建图效果比LOAM要好 但是建图较为稀疏 计算量也更小了 本文原地址 wykxwyc的博客 github注释后LeGO LOAM源码 LeGO LOAM NOTED 关于代码
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以

随机推荐

  • C++11常用新特性快速一览

    最近工作中 xff0c 遇到一些问题 xff0c 使用C 43 43 11实现起来会更加方便 xff0c 而线上的生产环境还不支持C 43 43 11 xff0c 于是决定新年开工后 xff0c 在组内把C 43 43 11推广开来 xff
  • 语法糖:萃取lambda表达式

    背景 现在手头主负责的服务代码 xff0c 基本上都用C 43 43 11来开发了 xff0c 异步编程使用的是TAF的future promise future的then函数 xff0c 接受的是一个Callback对象 xff0c 该对
  • hashmap C++实现分析

    一 简介 Map 是 Key Value 对映射的抽象接口 xff0c 该映射不包括重复的键 xff0c 即一个键对应一个值 在HashMap中 xff0c 其会根据hash算法来计算key value的存储位置并进行快速存取 本文介绍的C
  • SpringMVC(04) -- SpringMVC获取请求参数

    SpringMVC学习笔记 源码地址 4 1 xff09 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参 xff0c 此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的
  • docker删除所有容器/镜像

    1 想要删除容器 xff0c 则要先停止所有容器 xff08 当然 xff0c 也可以加 f强制删除 xff0c 但是不推荐 xff09 xff1a docker stop docker ps a q 2 删除所有容器 docker rm
  • php中常见的几种设计模式

    1 单例模式 单例模式可以说是面向对象语言里最常用 也是最简单的一种模式 单例就是单个实例 xff0c 单个对象的意思 xff0c 就是说我们去实例化一个类的时候 xff0c 不管调用多少次 xff0c 都永远只有一个实例 不会有多个 xf
  • Ubuntu查看文件大小或文件夹大小

    一 查看文件大小 查看文件大小的命令 xff1a ls l filename 会在终端输出 xff1a rw r r 1 root root 2147483648 Mar 5 09 39 filetemp0606 其中数字214748364
  • Git 遇到了 The remote end hung up unexpectedly -- early EOF -- index-pack failed 问题

    Git 遇到了 The remote end hung up unexpectedly early EOF index pack failed 问题 今天想 clone 在 gitlab 的 repo xff0c 结果在 clone 的过程
  • 【Docker】在Docker容器中运行VScode

    原文链接 xff1a 容器中的远程开发 Prerequisites VScodeDocker Desktop Steps 打开Docker xff1a 在Windows下出现鲸鱼图标且图标静止则打开成功 xff1b 检查Docker xff
  • github 常用命令汇总 更新代码和子模块的代码

    针对PX4代码 xff0c 在github库中建立了Firmware的分支 xff0c ADRC branch xff0c 用于存放修改的代码 xff0c 其中涉及了子模块ecl的修改 代码下载 xff1a git clone https
  • C、C++多线程编程

    本文的笔记来自于b站视频的爱编程的大丙 xff0c 博客链接 xff1a https subingwen cn xff0c 有做了相应的补充 xff01 一 线程概述 进程对应的虚拟地址空间的各个分区如图 xff1a 每个进程的虚拟地址空间
  • 【x86架构】中断基础介绍

    说明 本文讲的是Intel的x86架构下的中断 参考的文档主要如下所示 xff1a 64 ia 32 architectures software developer manual pdf PCI Express体系结构导读 x86 x64
  • Java中的this有哪四种用法

    JAVA中的this是一个非常重要的模块 在编程中有非常重要的地位 擅长用this的人常常可以使程序更加简洁和方便 今天来了解一下this的用法 java中this关键字必须放在非静态方法里面 xff0c this关键字代表自身 xff0c
  • 线程不执行delegate,防止线程结束

    如果我们将NSURLConnection放在线程中 xff0c 是不是delegate方法总是不会触发 xff1f 原因就是由于线程结束了 解决方法就是让线程在数据返回之前不结束 1 可以在线程中加一个timer防止结束 xff0c 这方法
  • vscode 配置 git (配置、暂存、推送、拉取、免密)

    前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 忍不住分享一下给大家 点击跳转到教程 vscode 中对 git 进行了集成 xff0c 很多操作只需点击就能操作 xff0c 无需写一些 gi
  • 计算机视觉3 SIFT特征提取与全景图像拼接

    1 原理 检测并提取图像的特征和关键点匹配两个图像之间的描述符使用RANSAC算法使用我们匹配的特征向量估计单应矩阵拼接图像 步骤一和步骤二过程是运用SIFT局部描述算子检测图像中的关键点和特征 xff0c SIFT特征是基于物体上的一些局
  • 高超声速滑翔飞行器摆动式机动突防弹道设计(源代码)

    谢愈 xff0c 刘鲁华等 xff0c 高超声速滑翔飞行器摆动式机动突防弹道设计 xff0c 航空学报 xff0c 2011 算法有两个控制量 xff1a 攻角和倾侧角 xff0c 攻角只是起辅助作用 xff0c 主要还是倾侧角的设计 由于
  • 4轴开发之串级PID调试技巧

    欢迎查看我原始的出处 xff1a http lindue com 17868 html 调节串环 PID 大概过程 xff08 注意修正反向 xff09 1 估计大概的起飞油门 2 调整角速度内环参数 3 将角度外环加上 xff0c 调整外
  • 2013第四届蓝桥杯省赛C++C组【第四题:幻方填空】

    第四题 标题 xff1a 幻方填空 题目描述 xff1a 幻方是把一些数字填写在方阵中 xff0c 使得行 列 两条对角线的数字之和都相等 欧洲最著名的幻方是德国数学家 画家迪勒创作的版画 忧郁 中给出的一个4阶幻方 他把1 2 3 16
  • SLAM 02.整体框架

    上一篇文章是从人类角度来分析SLAM技术 xff0c 其实任何计算机技术的实现都是从人类思维出发去解决实际问题 本篇从技术实现角度讲解SLAM的实现框架 SLAM在自主导航中的位置 在整个移动机器人自主导航 xff08 包括自动驾驶 xff