1. 前言
昨天在看甄嬛传的时候,被刚哥安利了他的研究课题:视觉里程计。然后丢给我两篇综述文章,让我研究下。然后,我居然放下了电视剧,看起了英文文献,oh,my god ~~
文献原文地址: http://download.csdn.net/detail/zhyh1435589631/9707527
下面记录下, 自己读完这篇文献之后的一些笔记
2. VO
2.1 介绍
- VO (visual odometry)视觉里程计,这个名词是2004年被提出来的
- 为了使得VO 可以有效的工作,必须满足两个条件:
- 足够的光照
- 丰富的纹理
- VO 与 轮式里程计的区别:
- 轮式里程计,容易受到不平地形以及恶劣环境的影响,导致计数出现偏差, 而VO 不会出现这样的情况
- 使用VO 可以获取相比轮式里程计更加精准的估计轨迹,他的相对位置偏差在0.1 ~ 2% 的水平上。
- VO 通常可以与其他的传感器(GPS, IMU) 融合使用, 在无法使用 GPS 的场合里面尤其管用
- 最早的时候, 视觉里程计被用于火星探测, 他有两种实现方式:
- 单目
- 双目
2.2 视觉里程计的历史
- SFM (structure from motion) 根据一组相机拍摄图像来重建三维点和相机姿态
- 最终的结构需要通过捆集调整进行优化(不过会有些耗时)
- 使用单目VO 系统, 有一个缺陷是他和真实的结构是差一个尺度因子的
2.3 立体视觉
- 相机自运动会导致严重的累计误差(超线性)
- 有这么几种立体视觉的求解方法:
- dense stereo 稠密立体视觉, 指的是获取的是很多个匹配点的视差图
- 先使用Harris 交点检测, 然后优化特征点处的误差函数,通过ransac算法排除外点
- 先用Shi-Tomasi 方法检测交点, 并通过ICP 算法优化
- 以上这些方法, 都是根据相对帧之间的3D - 3D 数据获取 RT 变换关系的。
- 2004 年提出的文章(Nister)指出的方法, 不是采用追踪响铃帧之间的特征点迁移(光流法)而是在所有的帧上都独立的检测特征点, 来尽量减少特征漂移, 同时他使用 3D - 2D 映射计算 两帧之间的 RT 关系
2.4 单目视觉
- 主要有3 类方法:
- 基于特征点的方法
- 基于图形整体纹理的方法(稠密视差图)
- 以上两者混合
- 单目方法, 一般只能回复到与真实空间差一个尺度因子的情形
2.5 减少漂移
- VO 的特性决定了他是存在累计误差的
- 我们可以通过滑动窗口捆集调整进行优化处理, 或者使用多传感器融合的方式进行
2.6 V-SLAM
- VO 更多的关注的是轨迹的局部的一致性, 而 SLAM 更多的关注的是全局的一致性
- SLAM 由于可以带有闭环检测 (loop closure)因而可以减少偏移, 但是他涉及如何检测到闭环和信息融合的问题
- 我们可以将 VO 视为是 SLAM 的一个组成部分
- 如何选择?
- VO 实时性好, 不用记录轨迹
- SLAM 全局一致性好, 需要记录轨迹
2.7 VO 问题描述
- VO 的问题, 本质上就是获取相邻两帧之间的RT 变换关系, 通过将获取得到的多个RT 相乘获取得到当前帧与原始位置之间的变换关系, 然后进行迭代优化
- 主要流程:
3. 相机标定
3.1 透视相机模型
这便是我们传统的针孔相机模型了
我们的传统的针孔相机模型的投影关系为:
λ⎡⎣⎢uv1⎤⎦⎥=KRT⎡⎣⎢⎢⎢⎢WxWyWz1⎤⎦⎥⎥⎥⎥
图中 X 对应世界坐标系中的点的坐标为:
⎡⎣⎢⎢⎢⎢WxWyWz1⎤⎦⎥⎥⎥⎥
同时他在相机坐标系 C−xyz 中的坐标为
⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥
λ⎡⎣⎢uv1⎤⎦⎥=KX=⎡⎣⎢αu000αv0α0v01⎤⎦⎥⎡⎣⎢xyz⎤⎦⎥
上面的这条公式实际上是从相机坐标系投影到相面坐标系时候的转换方程在视角小于 45° 的时候径向畸变是可以忽略不计的, 但是如果视场范围超过了这个值,就应该考虑了
3.2 全景相机和球模型
由于这块我们之前也没有怎么涉及不是特别熟悉, 就不多说了
3.3 相机标定
- 多采用张正友的棋盘格标定方法, 可以调用matlab 和 opencv 现成的工具箱
3.4 运动估计
- 根据两帧图像之间的数据可以计算他们的 RT 关系, 从而得到他们的运动轨迹
- 计算RT 的方法主要有以下三种:
- 2D-2D
- 3D-3D
- 3D-2D
3.4.1 2D-2D 特征匹配计算 RT
- 通过对极几何约束
p′Ep=0
构建关于 本质矩阵 E 的方程, 先求解得到一个E 的初值, 然后根据E 的特征 进行修正
E˜=Udiag{1,1,0}VT
得到一个修正之后的本质矩阵, 然后分解这个本质矩阵RT 关系了, 不过分解时候存在 多义解, 需要按照实际情况进行取舍 - 修正尺度因子
- 由于通过本质矩阵分解的方式获取的 RT 的尺度因子并不是统一的, 需要进行一定的修复工作
3.4.2 3D-3D
- 本质上是计算
argminTk∑i∥X˜ik−TkX˜ik−1∥
ie, 最小化三维点之间的L2 距离 - 计算方法:
3.4.3 3D-2D
- 此处优化的是反投误差:
argminTk∑i∥pik−pˆik−1∥ - 通过得到一组建立在左相机下的三维点的坐标信息, 与下一帧左相机图像点对应, 可以计算得到两帧之间的RT 关系
3.4.4 三角形法重构
- 使用三角形法重构, 理论上两个相面上的对应点反向投影应该交于空间中的一个点, 但是由于误差的存在,这个往往是做不到的, 因而我们通常智能得到一个最小二乘意义下的三维点
4. 讨论
- 通常 3D-2D 效果比 3D-3D 效果好, 因为 深度方向的不确定度太大
- 对于单目系统, 2D-2D 系统 较 3D-2D 系统更优, 可以避免重构计算
- 但是多使用 3D-2D 系统, 因为通过这个系统可以利用反投误差过滤掉一部分的噪点数据, 提高计算的精度
从这个角度而言, 双目较单目更加有优势:
- 可以直接得到真实意义下的转化RT, 不用单独修正尺度因子
- 使用两幅图重构, 而不是三幅图
- 双目漂移相对小
需要额外注意的是, 当两个相机之间的基线距离太短的时候, 需要将双目当成单目进行处理
- 使用滑动窗口进行捆集调整非常有必要, 不可以省略