要解决的问题
相机(camera)将现实 3D 场景投影到 2D 成像平面上,2D 成像平面经过采样得到数字图像(离散的空间点阵,离散的RGB取值),这从3D物点坐标到2D像素坐标的映射公式自然是已知的。
相机是运动的,并在运动的过程中以一定的FPS(Frame Per Second)摄像,利用这个数字图像序列来估计(estimate)自身位姿(pose),理想情况下一幅数字图像(one frame)对应一个位姿。
这个问题解决的难点在于各个环节的误差/噪声,肯定会出现误差扩散,最后积累起来的误差肯定对性能有影响;同时,要减少计算量,否则硬件算力跟不上一切白谈。
第一步
ORB要解决的问题是从一幅数字图像上找特征点(feature point)的集合,之后在不同的数字图像间做特征点匹配。
特征点的属性有位置、描述向量(descriptor);如果来自两幅数字图像的两个特征点的描述向量相近,那么这两个特征点就是同一个 3D 物点的像点。
先介绍几个英文缩写:
- ORB:Oriented fast and Rotated Brief
- FAST:Features from Accelerated Segments Test
- BRIEF:Binary Robust Independent Elementary Features
FAST 算法用于挑选出特征点的位置;BRIEF算法用于给特征点计算描述向量,长为128~512的bits序列。
从特征点匹配的性能而言,对ORB的总体评价是运行快、效果好。两幅数字图像,每幅都能找到大量的 ORB 特征点,特征点匹配是大致以描述向量的汉明距离近为目标,需要各种过滤的策略,如果不限制场景和某些场景的大量的试验,效果不靠谱。
第二步
第一幅数字图像的位姿是参照物,参照物的位姿是给定的。每幅数字图像的位姿是未知变量,一幅一个位姿;匹配上的特征点所对应的3D物点的位置是未知变量,匹配的特征点集合作为一个约束对应一个3D物点。约束质量越高越好,个数可能越多越好。
求解的算法是把这个问题描述成最小二乘问题,其中损失函数(loss function)是重投影误差函数(re-projection function)。至于计算出来的答案合不合理、精度够不够,那是要在具体场景下的大量试验验证的。
这里有很多的策略,比如Key frame、Map point、BoW、LoopClosing等,去掉低质量的约束、增加高质量的约束,这样使得最小二乘问题的解更可靠。
从sensor配置上看,从mono到stereo到multi到IMU(Inertial Measuement Unit),增加了其他形式的约束,这样也可使得最小二乘问题的解更可靠。
思考
随着时间的推进,希望计算的结果越来越收敛而且收敛到正确的方向,所以整体上是个不断有新测量信息进来、不断迭代计算的过程,所以不能用在自动驾驶,ORB-SLAM只能用在扫地机这种慢速还容忍试错的场景。