SLAM学习笔记(一) 基本框架与简单的数学知识
高翔老师的《视觉SLAM十四讲》是一本入门SLAM的非常好的教材。这里主要记录一下我读了之后的感受,希望对SLAM领域有兴趣的朋友可以亲自去读一下这本书。
视觉SLAM中采用的传感器是相机,包括单目相机、双目相机和深度相机。
SLAM基本框架
视觉里程计是局部建图的工具(与计算机视觉相关),后端相当于全局建图(实际上是在处理噪声问题,包括滤波和非线性优化算法),回环检测(判断图像相似性来判断又回到了原点)可减少累计漂移带来的误差。
SLAM所需基础数学知识
SLAM的核心问题包括定位和建图,可用运动方程来描述机器人自身位置,用观测方程来描述周围环境的情况,SLAM问题实际上便转换成了状态估计问题。求解状态估计,目前比较成熟的是采用优化技术(相较于滤波技术而言)
三维空间刚体运动描述方式
主要有旋转矩阵、变换矩阵、四元数和欧拉角四种描述方式。Eigen是线性代数运算的一个非常有用的库。
- 旋转矩阵:向量从一个坐标系转换到另一个坐标系的媒介
- 变换矩阵:涉及到平移和旋转两种操作,利用了旋转矩阵的特点,将三维向量扩充到思维(构造齐次性)
- 旋转向量:使表达更为紧凑
- 欧拉角:直观,但存在万向锁问题,因而不用于插值和迭代算法,一般用于人机交互
- 四元数:紧凑且无奇异性(任意旋转可有两个互为相反数的四元数表示)
关于它们之间的转换关系:
- 从旋转向量到旋转矩阵:罗德里格斯公式
- 四元数到旋转矩阵转换方式:
李群与李代数
这部分知识主要应用于位姿的估计,关键在于对位姿函数进行求导操作。
首先,群是一种运算加上一种几何的代数结构,李群是一种连续的群。每个李群都有对应的李代数,李代数反映了李群的局部性质。SLAM中关键李群和李代数的转换关系如下:
李代数的求导主要有两种模型,分别是李代数的求导模型和扰动模型(更为简便)。
Sophus是李代数计算的常用库。
相机及图像模型
视觉SLAM中的核心传感器是相机,观测方程就是指相机成像的过程。相机模型主要包括针孔和畸变两部分。
针孔模型
这里涉及的坐标系转换比较多,世界坐标系中的一个点首先变换到相机坐标系中,在相机坐标系中进行归一化,从相机坐标系中变换到图像坐标系中。世界坐标系到相机坐标系的转换主要依赖于相机外参数,相机坐标系到图像坐标系的转换主要依赖于相机内参数。
畸变校正模型
畸变需要校正。径向畸变(透镜形状引起的)用高次多项式函数校正:
切向畸变(透镜和成像面不平行引起的)这样校正:
深度信息的获取
可以使用双目相机(深度的值依赖于视差的计算,实际上是图像的匹配)或者深度相机(结构光或者飞行时间直接计算深度)
图像处理
注意图像中坐标系的定义和调用数组的下标!主要使用的是OpenCV库,点云拼接用的是PCL库。
非线性优化
非线性优化解决的问题是如何在有噪声的情况下进行状态的准确估计。主要依据的原理是极大似然估计和最小二乘。这里介绍了集中非线性最小二乘的算法,主要分为两类:
- 线性搜索法(给定搜索方向):以高斯-牛顿法为代表,优化版包括线搜索法和阻尼牛顿法
- 信赖区域法(给定搜索区域):以L-M为代表
值得注意的是,非线性优化对初始值极为敏感,初始值不佳时会陷入局部极小的情况之中。SLAM中非线性优化的常用库包括:
- Ceres
- g2o(图优化库):节点为优化变量,边为误差项
仍有待研究的问题
- 目前常用的SLAM局限于静态、刚体、光照变化不明显、没有人为干扰的场景。
- 如何使用拓扑地图来进行导航和路径规划
- 更好的非线性优化的方法?