SLAM 十四讲(第一版)各章方法总结与理解

news2024/12/24 2:12:17

SLAM 十四讲(第一版)各章方法总结与理解

总结十四讲中各章各步骤提到的各种方法,以及具体方法在哪个 c++ 库中可以调用。目的在于能更直观地了解 slam 过程各步骤到底在做什么,以及是怎么联系在一起的。

2. 初识 SLAM

在这里插入图片描述

  • SLAM(Simultaneous Localization and Mapping):同时定位 + 建图
  • 前端/视觉里程计 (Visual Odometry, VO):视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。
  • 后端优化(Optimization):后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。
  • 回环检测(Loop Closing):回环检测判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
  • 建图(Mapping):它根据估计的轨迹,建立与任务要求对应的地图。

3. 三维空间刚体运动

  • Eigen 库:用于矩阵运算。

4. 李群与李代数(用于非线性优化)

  • Sophus 库:用于李代数运算。

5. 相机与图像

  • Opencv 库:用于图像操作。
  • PCL 库:用于点云操作。
  • 现实点到像素点过程,涉及 4 个坐标系
    • 世界坐标系点 P -> 相机坐标系点 P’,用到 R,t;
    • 相机坐标系点 P’ -> 归一化平面(相机)坐标系点 Pc
    • 归一化平面(相机)坐标系点 Pc -> 去畸变后的坐标;
    • 去畸变后的坐标 -> 像素坐标点 Puv,用到相机内参。

6. 非线性优化(前端、后端都会用到)

非线性优化即求解最小二乘问题

  • 非线性优化的物理意义

    • 定位:通过估计观测到当前数据时传感器(雷达/相机)的状态(即位姿)实现的。
    • 优化定位:优化对传感器的状态估计,即求传感器最可能产生现在观测到当前数据的状态(最大似然估计)。
    • 最大似然估计 <== 等价 ==> 最小二乘问题的最优解,所以状态(位姿)估计可以转化为最小二乘/非线性优化问题(通过李群 - 李代数的转换关系)。
    • 即状态(位姿)可以通过变换矩阵来描述,然后用李代数来优化求解。
  • 非迭代方法(仅能求解简单问题)

    • 导数为零法
  • 迭代方法(可以求解复杂问题)

    • 一阶和二阶梯度法(直观):最速下降法一阶,过于贪心、牛顿法二阶,大问题时计算困难。
    • G-N 法(高斯牛顿法 / Gauss-Newton):简单,但特定场景稳定性差可能不收敛,迭代;
    • L-M 法(列文伯格-马夸尔特法 / Levenberg-Marquadt):鲁棒性高,但收敛较慢, 迭代;
  • c++ 优化库

    • Ceres 库:可用 LM 、 dogleg 方法。
    • g2o 库:图优化,可用 GN 、 LM 、 dogleg 方法。

7. 视觉里程计(特征点法)

  • 特征点:关键点/Key-point + 描述子/Descriptor,如 ORB 特征/Oriented FAST and Rotated BRIEF = Oriented FAST + BRIEF。使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,通过最小化 重投影误差(Reprojection error) 来优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们为何要对特征进行匹配或跟踪的理由。

  • 特征匹配暴力匹配(Brute-Force Matcher) 简单、FLANN(快速近似最近邻) 适用点数多的场景

  • 三角测量:估计地图点的深度,OpenCV 的 triangulation 函数。

  • RANSAC(随机采样一致性 / Random Sample Concensus):存在错误数据的场景,代替最小二乘法。

  • 估计相机位姿的变化

    • 对极几何:知道两组 2D 点信息的场景,需要八对以上的点;
    • PnP(Perspective-n-Point):知道 3D 点 + (另一帧图像中对应 2D)点投影位置信息的场景,不需要用对极几何,可以通过更少对的点估计相机位姿,包括 P3P(三对点)DLT(直接线性变换)EPnP(Efficient PnP,OpenCV 库中可用)UPnP 这些线性方法和 BA 法 这一非线性方法。
    • ICP(Iterative Closest Point):知道两组 3D 点信息的场景,包括 SVD(奇异值分解,Eigen 库中可用) 这一线性方法和类似 BA 法 的非线性方法。
  • BA 法(光束法平差/捆集调整 / Bundle Adjustment):从视觉重建中提炼出最优的 3D 模型和相机参数(内参数和外参数)。从每一个特征点反射出来的几束光线(bundles of light rays),在我们把相机姿态和特征点空间位置做出最优的调整 (adjustment) 之后,最后收束到相机光心的这个过程。在本讲中具体表示为通过 PnP 方法线性部分的结果作为初始值,同时优化特征点和传感器位姿。其中优化过程可以用 Ceres 和 g2o 这两个库中的 G-N / L-M 等方法。

8. 视觉里程计(直接法)

  • 光流法(Optical Flow):只计算关键点,然后用光流法代替计算描述子来追踪特征点的运动,估计相机运动时仍使用“对极几何、PnP 或 ICP 算法”。
    • 稀疏光流:计算部分像素运动
    • 稠密光流:计算所有像素运动
    • LK 光流(Lucas-Kanade):假设 1 - 同一个空间点的像素灰度值,在各个图像中是固定不变的(灰度不变假设);假设 2 - 某一个窗口内的像素具有相同的运动。OpenCV 库中可用。
  • 直接法(Direct Method):只计算关键点,然后用直接法计算特征点在下一帧图像中的位置,即用像素灰度信息计算相机运动,不用“对极几何、PnP 或 ICP 算法”,速度更快。在直接法中,我们并不需要知道点与点之间之间的对应关系,而是通过最小化 光度误差(Photometric error) 来求得它们。转为优化问题后可用 ceres 库和 g2o 库。
    • 稀疏直接法:只使用稀疏关键点,只能计算稀疏的重构。
    • 半稠密(Semi-Dense)直接法:只使用带有梯度的像素点,可以重构一个半稠密结构。
    • 稠密直接法:使用所有像素。
  • 直接:不计算关键点,直接根据像素灰度差异计算相机运动。

9. 实践:设计前端

  • 数据:带有深度信息的、连续的各帧图像数据。
  • 初步目标:估计两两帧之间(Pairwise)的相机运动,即无结构(Structureless)的 VO 前端。
  • 原理:前一帧作参考(Reference)建立坐标系,当前帧(Current)与其做特征匹配,并估计运动关系。最后加上迭代优化位姿估计。
  • 地图:自己实现的地图类,第一帧点全部放入。后续帧来到时优化地图(删除地图不在当前视野中的点、匹配率太低的点、匹配点数少时加入新的点),然后拿出视野内的点和当前帧特征描述子匹配。
  • 实现:使用 OpenCV 的 ORB 类实现特征提取和匹配,OpenCV 的 solvePnPRansac 方法实现运动关系的估计, 并以 RANSAC PnP 结果为初值,用 g2o 的 L-M 方法优化位姿运动估计。
  • 效果:对于局部的定位和低精度需求,VO 前端已经够用,无需完全的 SLAM。但容易丢失且可能轨迹漂移。

10. 后端1

  • 后端的意义:前端视觉里程计能给出一个短时间内的轨迹和地图,但由于不可避免的误差累积,这个地图在长时间内是不准确的。后端就在于构建一个尺度、规模更大的优化问题,以考虑长时间内的最优轨迹和地图。

  • 后端的实时性:后端的优化没必要实时地响应前端的图像数据。人们倾向于把前端和后端分开,运行于两个独立线程之中。

  • 滤波器方法:马尔可夫性假设(k 时刻状态只与 k −1 时刻状态有关)下的方法。小型场景下更简单。

    • 卡尔曼滤波器(KF / Kalman Filter):线性系统使用
    • 扩展卡尔曼滤波器(EKF / Extended Kalman Filter):非线性系统使用
    • 局限:无法处理回环场景、线性近似可能只在很小范围内成立、大型场景算力要求更高
  • 非线性优化方法:依然考虑 k 时刻状态与之前所有状态的关系。

    • BA 和图优化:需要做的主要是构造 Bundle Adjustment 问题,设置 Schur 消元,然后调用稠密或者稀疏矩阵求解器对变量进行优化即可。

11. 后端2

  • 位姿图(Pose Graph)优化:只优化相机位姿,抛弃特征点。节点是相机位姿,边是两个位姿节点之间相对运动的估计。使用 g2o 库完成位置图的优化。
  • 因子图(Factor Graph)优化:由表示优化变量的变量节点,以及表示因子的因子节点组成。其过程为调整各变量的值,使它们的因子之乘积最大化。

12. 回环检测

  • 回环检测的意义
    • 给出除了相邻帧之外的,一些时隔更加久远的约束,消除长期的累计误差,保证轨迹和地图全局一致(Global Consistent)。
    • 可用于进行重定位。
  • 基于里程计的几何关系(Odometry based):里程计回到相近位置时认为形成回环。但里程计可能不准,累计误差大时失效。
  • 基于外观(Appearance based):根据两张图像的相似度确定回环。
    • 词袋模型(BoW/Bag-of-Words):用“图像上有哪几种特征”来描述一个图像
    • 字典:包含许多图像概念的单词,其生成问题类似一个聚类问题。
    • K-means(K 均值):用于聚类,生成字典
    • K 叉树:用于表达字典,类似于层次聚类,是 k-means 的直接扩展。叶子层是单词,中间节点用于快速查找。
    • DBoW3 库:DBoW3::Vocabulary 对象用于生成字典、计算图像之间描述向量的相似度

13. 建图

  • 单目稠密重建
    • 立体视觉
    • 极线搜索:在极线上搜索上一帧图片中的关键点位置
    • 块匹配:在极线上进行块匹配来搜索关键点,常用SAD(差的绝对值之和 / Sum of Absolute Difference)、SSD(平方和 / Sum of Squared Distance)、NCC(归一化互相关 / Normalized Cross Correlation)
    • 高斯分布的深度滤波器:用于优化不同帧图片中同一个点的深度估计,计算量小。
  • RGB-D 稠密重建
    • 点云地图(Point Cloud Map):可用 PCL 库实现
    • 八叉树地图:导航常用、压缩性能较好、可灵活更新,可用 Octomap 库实现

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

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

相关文章

ggplot作图中的图例处理方法

文章目录 改变坐标轴和图例的名称方法1, labs()方法2&#xff0c;scale_xxx_discrete/continuous() 删除坐标轴和图例的名称方法1&#xff0c; labs()方法2&#xff0c;scale_xxx_discrete/continuous()方法3&#xff0c;theme()方法4&#xff0c;guides()可以去图例名称 改变图…

怎么挣点零花钱,哪里可以赚点零花钱?以下这些方式值得参考一下

想赚零花钱的人群包括但不限于&#xff1a;大学生、宝妈/宝爸、自由职业者、比较有闲暇时间的上班族。 他们想要赚零花钱的原因不尽相同&#xff0c;但主要就是这几点&#xff1a;经济需求、个人发展、好奇心和乐趣等等。想赚取零花钱的人具有实际需求和个人发展的目标&#xf…

【hello C++】模板初阶

目录 1. 泛型编程 2. 函数模板 2.1 函数模板的概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 4. STL简介 4.1 什么是STL 4.2 STL的版本 4.3 STL的六大组件 4.4 STL的重要性 4.5 …

基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

2023年目前要说最热的点,肯定是ChatGPT了。 ChatGPT官方提供的网页版本,还有需要科学上网,很多人都会基于此进行封装。 现在是移动互联网时代,基于手机APP的需求还是很大的。 所以,今天给大家推荐一个ChatGPT客户端开源项目,兼容苹果和安卓手机、PC。 项目简介 这是…

若依管理系统修改页面标题和logo

一&#xff1a;修改网页上的logo 把public目录下favicon.ico&#xff0c;换成自己logo 注&#xff1a;替换图片的名字最好还是以favicon.ico命名&#xff0c;如果改变,就要改public目录下的index.html代码 二&#xff1a;修改页面上的logo 把src/assets/logo/logo.png换成自己l…

【Chano的SFM教程】3dmax 面部表情.VTA基本制作教程

本篇教程作者为&#xff1a;小鸟Chano&#xff0c;转载请表明作者和出处&#xff1a;CSDN 欢迎观看本次教程 本教程将会为你演示使用3D MAX 制作一个基本的SFM表情控制器【表情滑条】并导入SFM进行使用。 Chano自己也是近期才掌握的这项知识&#xff0c;所以过程中可能有很多…

GDB调试实验

一、实验准备 在 Linux 环境软件开发中&#xff0c;GDB 是调试 C 和 C 程序的主要工具。本次实验围绕着GDB常用的调试操作进行。 1、设置断点的意义 当我们想查看变量内容&#xff0c;堆栈情况等等&#xff0c;可以指定断点。程序执行到断点处会暂停执行。break 命令用来设置…

React 条件渲染组件

组件通常需要根据不同的条件显示不同的内容&#xff0c;以及根据应用的状态变化只渲染其中的一部分。 在 React 中&#xff0c;可以使用 JavaScript 语法有条件地呈现 JSX&#xff0c;比如 if 语句、&&和 ?: 操作符。 根据条件返回 JSX Demo.js 文件&#xff1a; …

【高危】vm2 <3.9.17 沙箱逃逸漏洞(POC)(CVE-2023-30547 )

漏洞描述 vm2 是一个基于 Node.js 的沙箱环境&#xff0c;可以使用列入白名单的 Node 内置模块运行不受信任的代码。 由于 CVE-2023-29199 的修复不完整&#xff0c;vm2 3.9.17 之前版本的 transformer.js 文件中的 transformer 函数异常处理逻辑存在缺陷。攻击者可以利用这个…

【01-Java Web先导课】-如何进行JDK的安装(或Java环境的配置)

文章目录 一、JDK&#xff08;jdk-8u371-windows-x64.exe&#xff09;的下载1、下载网址2、选择相应版本进行下载 二、JDK&#xff08;jdk-8u371-windows-x64.exe&#xff09;的安装1、JDK安装2、系统环境变量配置3、classspath环境变量设置 免责说明 一、JDK&#xff08;jdk-8…

❤echarts 南丁格尔玫瑰图的使用以及南丁格尔玫瑰图详细配置

❤echarts 南丁格尔玫瑰图的使用以及南丁格尔玫瑰图详细配置 1、认识 使用可以参考之前文章&#xff0c;会使用直接跳过1 引入官网的南丁格尔玫瑰图效果如下&#xff1a; 使用函数配置分为三个部分&#xff1a;初始化> 设置配置> 地图使用参数 配置代码如下 option…

法学考生必看—外经贸法学专业在职研究生

法学专业就业面比较广&#xff0c;但很多人工作后都觉得还是缺少核心竞争力&#xff0c;想通过读研来改变现状&#xff0c;23考研已经落幕&#xff0c;想要今年就能入班学习的院校有吗&#xff1f;有法学专业的吗&#xff1f; 一、学校介绍 对外经济贸易大学创建于1951年&…

STM32 USB资料整理

CypressUSB中文文档 https://img.anfulai.cn/bbs/90026/AN57294%20USB%20101%20An%20Introduction%20to%20Universal%20Serial%20Bus%202.0%20(Chinese).pdf RL-USB教程 https://www.armbbs.cn/forum.php?modviewthread&tid99710 USB应用实战教程第3期&#xff1a;手把…

Java Jvm中的垃圾回收机制

jvm的垃圾回收机制是什么 jvm的垃圾回收机制是GC&#xff08;Garbage Collection&#xff09;&#xff0c;也叫垃圾收集器。 GC基本原理&#xff1a;将内存中不再被使用的对象进行回收&#xff1b;GC中用于回收的方法称为收集器&#xff0c;由于GC需要消耗一些资源和时间&…

认识BASH这个Shell

文章目录 认识BASH这个Shell硬件、内核与shell为什么要学命令行模式的Shell&#xff1f;Bash Shell的功能命令与文件补全(TAB)命令别名设置(alias)历史命令(history)任务管理、前台、后台控制(jobs&#xff0c;fg&#xff0c;bg)通配符程序化脚本 查询命令是否为Bash shell 的内…

前端--移动端布局--2移动开发之flex布局

目标&#xff1a; 能够说出flex盒子的布局原理 能够使用flex布局的常用属性 能够独立完成携程移动端首页案例 目录&#xff1a; flex布局体验 flex布局原理 flex布局父项常见属性 flex布局子项常见属性 写出网首页案例制作 1.flex布局体验 1.1传统布局与flex布局 传…

nacos 部署 配置

文章目录 一、Nacos简介 1、为什么叫Nacos2、Nacos是什么3、能干嘛4、去哪下二、安装并运行Nacos 2.1 基础环境及配置&#xff1a;三、Nacos作为服务注册中心演示 3.1 基于Nacos的服务提供者 2、POM文件3、YML文件4、主启动5、业务类6、测试7、nacos控制台3.2 基于Nacos的服务消…

[POJ - 1080 ]Palindrome(区间DP)

[POJ - 1080 ]Palindrome&#xff08; 区间DP&#xff09; 1、问题2、分析状态表示状态转移空间优化 3、代码 1、问题 给定一个字符串&#xff0c;通过添加最少的字符&#xff0c;使得这个字符串成为一个回文字符串。 2、分析 状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示将…

2023年产品经理需要考的证书,NPDP含金量真高

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

盖子的c++小课堂——第十七讲:递归

前言 通知一下&#xff0c;以后每周不定期更新&#xff0c;有可能是周六更新&#xff0c;也可能是周日吧&#xff0c;反正会更新的~~还有我新出的专栏《跟着盖子读论语》&#xff0c;记得订阅一下啊跟着盖子学《论语》_我叫盖子的盖鸭的博客-CSDN博客 三元表达式 三元表达式…