简介
SLAM的提出
-
SLAM(Simultaneous Localization And Mapping)同步定位与构图,提出的目的就是为了解决感知、定位以及构图层的问题。目标就是确定当前环境的样子,并确定当前环境所在位置。
-
1986,ICPA,Peter Cheeseman, Jim Crowley, Hugh Durrent-Whyte[1][2], 提出:可以试着利用概率估计来解决定位和构图问题
-
在x0初始状态,观测和控制已知的条件下,对应x_k和m的概率:
- :状态
- :地图
- :观测
- :控制
-
SLAM提出了一个基本架构,根据输入(可见光、IMU、激光雷达、声呐),求得输出(环境及环境位置)。
| 基本架构 | 说明 |
|---|---|
| 前端 | 使用传感器获取的数据,计算对应时间的机器人状态 |
| 后端 | 在前端的状态之上,对漂移和误差进行估计和优化 |
| 回环 | 当路径回到原始位置后,对总体路径进行调整 |
| 建图 | 对获取的数据进行处理建图,为后续导航、决策控制等使用 |
SLAM的发展
- SLAM根据特点可以分为两种:
- 基于可见光视觉(特征、照度):通过特征点提取和匹配,做自定位,利用多视几何的技术;
- 激光(Scan Matching):通过激光可以获取精确的场景模型,将相邻时间段的场景模型分析出相对位置变化,并拼接,就可以定位出自己的位置。
基于可见光视觉
- EKF-SLAM:利用卡尔曼滤波,是贝叶斯的一种特殊情况,也是假设噪声服从高斯分布
- FAST-SLAM:粒子滤波器,随机撒点,在大范围中寻找并趋近于最优解。必须先有图
- GRAPH-SLAM:滤波器有特征空间特别大的问题,GRAPH-SLAM将观测一定量的环境特征点,和自身位置的点连接,形成node和edge,利用图优化,可以直接做定位。
- EKF Monocular SLAM:Javier Civera,Andrew J.Davison,用单目视觉就可以完成SLAM,大大降低了成本。
- PTAM-SLAM:Georg Klein,David Murray
- RGBD-SLAM
- ORB-SLAM2
- LSD-SLAM
基于激光
- GMapping
- SLAM6D
- LOAM、V-LOAM:Ji Zhang,用视觉补偿激光,用特征提取做匹配,在kitti上榜单是最好的
- Cartographer:google开源的,用于扫地机器人
- BLAM
- SegMatch:点云
数据集
书籍
- 视觉SLAM十四讲从理论到实践
- Multiple View Geometry多视图几何
- State Estimation For Robotics机器人学中的状态估计
- 机器人学中的状态估计
- computer vision for visual effects
- computer vision: algorithrim and application
- multiple view geometry
- an invitation to 3-D vision
- computer vision: a modern approach
资料
环境配置
| 环境 | 说明 |
|---|---|
| linux操作系统 | 16.04以上 |
| 开发环境 | sudo apt-get install cmake gcc g++ build-essential |
| .deb文件 | sudo dpkg install *.deb PATH:*.debsudo dpky --listsudo dpkg --remove [package name] |
| cmake |
后端优化
- 在视觉里程计、激光里程计获取到的实时姿态之后,后端整合起来做全局的优化,使得最终结果能更接近真实环境
后端(Backend)
- 从带噪声的数据估计内在状态——状态估计问题–Estimated the inner state from noisy data
- 渐进式(Incremental)
- 保持当前状态的估计,在加入新信息时,更新已有的估计(滤波)
- 线性系统+高斯噪声=卡尔曼滤波器
- 非线性系统+高斯噪声+线性近似=扩展卡尔曼
- 非线性系统+非高斯噪声+非参数化=粒子滤波器
- Sliding window filter & multiple state Kalman (MSCKF)
- 批量式(Batch)
- 给定一定规模的数据,计算该数据下的最优估计(优化)
数学描述
- 定义在的时间内,机器人位姿为,同时又路标
- 运动和观测方程为:
- ,
- 其中运动和观测都受到噪声影响,纯视觉SLAM没有运动方程
卡尔曼滤波
-
从贝叶斯滤波器方法来推导卡尔曼滤波
-
用随机变量表示状态,估计其概率分布
-
k时刻所有待估计的量组成k时刻状态:
-
k时刻观测统一记成:方程简化为:
- ,
-
根据过去0到k时刻的数据,估计当前状态
-
贝叶斯展开Bayes,分母与状态无关,所以简化为:
- 当前状态正比于似然和先验的乘积
-
当做已知量,作为条件求余的后验分布,先验部分按条件概率展开:
- 其中:
- 是k时刻受先前状态的影响的条件概率
- 是上一时刻的状态估计
-
一阶马尔可夫性:假设k时刻状态之和k-1时刻有关
-
不假设马尔科夫性:假设k时刻状态与先前所有时刻有关
-
这里假设一阶马尔科夫的情况
高斯分布的线型变换
- 假设,则y也服从高斯分布
卡尔曼滤波器的推导
-
线性模型和高斯噪声:
- ,,A是状态转移矩阵
- 其中:,
-
状态的高斯分布:
- 上式是后验的表示,先验为:
-
根据高斯分布的线型变换,k-1时刻后验通过运动方程推算k时刻先验:
- 预测:
- 简化记作:,
-
根据观测方程可知
-
根据贝叶斯展开:
-
两边均是高斯分布,所以比较指数部分的二次项和一次项部分即可
- 指数部分:
- 比较的二次和一次项系数
- 对于二次项:
- 对于一次项:,整理后:
- 两边同乘,并定义
- :更新公式
小车为例做卡尔曼估计

数学描述
- t时刻状态:
- ,pt为位置,vt为速度
- 控制量为油门产生的加速度
运动方程
-
运动状态方程可以写成:
-
因为他们之间呈线性关系,可以用矩阵化表达:
-
上式可以抽象为:
- 运动方程:
- A:状态转移矩阵
- B:控制矩阵
- :表示后验估计值
- :表示推算出来的还要优化的值
-
增加噪声,首先是估计值的噪声:,高维时为协方差
-
然后引入噪声:,噪声在传播过程中的不确定性。
-
整理得到:
- 经过线型变换:,使得状态方程也满足高斯分布
-
预测方程1,状态转移
-
预测方程2,方差转移
观测方程
- 观测方程:
- 其中:
- :t时刻观测值,观测小车速度
- :小车状态X和Z之间有变换关系h(x),这里假设是线型函数:,,相乘得到速度
- :观测噪声
滤波融合
- 运动方程得到状态估计,观测方程可以推算,需要对两个估计值进行融合滤波
- ,
- 其中g是卡尔曼增益。由两者的方差计算出来的,方差越小,不确定越低,权重越高:
更新方程
- 状态更新
- 卡尔曼增益更新
- :增益有两个作用
- 将残差从观测映射到状态域
- 承担g的作用,在两种状态估计之间根据方差得到权重
- :增益有两个作用
- 不确定性更新:
EKF
-
卡尔曼滤波器的非线性扩展
-
当f,h为非线性函数时:
- ,
-
在工作点附近进行一阶泰勒展开:
- ,定义
- ,定义
-
预测部分:,
-
卡尔曼增益:
-
更新部分:,
特点
-
简单,适用各种传感器形式
-
抑郁做多传感器融合
-
一阶马尔科夫性过于简单,可能会发散,数据不能有outlier
-
线性化误差
-
需要存储所有状态量的均值和方差,平方增长
BA
- EKF是一阶马尔科夫性,而BA是任意多的连接的
Pose Graph
- 顶点仅由相机位姿组成,边为相机位姿间的约束
回环检测
回环检测的意义
- VO和后端都存在误差
- SLAM的建图与定位是耦合的——误差将会累计
Loop Closing步骤
- 检测到回环的发生
- 计算回环修选帧与当前帧的运动
- 验证回环是否成立
- 闭环
