《视觉SLAM十四讲》-- 概述与预备知识

文章目录

    • 01 概述与预备知识
      • 1.1 SLAM 是什么
        • 1.1.1 基本概念
        • 1.1.2 视觉 SLAM 框架
        • 1.1.3 SLAM 问题的数学表述
      • 1.2 实践:编程基基础
      • 1.3 课后习题

01 概述与预备知识

1.1 SLAM 是什么

1.1.1 基本概念

(1)SLAM 是 Simultaneous Localization and Mapping 的缩写,即同时定位与地图构建。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型。

(2)两大基本问题:

  • 定位:我在什么地方?

  • 建图:周围环境是什么样的?

(3)准确的定位需要精确的地图,精确的地图来自准确的定位。

(4)传感器

  • 内质的(放置在机器人身上,用于感受机器人本体信息):IMU(惯性测量单元)、激光、相机

  • 外质的(安装于环境中,监测机器人的运动状态):二维码、GPS导轨

(5)相机

以一定速率采集图像,形成视频。相较于激光传感器更便宜,信息更丰富。

相机以二维投影形式记录三维世界的信息,丢掉了距离信息。

分类:

  • 单目相机:最常见的普通相机

  • 双目相机(立体相机):类似于人眼,通过视差计算出距离信息

  • 深度相机(RGB-D):发射端、接收端,获得RGB图和深度图

  • 其他:全景相机、事件相机

1.1.2 视觉 SLAM 框架

在这里插入图片描述

  • 前端:Visual Odometry(VO),视觉里程计的任务是估算邻近时刻的相机运动。主要方法:特征点法直接法

  • 后端:Optimization,从带有噪声的数据中估计最优轨迹与地图。常用方法:最大后验估计、滤波器、图优化

  • 回环检测:Loop Closing,主要解决位置估计随时间漂移的问题。判断机器人是否到达过先前的位置,如果检测到回环,将信息提供给后端进行处理。

  • 建图:Mapping,根据估计的轨迹,建立地图。主要分为度量地图拓扑地图两类。度量地图又分为稀疏地图和稠密地图,稀疏地图比较抽象,仅包含一部分有意义的信息——地标。进行导航时,就需要稠密地图(避免碰撞某些障碍物)。

1.1.3 SLAM 问题的数学表述

(1)数学表述

两个方程:运动方程和观测方程

{ x k = f ( x k − 1 , u k , w k ) z k , j = h ( y j , x k , v k , j ) (1-1) \left\{ \begin{matrix} \boldsymbol{x_k}=f(\boldsymbol{x_{k-1}},\boldsymbol{u_k}, \boldsymbol{w_k}) \\ \boldsymbol{z_{k,j}}=h(\boldsymbol{y_j},\boldsymbol{x_k},\boldsymbol{v_{k,j}}) \end{matrix} \right. \tag{1-1} {xk=f(xk1,uk,wk)zk,j=h(yj,xk,vk,j)(1-1)

这里, x k \boldsymbol{x_k} xk k k k 时刻的位置, u k \boldsymbol{u_k} uk 是运动传感器的读数或输入,比如相对上一位置前进1 m 或左转 10°; w k \boldsymbol{w_k} wk 为噪声。 z k , j \boldsymbol{z_{k,j}} zk,j 为机器人在 x k \boldsymbol{x_k} xk 位置时对路标 y j \boldsymbol{y_j} yj 的观测数据, v k , j \boldsymbol{v_{k,j}} vk,j 为此次观测的噪声。

对于简单的平面运动,机器人的位姿由横纵坐标和转角组成 x k = [ x 1 , x 2 , θ ] T \boldsymbol{x_k}=[x_1, x_2, \theta ]^T xk=[x1,x2,θ]T,变化量 u k = [ Δ x 1 , Δ x 2 , Δ θ ] T \boldsymbol{u_k}=[\Delta x_1, \Delta x_2, \Delta\theta ]^T uk=[Δx1,Δx2,Δθ]T,则运动方程可简化为

[ x 1 x 2 θ ] k = [ x 1 x 2 θ ] k − 1 + [ Δ x 1 Δ x 2 Δ θ ] k + w k (1-2) \left[\begin{matrix} { x }_{ 1 } \\ { x }_{ 2 } \\ \theta \end{matrix}\right]_k = \left[\begin{matrix} { x }_{ 1 } \\ { x }_{ 2 } \\ \theta \end{matrix}\right]_{k-1} + \left[\begin{matrix} \Delta{ x }_{ 1 } \\\Delta{ x }_{ 2 } \\\Delta\theta \end{matrix}\right]_{k} + \boldsymbol{w_k} \tag{1-2} x1x2θ k= x1x2θ k1+ Δx1Δx2Δθ k+wk(1-2)

对于观测方程,以激光传感器为例,可以测量出此位置和路标之间的距离 r r r 和夹角 ϕ \phi ϕ,路标点位置记为 y j = [ y 1 , y 2 ] T j \boldsymbol{y_j}=[y_1, y_2]^{T_j } yj=[y1,y2]Tj,位姿为 x k = [ x 1 , x 2 ] T j \boldsymbol{x_k}=[x_1, x_2]^{T_j } xk=[x1,x2]Tj ,观测数据为 z k , j = [ r k , j , ϕ k , j ] T \boldsymbol{z_{k,j}}=[r_{k,j}, \phi_{k,j}]^{T} zk,j=[rk,j,ϕk,j]T,在笛卡尔坐标系中,可以写为

[ r k , j ϕ k , j ] = [ ( y 1 , j − x 1 , k ) 2 + ( y 2 , j − x 2 , k ) 2 a r c t a n ( y 2 , j − x 2 , k ) ( y 1 , j − x 1 , k ) ] + v (1-3) \left[\begin{matrix} r_{k,j} \\\phi_{k,j} \end{matrix}\right] = \left[\begin{matrix} \sqrt{{(y_{1,j}}-x_{1,k})^2+{(y_{2,j}}-x_{2,k})^2} \\ arctan{ (y_{2,j}-x_{2,k}) \over (y_{1,j}-x_{1,k})} \end{matrix}\right] + \boldsymbol{v} \tag{1-3} [rk,jϕk,j]=[(y1,jx1,k)2+(y2,jx2,k)2 arctan(y1,jx1,k)(y2,jx2,k)]+v(1-3)

当然,对于三维空间中的运动或其他形式传感器,上式有不同的参数化形式。

(2)SLAM 是一个状态估计问题

按运动和观测方程是否为线性,噪声是否符合高斯分布,分为线性/非线性高斯/非高斯系统。

  • 线性高斯系统: 卡尔曼滤波

  • 非线性非高斯系统: 扩展卡尔曼滤波、非线性优化

1.2 实践:编程基基础

  • Ubuntu 系统
  • C++
  • 编辑器:Clion、VS Code
  • 工具:cmake
  • 库:Eigen、G2O、Ceres、OpenCV等

1.3 课后习题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二章 02Java基础-数据类型、标识符、键盘录入

文章目录 前言一、数据类型二、标识符三、键盘录入总结前言 今天我们学习Java基础,数据类型、标识符、键盘录入 一、数据类型 1.数据类型大体上可以分为两类,一类是基本数据类型,另外一类是引用数据类型。今天我们学习基本数据类型。 2.基本数据类型可以分为四类八种,整…

【网络安全技术】公钥密码体制

一、两种基本模型 1.加密模型 A要给B发信息,那就拿B的公钥加密,传给B,B收到后会拿他自己的私钥解密得到明文。 2.认证模型(数字签名) A用自己的私钥加密,传输之后,别人拿A的公钥解密&#xff…

亚马逊云科技大语言模型下的六大创新应用功能

目录 前言 亚马逊云科技的AI创新应用 ​编辑 Amazon CodeWhisperer Amazon CodeWhisperer产品的优势 更快地完成更多工作 自信地进行编码 增强代码安全性 使用收藏夹工具 自定义 CodeWhisperer 以获得更好的建议 如何使用Amazon CodeWhisperer 步骤 1 步骤 2 具体…

辅助驾驶功能开发-功能规范篇(22)-9-L2级辅助驾驶方案功能规范

1.3.7.2 行人、骑行者(横向)AEB 系统 1.3.7.2.1 状态机 1.3.7.2.2 信号需求列表 同 1.3.2.1.2。 1.3.7.2.3 系统开启关闭 同 1.3.2.1.3。 触发横向 AEB 的目标包括横向运动的行人、骑行者(包括自行车、摩托车、电瓶车和平衡车上的行人)。 1.3.7.2.4 制动预填充 制动系统…

pyusb环境搭建和无法发包问题

pyusb环境搭建和无法发包问题 项目需要对usb设备进行开发调试,选择搭建pyusb环境进行调试测试,这里记录下完整流程和中间解决的一些问题。 我使用的环境是window10 64bit, vscode 1.84.0 , Python 3.11.6 1 安装流程 参考github上的 https://github.…

伪随机序列——m序列及MATLAB仿真

文章目录 前言一、m 序列1、m 序列的产生2、m 序列的性质①、均衡性②、游程分布③、移位相加特性④、自相关函数⑤、功率谱密度⑥、伪噪声特性 二、M 序列1、m 序列的产生2、m 序列的性质 三、MATLAB 中 m 序列1、m 序列生成函数的 MATLAB 代码2、MATLAB 仿真 前言 在通信系统…

Photoshop 2023 v24.7

Photoshop是一款强大的图像编辑软件,被广泛应用于图像处理、图形设计、数字绘画等领域。它提供了丰富的图像编辑功能,可以用于调整图像的色彩、亮度、对比度等,添加特效、滤镜,以及进行复杂的图像合成和修复。 以下是Adobe Photo…

基于动力学模型的机械臂滑膜控制

一、滑模控制设计思路 参考资料:https://zhuanlan.zhihu.com/p/463230163(思路理解) https://blog.csdn.net/xiaohejiaoyiya/article/details/90271529(干扰的处理) 滑模控制的思路有两个关键,一个是设计…

一文通透各种注意力:从多头注意力MHA到分组查询注意力GQA、多查询注意力MQA

前言 通过本博客内之前的文章可知,自回归解码的标准做法是缓存序列中先前标记的键(K)和值(V) 对,从而加快注意力计算速度。然而,随着上下文窗口或批量大小的增加,多头注意力 (MHA)模型中与 KV 缓存大小相关的内存成本显着增长 对…

【多线程】Lambda表达式

package org.example;public class TestLambda {public static void main(String[] args) {Like likenew Like();like.lambda();}}//定义一个函数式接口 interface ILike{void lambda(); }//实现类 class Like implements ILike{Overridepublic void lambda() {System.out.prin…

Excel自学三部曲_Part3:Excel工作场景实战(四)

文章目录 四、高级函数与数据连接1. 多窗口操作2. VLOOKUP函数3. XLOOKUP函数4. CSV数据格式 四、高级函数与数据连接 1. 多窗口操作 如何将两张子表数据(战区信息、城市信息)连接到主表数据(成交数据),增加主要数据的…

“一键批量拆分HTML文本,高效整理文件,提升工作效率“

您是否曾经被大量的HTML文本文件困扰,难以找到所需的特定信息?现在,我们向您推荐一款强大的工具,它能够一键拆分HTML文本,让您轻松实现文件整理,提高工作效率! 首先,在首助编辑高手…

人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054

然后我们先来看BGD批量梯度下降,可以看到这里,其实这个公式来源于 梯度下降的公式对吧,其实就是对原始梯度下降公式求偏导以后的梯度下降公式,然后 使用所有样本进行梯度下降得来的,可以看到* 1/n 其实就是求了一个平均数对吧.所有样本的平均数. 然后我们看,我们这里* 1/n那么…

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一,使用HTTP接口开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上,所以我们就需要有一定的安全措施来保证接口…

C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表的形式来实例化对象)

initializer_list 是 C11 中的一个特性&#xff0c;它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器&#xff0c;比如 std::vector、std::set、std::map 以及数组。 场景一&#xff1a;用初始化列表初始化容器 std::vector<int> arr {…

【深度学习】pytorch——Autograd

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…

scrapy+selenium框架模拟登录

目录 一、cookie和session实现登录原理 二、模拟登录方法-Requests模块Cookie实现登录 三、cookiesession实现登录并获取数据 四、selenium使用基本代码 五、scrapyselenium实现登录 一、cookie和session实现登录原理 cookie:1.网站持久保存在浏览器中的数据2.可以是长期…

Day20力扣打卡

打卡记录 数组中两个数的最大异或值&#xff08;位运算&#xff09; 链接 二进制位上从高位向低位进行模拟&#xff0c;看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…

【存档】vscode配置latex环境

原来在另一台电脑上找了个教程配了一遍&#xff0c;这次重新配的时候&#xff0c;那个教程作者更新过后&#xff0c;改成只有linux的脚本了&#xff0c;所以存档一下。真香警告, 2023年初的vscodelatex写作 - 知乎 (zhihu.com) 环境&#xff1a; win10/win11vscodelatex work…

【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)

目录 0. 前言 1. Cifar10数据集 2. AlexNet网络模型 2.1 AlexNet的网络结构 2.2 激活函数ReLu 2.3 Dropout方法 2.4 数据增强 3. 使用GPU加速进行批量训练 4. 网络模型构建 5. 训练过程 6. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我…
最新文章