VSLAM算法中的数学基础知识详细了解

2023-05-16

学习SLAM经验告诉我,入门SLAM一般只需要两种两个方面的条件,一是要有扎实的数学基础,二是要有强大的动手编程能力,但是这两个条件对于刚入门的同学来说,极具挑战性。

学习SLAM的心里历程:本来先研究了基于滤波系列的源码,嗯,感觉还能看得懂,然后去研究VINS-MONO、ORBSLAM系列,咬咬牙,坚持着。直到碰见了ICE-BA源码,我的心情——我在哪?我能回去吗?我裂开了

本文主要大致介绍一下SLAM所需的数学知识,先从SLAM算法框架来介绍,SLAM一般分为前端和后端,前端主要是视觉,后端一般分为滤波和非线性优化两种,具体的可以参考近十年的VI-SLAM算法综述与发展

因此,VSLAM主要涉及两大方面的知识,一方面是前端的计算机视觉,另一方面后端的优化(滤波也可以看成是优化的一种,在这便于介绍,也将回环检测加到后端了)

SLAM所需的基础知识

1.计算机视觉

计算机视觉涉及的知识有很多,针对图像处理相关的知识,其中包含了特征提取(ORB,SUFT,SIFT fast,harris,shi-thomas等),特征匹配(光流法,GMS,极线搜索块匹配等),多视图几何(对极约束,单应矩阵,基础矩阵,本质矩阵,三角化等)等等

还有视觉传感器的相关知识,包括相机模型,图像畸变,相机标定,如果是VIO的算法框架还需要VIO标定等,这里也将ICP,PNP,Sim3算法包括在这里了

2.优化

2.1 滤波

滤波主要涉及卡尔曼滤波的原理以及相关改进,包括EKF、UKF、IKF等等,还有概率论

2.1非线性优化

非线性优化主要涉及梯度下降、牛顿法、高斯-牛顿法、LM算法、bundle adjustment等知识。很多具体计算都会涉及到线性代数、矩阵论(QR分解,LDLT分解,SVD分解等)还有泰勒展开,求(偏)导,积分等。是不是在本科和硕士期间都学过。

3.李群李代数

这一部分知识应该很多人都没有接触过,在SLAM中很重要,因此,单独列出来了。

接下来详细介绍这些知识的相关理论。

刚体运动

刚体,顾名思义,是指本身不会在运动过程中产生形变的物体,如相机的运动就是刚体运动,运动过程中同一个向量的长度和夹角都不会发生变化。刚体变换也称为欧式变换。视觉SLAM中使用的相机就是典型的刚体,而运动一般包括形式包括旋转、平移、缩放、切变等,SLAM中旋转是表达形式相对比较复杂,总共有4种方法,分别为旋转矩阵、四元数、欧拉角、旋转向量。

1.旋转矩阵

旋转矩阵在SLAM系统中用的比较多,它是一个正交矩阵,其自身带有约束,就是R和R的转置的乘积是单位阵,且行列式值为1。旋转矩阵R的逆矩阵表示了一个和R相反的旋转,这一性质在实际实践过程中两个相对坐标系的转换是非常方便的。通常情况下,我们会将旋转和平移通过齐次坐标的方法整合成齐次的变换矩阵T,变成欧式变换,目的是可以方便我们表达连续的欧式变换。齐次这个概念以及引入齐次坐标的原因下面会详细介绍,这里先不详细介绍,由于旋转矩阵3维方阵,信息比较冗余。

2. 四元数

四元数可能很多人没有接触过,但是学习SLAM一定要学会基本的性质,首先四元数,顾名思义,就是四个数组成,一个实部,一个虚部。如下图所示:

根据实部在四元数中的位置不同,又分为哈密尔顿Hamilton和JPL,在写代码的时候这一点需要注意。

3. 旋转向量

用一个旋转轴n和旋转角θ来描述一个旋转,所以也称轴角。存在旋转向量到钻展矩阵的变换公式,叫做罗德里格斯公式。这种表达方式存在奇异性。

4.欧拉角

欧拉角就是将一次旋转分解成3次绕不同坐标轴的旋转,例如偏航-俯仰-滚转”(yaw,pitch,roll),可以很直观的表示旋转,但是一般在SLAM中不怎么用,因为有一个万向锁问题。

上面我们介绍了刚体运动相关知识,接下来我们介绍在SLAM中哪里用到了这些知识。首先我们讨论一个很基础的问题:如何描述机器人的位姿。注意这里“位姿”的包含了位置和姿态,描述位置是很简单的。根据应用场景不同,需要不同的表达方式,如果机器人在平面内运动,那么用两个坐标来描述它的位置:

                                                                                                                                                                                                                       p=\left ( x,y \right )^{_{T}^{}}

相应的,如果它在三维空间中,就用三个空间坐标来表示:

                                                                                                                                                                                                                 p=(x,y,z)^{_{T}^{}}

在这里我们可以这么理解,位置就是相对世界坐标系的平移,姿态的表达比点稍为复杂。2D的姿态可以只用一个旋转角\theta表达。3D姿态的表达方式则有多种。就是我们上面介绍的4中旋转表达方式。有了位置和姿态,我们就可以描述一个坐标系。进一步,还能描述坐标系间的变换关系,其实整个SLAM就是为了精确求解这两个物理量的。

齐次坐标

在学习SLAM的过程中,经常会遇到术语——齐次坐标,那么什么是齐次坐标呢?在位姿转换中,通常采用射影空间的齐次坐标表示,记n维射影空间为Pn,其中一个空间点的坐标为普通的3D坐标加一个齐次分量,这就是齐次坐标

例如:在2维和3维射影空间中的点,分别表示为:

                                                                                                                                                                         P^{_{2D}}=(x,y,w)^{_{T}^{}}                   P^{_{3D}}=(x,y,z,w)^{_{T}^{}}

这里应该会有疑惑,为什么3维点要用四个数表示?

简单举个例子:

在一个2维的平面上,存在两个点p1(x1,y1),p2(x2,y2)

 

两点之间的坐标关系为

 

我们可以用矩阵形式表达

缩放用矩阵形式表达:

旋转用矩阵的形式表达:

根据矩阵的乘法法则,介意将缩放和旋转化简为

这样看起来是不是简单了很多,但是第一项加法怎么办呢,怎么样采用让它也用乘法的形式表达呢。

这个时候就引入了齐次坐标,我先说一下齐次坐标在这里的作用吧

齐次坐标的作用把各种变换都统一了起来,即 把缩放,旋转,平移等变换都统一起来,都表示成一连串的矩阵相乘的形式。保证了形式上的线性一致性。

有没有感觉到数学的艺术美!

同样的也可以将旋转和缩放用矩阵表达为:

这样可以直接将旋转和平移以及缩放均变成矩阵乘法的形式

而在SLAM理论推导过程中,大量旋转和平移计算,因此,齐次坐标保证了形式上的线性一致性。其目的主要是合并矩阵运算中的乘法和加法,即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

齐次坐标还存在如下的优点:

1.非常方便的表达点在直线或平面上

根据点在平面上的充分必要条件:

存在一个点p(x1,y1),其在直线l:ax+by+c=0上的充要条件为ax1+by1+c=0

如果点用齐次坐标p’(x1,y1,1),则点在直线上表达为:ax1+by1+c*1=0;采用向量的方法表达:p’*l^{_{}^{T}}=ax1+by1+c*1=0;

平面也是一样的,这里就不一一证明了。

2.方便表达直线与直线,平面与平面的交点

在齐次坐标下,可以用两个点 p, q 的齐次坐标叉乘结果来表达一条直线 l,也就是l = p x q也可以使用两条直线 l, m 的叉乘表示他们的交点 x = l x m

3.能够区分一个向量和一个点

3.1从普通坐标转换成齐次坐标时

   如果(x,y,z)是个点,则变为(x,y,z,1);

   如果(x,y,z)是个向量,则变为(x,y,z,0)

3.2从齐次坐标转换成普通坐标时   

   如果是(x,y,z,1),则知道它是个点,变成(x,y,z);

   如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

4.能够表达无穷远

比如两条平行的直线 ax+by+c=0, ax+by+d=0,可以分别用向量 l = (a, b, c), m = (a, b,d)表示根据前面直线交点的计算方法,其交点为 l x m根据叉乘计算法则

的叉乘结果可以用如下方法计算得到

最终:l x m = (d-c)(b,-a,0),忽略标量(d-c),我们得到交点为(b,-a,0),并且是齐次坐标,如果要转化为非齐次坐标,那么会得到 (b/0, a/0),坐标是无穷大,可以认为该点为无穷远点,这与我们通常理解的:平行线相交于无穷远的概念相吻合。

因此,如果一个点的齐次坐标中,最后一个元素为0,则表示为无穷远点。

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

VSLAM算法中的数学基础知识详细了解 的相关文章

  • error: #20: identifier "TIM_TimeBaseInitTypeDef" is undefined

    如果出现多句错误 xff1a identifier 34 34 is undefined 解决问题方法一 xff1a C C 43 43 include paths 把文件路径添加进去 解决问题方法二 xff1a 在stm32f10x co
  • 使用pyqt5实现键盘(含组合键)鼠标事件响应

    使用pyqt5实现键盘 xff08 含组合键 xff09 鼠标事件响应 使用python3 6 xff0c pyqt5 xff0c 在macOS上测试有效 span class hljs keyword import span sys sp
  • 递归思想刷题总结

    核心思想 我们在调用递归函数的时候 xff0c 把递归函数当做普通函数 xff08 黑箱 xff09 来调用 xff0c 即明白该函数的输入输出是什么 xff0c 而不用管此函数内部在做什么 xff08 千万不要跳进去了 xff0c 你脑袋
  • anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions

    在keil工程下移植代码 xff0c 编译出现了这个问题 xff0c 字面上解决办法有 xff1a 1 打开GNU模式 option gt GNU extensions 2 在代码前加上 pragma anon union 就是代表支持匿名
  • 串口的深入理解

    1 串口是如何发送数据的 xff1f 一般说来 xff0c 串口发送数据是往数据寄存器sbuf填写数据 xff0c 一个字节一个字节的写入 xff0c 如果有串口中断 xff0c 那么发送完一个字节的数据 xff0c 就会进入串口中断一次
  • CMakeLists.txt的简单使用

    Makefile和CMakeLists的关系 环境准备 xff1a 需要安装gcc xff0c g 43 43 xff0c make sudo apt get install gcc g 43 43 sudo apt get isntall
  • .so文件的基本理解,使用。

    一 基本概念 Linux下的 so是基于Linux下的动态链接 其功能和作用类似与windows下 dll文件 代码编译 xff0c 链接 xff0c 最后生成可执行文件 xff1b 这个可执行文件就可看作是一个静态链接 xff0c 因为代
  • jz2440:QT控制LED灯点亮熄灭(11)

    1 LED灯的驱动 xff1a 首先要准备好在驱动文件 xff0c 通过insmod led ko来加载模块 xff0c 然后在QT的代码里面配合调用open xff0c write read函数来点亮 xff0c 关闭LED灯 这一步 x
  • win10下安装ubuntu双系统

    本文章记录自己在Win10系统下安装ubuntu双系统的过程 xff0c 以及注意事项 另一个不错的安装教程 1 下载系统镜像 在官网或清华镜像 xff0c 根据需要的ubuntu版本下载需要的ubuntu镜像文件 这里要注意 xff0c
  • C++ shared_ptr的reset 用法

    include lt iostream gt include lt memory gt class Tmp public Tmp int a Tmp void print a std cout lt lt 34 value 61 34 lt
  • C++ 模板类的继承

    模板类 xff1a template lt typename T gt 说白了就是向之后的内容传递参数类型 xff0c 把T当作一个数据类型传递 xff0c 而在声明一个变量的时候 xff0c 通过base lt xxxx gt pp xx
  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • xv6---Lab3: page tables

    目录 参考资料 RISC V页表的简化图如下所示 编辑 多级页表 xv6内核页表 3 6 Process Address Space 3 7 Code Sbrk 3 8 Code Exec Print a page table A kern
  • 内存管理---分页机制

    目录 物理内存管理带来的问题 直接映射 一级页表 二级页表 参考 xff1a xff08 C语言内存七 xff09 分页机制究竟是如何实现的 xff1f Smah 博客园 物理内存管理带来的问题 比如4GB的flash 如果应用程序可直接访
  • xv6---Lab4 traps

    参考 xff1a Lab Traps 关于寄存器s0和堆栈 https pdos csail mit edu 6 828 2020 lec l riscv slides pdf RISC V assembly Q 哪些寄存器包含函数的参数
  • stm32F4 hal库之CAN通信的实现

    本文的目的是为了能够实现功能 xff0c 故写的时候比较简略 参考资料 xff1a https blog csdn net u012308586 article details 81001102 正点原子开发手册 目标 xff1a 通过ca
  • 调试sim800L模块

  • 51单片机 串口中断

    1 什么是中断 广义上的中断是指一个过程 xff0c 举个简单的例子 xff0c 打开了电脑 xff0c 你正在放音乐 xff0c 点击了暂停按钮 xff0c 于是歌停了 这就是一个很明显的中断的例子 CPU正在做自己的事情 xff08 放
  • STM32CubeMX应用 -- 定时器输入脉冲计数

    目录 参考链接 一 实现过程 二 STM32CubeMX配置示例 三 C语言示例程序 参考链接 https blog csdn net m0 37845735 article details 105395643 一 实现过程 当选择外部的同
  • 机器人导航dwa(局部避障)分析

    前面部分引用http blog csdn net lqygame article details 72861439 xff08 1 xff09 初始化 xff1a 在move base节点中 xff0c 通过类加载模块载入了BaseLoca

随机推荐

  • 2019年最新VSLAM比较汇总

    2019年最新VSLAM比较汇总 闭源SOFTSOFT2ESOsGAN VOLG SLAMRotRocc 43 GDVOElbrusROCCMonoROCCcv4xv1 sc 开源 xff1a VINS FusionORB SLAM2Ste
  • CMSIS到底是个什么东西

    目录 一 前言 二 CMSIS标准 三 CMSIS文件 1 Include文件 2 Source文件 四 总结 一 前言 使用过ARM单片机的朋友肯定听说过CMSIS xff0c 可以说CMSIS是开启ARM单片机的金钥匙 xff0c 是不
  • TouchGFX介绍

    目录 一 关于TouchGFX 1 TouchGFX是一个图形框架 2 TouchGFX可以减轻CPU负载 3 TouchGFX充分利用了STM32的硬件图形外设 4 TouchGFX创建最佳性能的用户界面 5 TouchGFX可工作于ST
  • rt-thread应用篇(03)---基于STM32F429实现web服务器功能

    目录 参考示例 前言 一 需使用的组件与软件包及其ENV配置 1 文件系统相关组件与软件包 1 1 DFS 框架 1 2 fal 软件包 1 3 SFUD 组件 2 网络通信相关组件和软件包 2 1 SAL组件 2 2 netdev组件 2
  • rt-thread的at组件在freeRTOS上的移植与应用

    目录 一 AT命令 二 rtthread at组件简介 三 移植到freeRTOS 3 1 数据结构 3 2 API 3 3 at client 流程 3 4 串口数据接收处理 3 5 数据缓存 顺序队列 四 使用示例 4 1 串口配置信息
  • rt-thread驱动篇(04)---STM32F429单片机模拟SPI FLASH驱动添加

    目录 一 添加驱动 1 新增模拟SPI驱动文件 drv soft spi c h 2 新增模拟SPI配置文件 soft spi config h 二 向工程添加文件 1 修改 board Kconfig 2 修改 rt thread com
  • RT-Thread实时操作系统简介

    目录 一 概述 二 架构 三 版本选择 四 内核启动流程 五 自动初始化机制 六 内核对象模型 七 I O设备模型 1 框架 2 设备驱动使用序列图 3 设备类型 八 FinSH控制台 九 ENV工具 1 menuconfig 2 Scon
  • Altium Allegro PADS到底该选哪个EDA设计软件

    废话少说 xff0c 就像之前 学好数理化 xff0c 走遍天下都不怕 一样 xff0c 在如今快速发展的电子时代 xff0c 掌握一门电子设计EDA软件工具 xff0c 在职场上真的走遍天下都不怕 哪哪都有可能跟电沾边 xff0c 跟控制
  • QML学习笔记【07】:QML访问复杂组件的子项

    1 访问复杂组件的子项 gt Row Column Grid Flow布局子项或Repeater子项 访问复杂组件的子项 gt Row Column Grid Flow布局子项或Repeater子项 Window width 640 hei
  • tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题

    一 前言 在采用触摸屏的移动终端中 xff0c 触摸屏性能的调试是个重要问题之一 xff0c 因为电磁噪声的缘故 xff0c 触摸屏容易存在点击不准确 有抖动等问题 Tslib是一个开源的程序 xff0c 能够为触摸屏驱动获得的采样提供诸如
  • C++与QML混合编程

    一 前言 简单来说 xff0c 混合编程就是通过Qml高效便捷的构建UI界面 xff0c 而使用C 43 43 来实现业务逻辑和复杂算法 Qt集成了QML引擎和Qt元对象系统 xff0c 使得QML很容易从C 43 43 中得到扩展 xff
  • 卸载ROS功能包

    步骤方法 xff1a 1 首先卸载包 sudo apt get purge ros indigo 2 然后卸载依赖包 sudo apt get autoremove
  • 要点初见:通过ROS包nmea_navsat_driver读取GPS、北斗定位信息(C/C++)

    先前在树莓派上用C C 43 43 读取过GPS北斗双模定位模块 xff0c 但因为定位模块的若干条定位数据无法立刻读取 xff0c 需要用delay 延迟1到2秒的时间才能把所有定位数据都读取进程序 xff0c 又不想写多线程 xff0c
  • 自动驾驶-使用卡尔曼滤波算法定位和跟踪

    参加过科一的人都知道 xff0c 学车的第一步不是操控车辆而是遵守交规 xff0c 行车礼让 xff0c 确保安全 可见安全驾驶才是行车的第一原则 为了确保安全 xff0c 司机应该观察周围车辆和行人的位置 xff0c 保持安全距离 自动驾
  • ROS使用笔记

    文章目录 1 提取bag中固定topic或者固定时间段数据2 提取pcd数据3 记录数据4 service amp action5 roslaunch文件6 自定义消息7 from raw velodyne packets to velod
  • linux安装Android Studio

    linux安装Android Studio 1 先在https developer android google cn studio hl 61 zh cn下载源码安装包 2 安装64位所需要的库 2 1如果使用的是Ubuntu的话执行以下
  • OpenCV中Mat的初始化与赋值

    1 type数据类型 常量类型的命名规则为 xff1a CV 位数 43 数据类型 43 通道数 关系如下 xff1a C1 C2 C3 C4 CV 8U 0 8 16 24 CV 8S 1 9 17 25 CV 16U 2 10 18 2
  • 近十年的VI-SLAM算法综述与发展

    本文主要总结一下这几年工作中遇到过以及改进过相关VIO算法 1 背景介绍 一个完整的 SLAM simultaneous localization and mapping 框架包括传感器数据 前端 后端 回环检测与建图 xff0c 如图1所
  • 当前开源的SLAM方案汇总2021.02

    感谢SLAMer前辈们不断的拼搏与进取 xff0c 才有了现在的丰富的学习资料 xff01 以下是至今SLAM开源代码的资料汇总 xff0c 后续将会更新主流slam开源代码的注释版本 xff0c 希望对研究SLAM的同学们有帮助 PTAM
  • VSLAM算法中的数学基础知识详细了解

    学习SLAM经验告诉我 xff0c 入门SLAM一般只需要两种两个方面的条件 xff0c 一是要有扎实的数学基础 xff0c 二是要有强大的动手编程能力 xff0c 但是这两个条件对于刚入门的同学来说 xff0c 极具挑战性 学习SLAM的