SLAM从入门到放肆——SLAM简述

2023-05-16

SLAM

同时定位与建图(simultaneous localization and mapping,SLAM)是自动驾驶与增强现实领域中常用的技术。主要研究装置通过各种传感器在未知环境中的感知与定位问题。

归根结底,SLAM是一个状态估计问题,即根据当前的观测(图像、IMU传感器读数等),判断当前自身所处的状态(自身的6自由度位姿,所在的地点的地图结构)。

假设当前时刻k的状态为 X k X_k Xk,得到的观测为 Z k Z_k Zk。则我们对于当前状态的最大后验估计如下:

X ^ k = arg ⁡ max ⁡ X k p ( X k ) p ( Z k ∣ X k ) \hat X_k=\arg\max_{X_k}p(X_k)p(Z_k|X_k) X^k=argXkmaxp(Xk)p(ZkXk)

其中 p ( X k ) p(X_k) p(Xk) X k X_k Xk的先验概率, p ( Z k ∣ X k ) p(Z_k|X_k) p(ZkXk) Z k Z_k Zk关于 X k X_k Xk的条件概率。观测与状态存在映射(比如对于场景中的三维点可以通过投影方程得到二维点作为观测),考虑观测过程中存在噪声,我们有 Z k = h ( X k ) + δ Z_k=h(X_k) + \delta Zk=h(Xk)+δ,其中 δ \delta δ为噪声,根据中心极限定律,我们认为噪声是高斯分布的,于是 Z k Z_k Zk符合均值为 h ( X k ) h(X_k) h(Xk)的高斯分布。同样的,假设 X k X_k Xk的先验分布为均值为 X ˉ k \bar X_k Xˉk的高斯分布,我们可以把上式变为:

X ^ k = arg ⁡ max ⁡ X k [ α exp ⁡ ( − ( X k − X ˉ k ) 2 2 P k ) β exp ⁡ ( − Z k − h ( X k ) 2 2 R k ) ] \hat X_k=\arg\max_{X_k}[\alpha \exp(-\frac{(X_k-\bar X_k)^2}{2P_k})\beta \exp(-\frac{Z_k-h(X_k)^2}{2R_k})] X^k=argXkmax[αexp(2Pk(XkXˉk)2)βexp(2RkZkh(Xk)2)]

其中 P k , R k P_k,R_k Pk,Rk为两个高斯分布的协方差,进而有:

X ^ k = arg ⁡ min ⁡ X k ( ∣ ∣ X k − X ˉ k ∣ ∣ P k 2 + ∣ ∣ Z k − h ( X k ) ∣ ∣ R k 2 ) \hat X_k = \arg \min_{X_k}(||X_k-\bar X_k||^2_{P_k} + ||Z_k-h(X_k)||^2_{R_k}) X^k=argXkmin(XkXˉkPk2+Zkh(Xk)Rk2)

我们通常称 E ( X k ) = ∣ ∣ X k − X ˉ k ∣ ∣ P k 2 + ∣ ∣ Z k − h ( X k ) ∣ ∣ R k 2 E(X_k)=||X_k-\bar X_k||^2_{P_k} + ||Z_k-h(X_k)||^2_{R_k} E(Xk)=XkXˉkPk2+Zkh(Xk)Rk2为能量函数或代价函数。根据选取的观测及其表示方法的不同,我们往往会得到不同的能量函数。因此,SLAM技术需要解决两个问题:

1. 如何得到和组织观测量?
2. 如何最优化能量函数?

根据这两个问题,我们可以将整个SLAM问题分为前端和后端,并简单的认为前端即处理传感器的观测使之可用的过程,后端即根据观测的表示构建最优化问题并进行求解的过程。

SLAM方法分类

一般来说,我们需要对一段时间内的系统状态进行估计,从而得到场景的地图和装置的轨迹。假设从 t 0 t_0 t0 t 3 t_3 t3时刻系统观测到了一些landmark如下图a:
kf

其中上面的圆圈表示某一时刻的姿态,下面的圆圈表示场景中的landmark。连线表示在某一时刻对某一个landmark进行了观测。为充分的利用所有信息,正确的方法是使用所有的连线对上方所有的状态进行优化,而这显然在要求实时的情况下是不可能的,因此我们需要对问题进行简化。常用做法分为滤波式框架(b)和关键帧式的框架(c)。

基于滤波的框架仅仅保留最后一帧的系统状态和观测,并通过一些手段将此前的观测信息尽可能的融合到最后一帧的状态,从而达到实时。基于关键帧的方法通过选取一些有代表性的帧作为关键帧,只对这些关键帧进行状态估计,从而大大减少运算时间,以达到实时。鉴于目前学术界以基于关键帧的方法为主流,以下均介绍基于关键帧的方法。

前端

可以看到,对于不同的传感器我们往往有不同的前端,但是总体来说,前端主要是从传感器中提取出有用的信息并以恰当的方法进行组织的过程。
常用的传感器包括相机、IMU、GPS等。多个传感器的融合往往可以起到互补的作用。比如单目相机无法恢复场景的尺度,同时无法应对无纹理的场景。通过与IMU数据进行融合可以解决这个问题。再比如GPS可以得到装置在地球上的经纬度,这是其他传感器无法解算的。新的传感器往往可能促进新的SLAM技术的发展。

当使用多个传感器时,我们往往要对传感器之间的坐标系变换进行标定,对它们的时钟进行同步。

除此之外,对于关键帧的选择,地图点的生成等也属于前端要处理的范畴。

后端

在确定了观测之后,后端只需要求解如下的最小二乘问题:
X ^ k = arg ⁡ min ⁡ X k ( ∣ ∣ X k − X ˉ k ∣ ∣ P k 2 + ∣ ∣ Z k − h ( X k ) ∣ ∣ R k 2 ) \hat X_k = \arg \min_{X_k}(||X_k-\bar X_k||^2_{P_k} + ||Z_k-h(X_k)||^2_{R_k}) X^k=argXkmin(XkXˉkPk2+Zkh(Xk)Rk2)

对于线性最小二乘问题的求解已经足够成熟。参见上文,我们只需要求解如下形式的标准方程:

H x = b Hx=b Hx=b

对该方程可以直接求解 x = H − 1 b x=H^{-1}b x=H1b,也可以通过矩阵分解的方法利用H矩阵的稀疏性来加快运算,常用的求解分解方法有QR分解、Cholesky分解、LDLT分解等。

然而在SLAM问题中, h ( X k ) h(X_k) h(Xk)往往不是一个线性函数,于是我们往往需要求解一个非线性最小二乘问题。

对于非线性最小二乘的求解往往采用线性化——迭代的方法进行,常用的迭代方法有牛顿法,高斯牛顿法,LM算法,DogLeg算法等。

结束语

事实上,在实际使用中无论是前端还是后端都有更加复杂的细节。一个SLAM系统往往由很多模块组成,包括Tracking、Mapping、Loop closure、Global BA等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SLAM从入门到放肆——SLAM简述 的相关文章

随机推荐

  • Makefile详解——从入门到精通

    转自ChinaUnix xff0c 作者gunguymadman xff0c 陈皓 链接地址 xff1a http www chinaunix net jh 23 408225 html 陈皓 CSDN 博客 xff1a http blog
  • FreeRTOS事件标志组与事件标志位使用

    事件标志位 事件位用于指示事件是否发生 也叫做事件标志位 可用位表示 xff1a 当信息收到且准备好处理时 xff0c 设置为1 xff1b 当没有收到信息且等待处理时 xff0c 设置为0 事件标志组 事件标志组是一组事件位 xff0c
  • 结合图片看常用串口通信UART

    结合图片看常用串口通信UART UART是一种通用串行数据总线 xff0c 用于异步通信 该总线双向通信 xff0c 可以实现全双工传输和接收 在嵌入式设计中 xff0c UART用于主机与辅助设备通信 xff0c 如汽车音响与外接AP之间
  • 浅谈面向对象设计思想,以及在Linux内核中的体现

    面向对象编程 xff08 OOP xff09 xff0c 是一种设计思想或者架构风格 OO语言之父Alan Kay xff0c Smalltalk的发明人 xff0c 在谈到OOP时是这样说的 xff1a OOP应该体现一种网状结构 xff
  • STM32F4移植FreeRTOS

    在之前的文章 xff1a FreeRTOS全解析 2 源码结构与移植 中我们已经讲解过FreeRTOS移植的方法 xff0c 并且给出了一个在ARM9上移植的例子 xff0c 今天再来看一个例子 xff1a 板子的芯片为STM32F407
  • 彻底掌握FreeRTOS中的任务

    FreeRTOS是个操作系统 xff0c FreeRTOS的任务 task 其实就是像我们电脑中的一个独立程序 xff0c 表现在源码中 xff0c 其实就是一个函数 本文从学会使用任务 task 到理解逐步深入 参考资料 xff1a Ma
  • FreeRTOS任务之调度器中的三种调度算法

    本文主要讲解FreeRTOS调度器中的三种调度算法 xff1a 基于时间片的抢占式调度 不带时间片的抢占式调度和协同调度 前导文章 xff1a FreeRTOS全解析 3 任务 xff08 task xff09 参考资料 xff1a Mas
  • 彻底理解FreeRTOS中的队列(Queue)

    队列 xff08 Queue xff09 提供了任务与任务之间通信的机制 在这样的场景 xff1a 一个或多个其他的任务产生数据 xff0c 主任务要依次处理数据 xff0c 队列就显得非常有用了 参考资料 xff1a Mastering
  • 简单路由器DIY

    一 关于路由器 路由器 xff08 Route xff09 是一种负责寻径的系统 xff0c 在互连网络中从多条路径中寻找通讯量最少的一条网络路径提供给用户通信 它使用寻径协议来获得网络信息 xff0c 采用基于 34 寻径矩阵 34 的寻
  • DOS那一代的程序员现在都干嘛呢?

    亿友论坛 DOS那一代的程序员现在都干嘛呢 xff1f xff08 几年前的老帖子 xff09 作者 xff1a 包子夹蛋 发布时间 xff1a 2005 5 10 14 01 00 DOS那一代的程序员现在都干嘛呢 xff1f xff08
  • switch case的用法

    switch case的用法如下 1 Switch用在编程中 xff0c 如C语言中它经常跟Case一起使用 xff0c 是一个判断选择代码 其功能就是控制流程流转的 直线翻译 xff1a switch语句 xff0c 即 切换 语句 xf
  • Rust嵌入式:只使用寄存器为STM32点灯;从查手册开始

    为什么是 只使用寄存器 网上很多教程都是直接调用对应芯片的HAL库 xff0c 让初学者认为操作都被Rust嵌入式开源组封装好了 xff0c 直接调就好 这在目前Rust嵌入式生态还不成熟的情况下可能是个误解 实际上Rust嵌入式有自己独特
  • epoll_wait 中timeout参数的损耗和如何避免

    ccd 100qps xff0c dcc 4wqps
  • ubuntu和windows双系统默认启动顺序

    在安装了双系统后 xff0c 一般的默认启动ubuntu xff0c 但我实际可能使用windows会比较多 xff0c 为解决这个问题 xff0c 必须要更改默认顺序 xff0c 以达到方便我们使用的效果 方法 xff1a 开机界面会有显
  • 深度学习优化算法

    深度学习各类优化器 借用古代炼丹的一些名词 xff0c 我们可以把训练模型中的数据比做炼丹药材 xff0c 模型比做炼丹炉 xff0c 火候比做优化器 那么我们知道 xff0c 同样的药材同样的炼丹炉 xff0c 但是火候不一样的话 xff
  • yolov3

    YOLOv3 YOLOv3的总体网络架构图 可根据官方代码中的yolov3 cfg进行一一对应 xff0c 标号 0 0 0 是第一个 convolutional Darknet 53 和DarkNet 19一样 xff0c 同样下采样32
  • SSH远程连接报错:kex_exchange_identification: Connection closed by remote host

    突然出现问题 xff1a kex exchange identification Connection closed by remote host 解决方法 删除known hosts xff0c 重启终端即可
  • Dronekit——Introduction

    Dronekit Introduction 参考 xff1a http python dronekit io about overview html 关于Dronekit DroneKit Python允许开发人员创建 在板载协同计算机上运
  • Run dronekit scripts by SITL on Linux 执行dronekit 脚本在Linux系统下模拟飞行

    参考 xff1a http ardupilot org dev docs setting up sitl on linux html Overview The SITL simulator allows you to run Plane C
  • SLAM从入门到放肆——SLAM简述

    SLAM 同时定位与建图 xff08 simultaneous localization and mapping xff0c SLAM xff09 是自动驾驶与增强现实领域中常用的技术 主要研究装置通过各种传感器在未知环境中的感知与定位问题