阅读高翔的RGBD-SLAM博文笔记
高翔的RGBD-SLAM笔记
RGBD相机的特点:
使用RGBD相机中的深度这一维信息,以及相机的针孔成像模型,相机的内参,可以将二维点恢复成三维()
前端VO:
二维的RGB图像则用于视觉里程计Visual Odometry,以连续两帧为例:
-
对两帧图像做特征点匹配(先分别提取特征,然后计算描述子,根据匹配算法来计算点对之间的匹配距离)
-
有了匹配点对,可以用ICP 或是PnP 等方法求解相机的变换矩阵T (由旋转矩阵Rotation和平移矩阵Translation组成),也就是相机的位姿估计
-
一个简单的两帧VO形成,存在问题:
-
当帧数增多时,如何取舍?
-
误差会随着时间累积,如何通过回环检测来减少误差累积带来的影响
-
-
得到姿态后,可以将其都转到同一坐标系下,且都转为3D点云,拼接,由此可以得到这两帧对应在某个世界坐标系下的地图 (也就是点云拼接)
- 需要注意!!!这里是RGBD SLAM,也就是深度信息是已知的,相当于估计出相机自身的位姿之后,就可以将图像里的观测数据转换成估计的路标点(或是估计的环境内容 属于mapping的内容)
后端优化
引入姿态图,G = {V, E}
-
最简单情况下,节点V代表相机的各个时刻的姿态,而边指的是两个节点之间的变换
- 可以理解成,节点 $v_1 = T_1 = T_{world->frame1} $, 而边 \(e_{12} = T_{12} = T_{frame1->frame2}\)
-
在VO中,姿态图是链状结构
-
但是如果是存在回环,则由于存在误差,使得所有的边给出的数据并不一致【比如 T13 * X1 不等于 T23 * X2 】
由此,可以优化一个不一致性误差:
\[\min E = \sum_{i,j} ||x_i^*-T_{i,j} x_j^*||^2_2 \]这里的 \(x_i^*\) 表示 \(x_i\) 的估计值,也就是随机或指定一个初始值 然后通过优化算法不断迭代更新的
关键帧的提取
-
把每一帧都拼到地图里面比较耗费时间与空间,因为帧间距离很近(时间间隔短)
-
所以只把关键帧拼到地图里。具体来说,对于新来的帧,将其和当前所有关键帧的最后一帧匹配,估计一下从关键帧到新帧的变换矩阵:
-
如果变换较小 则认为离前一个关键帧很近,丢弃;
-
如果变换太大,可能是计算错误;
-
如果匹配点较少则说明该帧图像质量不高;
-
剩下的情况是,特征匹配成功,运动估计正确,同时又离上一个关键帧有一定距离,则认为是新的关键帧
-
-
最后再将新的关键帧加入后端优化的过程:检测回环、加入姿态图优化、拼接点云地图
回环的检测
-
回环的本质是识别曾经到过的地方。
-
最简单的回环检测策略,就是把新来的关键帧与之前所有的关键帧进行比较,不过这样会导致越往后,需要比较的帧越多。所以,稍微快速一点的方法是在过去的帧里随机挑选一些,与之进行比较。更进一步的,也可以用图像处理/模式识别的方法计算图像间的相似性,对相似的图像进行检测。