标签:
见ORB-SLAM
? Monocular需要获得一个初始的地图,因为单张图片是无法获取深度的。一种方法是使用一种已知的结构来初始化跟踪(如使用A4纸进行定标,获取深度、尺度信息)。在半稠密图上,使用的方法是对像素都使用高方差的随机值来初始化深度,然后希望通过之后的操作进行还原。
? 从两张图中初始化,有两种方法,一种是使用Faugeras et.al的方法,将当前的屏幕当做平面,然后使用homography恢复出相关相机姿势。还有一种是计算essential matrix(五点法)。但是这两种方法在视差较小和有两种潜在可能的方法的时候都不行(if all points of a planar scene are closer to one of the camera centers)。当然,另一方面如果一个看到了两张非平面的图而且有视差,那么久可以使用八点法恢复出一个唯一的fundamental matrix,并且能够恢复出相机的姿势。
? 我们在基于模型选择的方法上设计了一种新的自动的方法,来为平面使用homography,为非平面恢复出fundamental matrix(初始的时候,摄像头可能照射到一个完全的平面,也可能是一个非平面)。Torr et al提出了一种统计方法来进行模型选择。我们基于类似的原因提出了一种将选择fundamental matrix的风险考虑在内的启发式的初始化算法来靠近退化的情况,这样就会使用homography(即提出一个评估函数,计算这个场景的平整情况,不平整时可以计算fundamental matrix,否则视差太小就计算homography进行初始化)。
滤波器方法:
? 每一次更新信息,整个滤波器都必须重新做一遍来对地图特征和相机姿势进行评估,计算累计误差,这样十分浪费时间。
keyframe-base approach:
? 使用BA进行优化,建图不与帧率紧密相关。(哪怕帧率增加,关键帧的个数也不会增加,因此建图所使用的数据并不会增加)
PTAM:
? 使用patch相关性类匹配FAST角点(映射到Map points),这样他就只能用来做跟踪,而无法识别场景。也因此PATM无法检测大的环,重定位也是基于与低分辨率的keyframe省略图的相关性来做的。
Strasdat提出一种用于大尺度modocular SLAM。前端使用GPU实现光流,FAST特征匹配以及motion-only BA。后端使用sliding-window BA。loop closures使用基于similarity constraints的pose graph optimization。我们从中析取了loop closing的做法(使用 Essential Graph完成)。
使用double window的方法,对inner window持续做BA优化,并对outter window的一定尺寸做pose graph的BA优化。但是只有当outter window的尺寸大到一定程度时,loop closure才能够被有效的探测到。我们基于covisibility建立了local map,并在covisibility graph的基础上建立了pose graph,但是关于前端和后端的使用我们重新进行了设计(??为啥我感觉是一样的)。
CD-SLAM:
? 包含loop closing、relocalization、large scale operation、efforts to work on dynamic environment(!!注意这个)的完整的SLAM系统。
所有的视觉SLAM都展示出:在所有的点和所有的keyframe上面做BA事不好的。Strasdat指出花销最有效的方法是:保持尽量多的点,但是只保持不冗余的keyframes(ORB-SLAM的做法就是尽量快的 选取,但是碰到冗余时就将那些冗余的去掉)
? 选择ORB特征(有方向,多尺度FAST角点,256位描述子),快并且对于viewport有不变形。(详情在ORB特征的paper中有介绍)
三个线程并行,分别做跟踪,局部建图,回环检测
跟踪:
局部建图:
对于在新的keyframe中没找到匹配的ORB特征,在covisibility graph中找到相连的keyframe,并将其三角化。
local mapping还需要挑选出冗余的keyframe。
回环处理:
使用g2o提供的levenberg-marquadt算法来做所有需要的优化。
详细的看ORB-SLAM
? 地图初始化其目的是为了计算出两帧之间的位姿关系来三角化特征点,得到map points的初始集合。这个方法应当与scene(实在想不出怎样翻译才是准确的)无关(planar or general),也不应当需要人的干预(如选择具有比较好的视差的两个初始帧)。
? 我们初始时对两帧求homography和fundamental matrix两个解(一个用于planar的特殊情况,一个用于普通的情况),然后利用启发式的评估函数来判决哪个解更好,选择出一个模型后我们根据它尝试恢复出两个相机之间的关系。只有当两帧之间的关系是安全的时候我们才会成功初始化,在这里我们会探测低视差、双解决方案的歧义的情况,这样才能避免不好的初始化毁掉整个地图。具体步骤如下:
Find initial correspondences:
在当前帧Fc中抽取ORB特征并且在参考帧Fr中搜索匹配,如果找到的匹配不够多就换一个参考帧
Parallel computation of the two models:
并得到homography的转换H和fundamental matrix F。homography使用normalized DLT算法,后面使用八点法,并且都使用RANSAC来排除outlier。对于两个模型,我们先定好相同的迭代次数,在每次迭代我们为两个模型都计算分数S(最小二乘法得到的误差),标准偏差为1像素的卡方测试的95%置信度来判断outlier。
Model selection:
根据homography和fundamental matrix的结果来判断是不是平面(是的话就应当使用homography做初始化而不是fundamental matrix)或者低视差(如果是的话使用fundamental matrix来计算位姿关系,结果会很差,应当拒接初始化)。同样,非平面且视差较大时应当使用fundamental matrix而不是homography(可能由于图中有一小块确实组成了平面,这样homography求解也会得到结果)。检测到鲁棒的启发式函数:RH = SH/(SH+SF),RH>0.45时能够比较好的捕捉到平面或者低视差的情况,否则就选用fundamental matrix。
Motion and Structure from Motion recovery:
根据不同的模型使用不同的方法,homography使用Faugeras的方法恢复出8中可能的动作,fundamental matrix的模型使用SVD分解得到然后使用标定过的内参K得到essential matrix得到可能的4个动作。(然后通过triangulate来重构??怎么将solution三角化??)
Bundle Adjustment
这些东西与ORB SLAM中的都一样
ORB Extraction
ORB SLAM
Initial Pose Estimation from Previous Frame
成功跟踪的话使用持续速度预测当前位姿,然后根据前一帧搜索map point匹配进行位姿优化
Initial Pose Estimation via Global Relocalisation
BoW找到candidates、RANSAC进行几何验证排除outlier、PnP计算关系、使用map points的reprojection来优化位姿和匹配。
Track Local Map
将local map(covisibility graph中相连的那些keyframe)中的map points投影到当前frame上去来将frame上的ORB features关联到Map Points上面去。做完之后使用在frame中的map points对位姿做优化。
New Keyframe Selection
成为keyframe的条件
这些东西与ORB SLAM中的都一样。
keyframe insertion
更新covisibility graph,更新Spanning tree,计算BoW
Recent Map Points Culling
Map points要经过创建后前三个keyframes的测试才能得以保留,这样才能避免假点,并且满足以下两个条件:
当一个map point被创建后,只有当看到它的keyframes少于三个才会被删除掉。
New Map Point Creation
一个keyframe-Ki和与它相连的一个keyframe-Kc,两个中找到仍未匹配的ORB feature,经过epipolar geometry constraint、positive depth in both cameras、parallax、reprojection error、scale consistency都检测通过后将它们三角化成同一个map point,然后投影到剩下的相连的keyframe中查找,将它们的ORB features也融入到这个map point中。
Local BA
利用local BA优化当前处理的keyframe Ki,将所有与它相连的keyframe取出构成一个inner window与这个group相连的keyframes都取出来作为outter window,利用两个window优化inner window(outter window的keyframes不发生改变)。优化时抛弃outlier。
Local Keyframe Culling
去掉一个keyframe-90%的它的map points能够被至少三个keyframes看到
这里和ORB SLAM里面也是一样的
loop closing单独开一个线程做回环检测。
Loop Candidates Detection
对于Ki,取与之相连的邻居,且(theta>=30),算出最低的BoW分数Smin。然后访问数据库要求给出candidates分数比Smin要高,然后将其中与Ki直接相连的去掉(因为是要检测回环),当环境中有相似的地方时candidates可能有多个。
Compute the Similarity Transformation
单目相机有七个自由度:旋转、平移、放缩,因此我们要做相似变换,计算累计误差,并进行几何验证。
先计算绑定到map points上的ORB features的响应,这样我们为每个loop candidates计算了3D-3D点的响应,然后使用RANSAC,再求相似变换。如果某个相似变换Sil有足够多的inliers,再对其优化(guided search of more correspondences,将map points投影进去,在一个小范围内进行搜索找响应点),然后再使用新找到的响应优化。
Loop Fusion
将重合的map points进行融合,然后更新covisibility graph(将loop closure闭合)。
Essential Graph Optimization
为了有效的完成loop closing,我们基于Essential Graph上使用pose graph optimization进行优化,将loop closing发现的误差分不到图中。这个优化基于相似变换的信息来纠正尺度漂移。
使用Huber robust cost function来计算损失函数。
标签:
原文地址:http://blog.csdn.net/huangch11/article/details/51262032