视觉里程计总结
任务目标
《视觉SLAM十四讲》里面介绍到视觉里程计的任务是:
- 估算相邻图像间相机的运动
- 估计局部地图
基本方法
视觉里程计常用的方法是特征点法、光流法、直接法。
笔者认为这几种方法最根本的区别在误差函数上,所以这里不再从最最基础的fast角点、ORB特征点、灰度不变假设等开始介绍,这些内容可以阅读《视觉SLAM十四讲》。下面本文将站在误差函数的角度对这几种方法进行介绍。
特征点法
特征点法的目标是最小化重投影误差,即投影坐标和观测坐标(根据观测的位姿做投影)的差。
比如,在PnP问题中,重投影误差为3D点的投影位置与观测位置的差,可以用下面的公式进行表述:
$$
\min_{T} \frac{1}{2} \sum^n_{i-1} |u_i - \frac{1}{s_i}KTP_i|^2_2
$$
其中,$T$是相机的位姿,$P_i$是某个空间点的坐标(在世界坐标系下),而$u_i$是该点投影的像素坐标,$s_i$为该点的深度(在当前相机坐标系下),$K$为相机内参。
而在ICP问题中,处理的都是3D点,不再有相机内参,重投影误差表现为下面的形式:
$$
\min_{R,t} \frac{1}{2} \sum^n_{i-1} | (p_i - (Rp_i’+t)) |^2_2
$$
其中,$R,t$为相机位姿,$p_i$和$p_i’$为配对好的3D点(在不同帧的相机坐标系下)。
特征点法的普遍流程为:
- 提取图像特征点
- 计算特征点的描述子
- 通过描述子匹配特征点
- 利用三角测量、对极几何、PnP、ICP等算法估计相机运动
光流法
光流求解的是最小化光度误差,目的是跟踪特征点的运动。
最小化光度误差可以表述为下面的形式:
$$
\min_{\Delta x,\Delta y} | I_1(x,y)-I_2(x+\Delta x,y+\Delta y) |^2_2
$$
其中$I_1(x,y)$为第一张图象在像素坐标$(x,y)$处的像素值,$I_2(x+\Delta x,y+\Delta y)$为第二张图象在像素坐标$(x+\Delta x,y+\Delta y)$处的像素值。
光流法的普遍流程为:
- 提取图像特征点
- 根据光流跟踪特征点的运动,避免了计算和匹配描述子的过程
- 利用三角测量、对极几何、PnP、ICP等算法估计相机运动
直接法
直接法的优化目标为最小化光度误差,具体的公式如下:
$$
\min_{T} J(T)=e_i^Te_i, \quad e_i=I_1(p_{1,i})-I_2(p_{2,i}).
$$
其中,$T$为相机位姿,$I_1(p_{1,i})$为第1张图片上点$p_{1,i}$处的像素值,$I_2(p_{2,i})$同理。
需要注意,点$p_{1,i}$和点$p_{2,i}$的关系为:
$$
\begin{align}
p_{1,i}=&\frac{1}{Z_1}KP_i, \\
p_{2,i}=&\frac{1}{Z_2}K(RP_i+t)= \frac{1}{Z_2}K(TP)_{1:3}
\end{align}
$$
这里$K$为相机位姿,$P_i$为对应的3D点坐标(在第一帧相机坐标系下),$R,t$(对应李群为$T$)为第二帧时相机的旋转和平移,$Z_1$为点$P_i$在第一帧相机坐标系下的深度,$Z_2$同理。
直接法的普遍流程为:
- 提取关键点或者直接产生随机点
- 考虑空间点在两帧中的像素位置
- 建立误差模型,通过计算最小光度误差来优化相机运动
代表工作
方法 | 代表工作 | 备注 |
---|---|---|
特征点法 | ORB-SLAM | |
光流法 | VOLDOR-SLAM、FlowFusion、VINS-Mono | 光流似乎主要用在动态场景下,或者和深度学习结合起来 |
直接法 | LSD-SLAM、DSO、SVO、BAD-SLAM |