ORB-SLAM2:基于可识别特征的自主导航与地图构建

2023-11-18

ORB-SLAM2 :基于可识别特征的自主导航与地图构建

ORB-SLAM: Tracking and Mapping Recognizable Features

转自 http://blog.csdn.net/cicibabe/article/details/50728748

翻译:2016年2月24日 Taylor Guo  


摘要:视觉SLAM可以很好地构建地图,追踪相机。但这些地图不能用于本地化,不同的相机,甚至是同一个相机,但可以从不同的视角观察。这些局限源自于缺乏可以识别的地图容量。我们将介绍一种基于关键帧的SLAM系统,可以让地图复用,用可识别的特征点构建地图。我们的系统在一个不变的视角下实时执行本地化操作和闭环控制。我们也加入了消减机制减少地图中冗余的关键帧。这个系统有足够的能力复用地图,并可以用于识别系统。


1. 简介

        相机的位姿估计和真实世界的几何重构的主要问题是观测问题,这在mono-SLAM中总所周知。单一相机的问题比较麻烦,因为深度图无法获得,而又需要多维几何来解决问题。立体相机和RGB-D相机在某种程度可以提供深度图,但单目技术仍然需要。

        单目SLAM技术已经发展了较长时间,从最初的滤波方法到最近的基于关键帧的SLAM系统。最新的研究表明,基于关键帧的技术比滤波方法更精确。最具代表性的是PTAM,被认为是单目的标志。尽管方案成熟、PTAM算法性能优良,单目SLAM应用也并不广泛。地图很少用来计算相机的位姿,没有用来定位相机的不同视角,也没有用来定位不同的相机。场景不是静止状态的情况下可能更糟糕。我们认为地图识别的作用非常关键,我们发现在类似PTAM的应用中这一块做的不够好。

        在我们之前的工作中,我们在PTAM中集成了一个非常有效的识别系统用于导航和闭环控制。这个识别系统基于ORB特征的二进制数据包,让位于在视角不变情况下实时定位系统的性能。我们实验演示了系统在不同相机和轨迹下的系统复用地图的性能。我们需要提取特别的特征(ORB)用来获取识别的性能。我们用这个方法构建了新的SLAM系统,我们将为ROS发布开源源代码。

        我们的系统使用了大量的视觉信息,在优化位置识别性能中需要较多关键帧信息与加入削减算法减少地图中冗余关键帧上做了大量工作,证明方法富有效率。该系统有3个主要任务:自主导航/追踪、地图构建、闭环控制,在多核系统中并行处理。图 1显示了系统框图。


2. 地图

        这一章主要介绍地图的存储。

A.    地图特征点或3D ORB

        地图特征点构成真实世界的3D架构。每个特征点都经过不同视角抽象,然后用Bundle Adjustment优化。这里图像中的点是ORB特征点,用角点检测的FAST算法获取。图块的大小和方向取决于FAST算法获取的规模和关键点的方向。每个地图上的特征点和一个图块n关联。单个特征点可能和具有ORB特征的多个关键帧有关,同时有几个特征描述器。如果特征描述器出现特征不匹配的状况,它需要处理不同视角的不同地图特征点。为了加速数据关联,每个地图特征点的描述器为D,它的与其他所有描述器关联。另外,每个地图特征点存储了观察到的最大dmax和最小dmin距离。


B.    关键帧

        关键帧是真实世界的视觉信息的快照。每个关键帧包括了帧内的ORB特征和相机的位姿。在我们的设计中,关键帧并非不可以一帧不少,相反如果一个图像区域能被其它帧完全表示,它就可以被删除。这将在后面详细介绍。


C.    可视化图像

        交互可视化信息在几个任务中都非常有用,它决定了本地地图,位置识别的性能。可视化信息以间接权重图像的方式存储在系统中,那里每个节点是一个关键帧和关键帧之间的边缘,边缘的定义是两个关键帧之间相同的特征点至少是 θ。如果θ越低,相互关联度就越高,图像遍历的代价就越高。Strasdat建议典型的θ值在15到30之间。边缘的权重就是地图相同特征点的数量。


3. 位置识别

        系统里面加入了位置识别侦测闭环和重定位。识别器是基于我们之前的工作,基于效率较高的二进制字典位置识别器DBoW2。与之前的工作相比有2个方面的改进:首先,在位置识别中,如果数据库里有不清楚的匹配,识别器能返回不同的假设条件。其次,我们用可视化信息取代了所有的暂存信息。

        我们介绍一下之前的工作:

A.  图像识别数据库 

 数据库包含了一个反向序数,它指向字典里的每个视图关键字,字典里有关键帧,有关键帧的权重。用检索视图关键字来检索整个数据库,极大地提高了检索的效率。新的关键帧将在闭环任务线程中插入数据库中,当本地的地图构建完成后执行这个操作。

        重定位或者数据库闭环检索后,得到一个相近的分数,在检索图像后,它计算了所有关键帧之间的相同视图关键字。关键帧之间有视图重叠,所以并没有唯一的高分值的关键帧,可能高分值的关键帧有好多个。在这个项目中,我们做了视图集合包含了所有关键帧的分数值,这些关键帧直接与图像关联,关键帧匹配后就有一个高分值。图像会被紧密及时地分组,同一个位置的视图关键帧分值不会被记录,但在不同时间下的同一视图会被插入数据库。我们不仅仅是得到最优的匹配,所有的匹配分数要在最高分数的90%以上。

B.  高效,优化的ORB匹配
        在重定位和闭环控制中,检索完数据库后,我们可以分别算出相机位姿和相似变换,可以用于几何图形验证。首先,我们需要计算2个图像的ORB特征的相似度。如果强制匹配,在某种程度上可能会加速,如果我们只比较字典树的第二层的同一节点的ORB特征,匹配的性能没有明显减少。初始匹配可以通过方向一致性检测来优化。

C.  视觉一致性
        闭环控制的健壮性非常重要,错误的闭环控制将毁坏地图构建。有论文提到短期一致性测试,这样系统就可以等待获取一系列贯序暂时一致性匹配,用于最后形成闭环控制。这里我们建议采用视觉一致性测试,这样如果可视图像存在边缘,就可以采用贯序关键帧匹配。


4. 自主导航/追踪

        地图的初始化是执行一个自动过程,从两帧之间找到单应平面变换或矩阵。初始化完成后,追踪功能就根据每个新进来的图像帧估计相机位姿。我们将详细描述追踪功能的具体步骤。

A.  ORB特征获取 

        第一步获取图像帧里的ORB特征点。开始时,计算图像金字塔,侦测每层的FAST算法关键特征点。但只提取这些关键点的一个子集。考虑以下主要参数:图像 金字塔的层数,不同层之间的比例因子,要获取的ORB特征点的数量(关键点描述),侦测的阈值,最重要的是保留和描述关键点的子集的规则。这些参数直接影响特征的规模的不变性,任务的计算成本(字典包,数据关联,等),图像上的关键点分布。我们提取了基于比例因子1.2的8层1000个ORB特征点。为了最大程度地分散图像上的关键点,我们将图像分成网格,使每个网格里的关键点数量一样。如果有网格里没有足够的关键点,剩下的网格就要获取更多的关键点。

B.  追踪之前的图像帧
        如果上一帧图像追踪成功,我们可以从上一帧中估计第一个的相机位姿。上一帧图像中的每个ORB,与地图上的点关联,都会搜索并匹配上一位置发生变动的局部区域。如果没有发现足够的匹配,比如相机快速移动,匹配过程就会在更大的范围内再搜索一遍。方向一致性测试将对最初的匹配优化。此时,我们就有了一组3D到2D的一一对应关系,我们就可以计算相机位姿、解决RANSAC迭代中的PnP问题。


C.  重定位:从划除帧中再追踪

        如果追踪失效的话,我们将帧转换成关键字的包,然后检索关键帧数据库用于重定位。如果几个地方的图像对于当前帧相似,将会有几个候选帧用于重定位。对于每个候选关键帧都要计算ORB特征匹配一致性,即当然帧和ORB特征点关联的地图点的关键帧,如第3节B小节里解释的。这样我们就有了每个候选关键帧的一组2D到3D的一一对应关系。现在对每个候选帧执行RANSAC迭代算法,计算出相机的位姿解决每次迭代的PnP问题。如果我们获得了相机位姿,我们就可以继续执行追踪功能。


D.  追踪本地地图

        现在有了真实环境中的相机的位姿,我们就可以将地图投影到图像帧上并搜索更多地图点进行对应。我们并不像PTAM那样映射所有的地图点,我们使用与Strasdat的论文里相同的方法,投射本地地图。这个本地地图包含一组关键帧K1,形成当前帧的地图点;K2是邻近的关键帧组。在紧密关联的地图中,像K2这样的集合可能非常多,我们限制它们的数量。本地地图也有一个参考关键帧Kref,属于K1,它包含了当前帧的大部分地图点。所有的地图点都在关键帧K中,K=K1∪K2,从这些帧里面按照如下方法搜索本地地图:

1.    计算当前帧的地图云点映射x。去掉图像外面的云点。

2.    计算角度:视线v和地图点n的法线的夹角。去掉v.n<cos(45度)的云点。(ORB里每个地图点有法线这一说,如果视线角和它的法线相差太大,它的外观通常会有变化)

3.    计算地图云点和相机中心的距离d。去掉地图云点相同尺寸区域以外的点,即d不属于[dmin, dmax]之间的点。

4.    计算帧内的比值d/dmin。

5.    比较地图云点描述器D和图像帧内ORB特征点,其大小是否接近x。

6.    关联地图云点获取最优匹配。


E.  最终的位姿优化

        追踪的最后一步是优化相机位姿,具体是使用4.B或4.C里面描述的方法估计初始位姿,用帧里的ORB特征点与本地地图里的云点一一匹配。这样优化尽可能避免了映射错误,保持了地图云点的位置。我们使用g2o 列文伯格-马夸尔特非线性最小二乘算法和Huber估计器。


F.  新的关键帧的取舍

        如果追踪成功,我们就要决定是否插入新的关键帧。插入新的关键帧需要满足如下条件:

1.    在最近一次重定位中,超过20个帧被略过。

2.    当前帧追踪了至少50个云点。

3.    当前帧追踪的地图云点少于Kref的90%。

4.    本地地图构建处理完上一关键帧后,至少10帧从上一关键帧插入动作后被略过。或者本地地图构建完成了本地偏差调整后,至少20个帧被略过。

        我们没有像PTAM那样采用与其他帧距离上的条件限制,这里标准更合理,如视角变换(条件3),尽可能快地插入帧(条件4)。第1个条件确保获得一个较好地重定位。条件2 确保一个良好的追踪。


5. 本地地图构建

        本地地图构建线程处理新的帧,更新优化它们的本地邻近的帧。追踪任务插入的新的关键帧存储在一个队列里,包含了最近一次插入的关键帧。
        当本地地图构建从队列中取出最后一个关键帧时,要执行以下步骤:
A.  字典 

        第一步是将关键帧转换成关键字包表示。这会返回一个关键字向量,用于后面的闭环控制,也用于将ORB特征点与字典树里的第二个节点关联,这个字典树用于下一步的数据关联。

B.  确定新的地图云点
        通过三角化不同关键帧的ORB特征点可以构建新的地图云点。PTAM用最邻近的关键帧三角化这些点,这些帧的视差非常小;我们用相邻的N个关键帧来三角化这些点,这些帧具有很多相同的图像点。我们需要约束关键帧的数量,由于地图间高度关联,计算代价会很大。我们搜索当前关键帧里的ORB与其他关键帧中的进行匹配,只是比较描述器。我们比较字典第二层下相同节点里的ORB,去掉不能满足极化约束条件的匹配。一旦ORB匹配成功,它们就被三角化了。如果地图点视差小于1度,也要被去掉。开始时,地图点只能在前两个关键帧里看到,但其他关键帧里也有,所以地图点投射到其他关键帧里供追踪算法使用,如第4节D小节所示。

C.  更新局部区域

        在后面的3个关键帧建立后,要确认地图点云是否出错,需要满足如下2个条件:

1.)追踪功能要能找到那些地图点,这些点在超过25%的帧里;

2.)如果在地图点建立后丢掉一个关键帧,这个关键帧必须在3个关键帧中出现过;

关键帧里的地图点有新的观测方法,关键帧里的关联图像的边缘需要重新计算。另外,每个地图点的描述器D也要重新计算。

D.  局部偏差调整

        与PTAM类似,局部偏差调整优化当前处理的关键帧,这些关键帧与图像关联,这些关键帧能看到这些图像点。其他能看到这些点的关键帧,但不是当前的关键帧也要优化。为了解决非线性优化问题,我们使用g2o里面的列文伯格-马夸尔特非线性最小二乘算法,Huber估计器。经过优化后,我们可以再次计算n, 尺度不变距离dnin,dmax。


E.  祛除冗余关键帧

        为了去掉地图中冗余的关键帧,以防止关键帧的数量急速变大,我们去掉其他相同或更好的关键帧中90%的地图点已经被观测到过的关键帧。这个祛除的过程如图2所示。



6. 闭环控制

        闭环控制用来侦测地图的闭环状况,如果发现闭环,将执行闭环控制以保持全局地图的一致性。局部地图构建后,闭环控制获取了最后一个处理的关键帧Ki,除此之外,闭环控制还执行了如下任务。
A.  闭环侦测 

        我们先计算关键字包的关键字向量Ki与其邻近的相关图像的相似性,留下最低分值Smin。然后,闭环控制检索关键帧数据库,去掉那些分值低于Smin的关键帧。另外,最后所有直接与Ki关联的关键帧都去掉。为了增加控制器的鲁棒性,我们必须侦测3个连续的闭环侦测器,它们的图像相互关联保持一致,如第3节C里面所示。当闭环侦测的关键帧通过了图像关联一致性测试,下一步就要计算相似变换。


B.  计算相似变换
        在单目SLAM中,有7个自由度,地图可能偏移,3种改变,3种旋转,1个尺寸因子。为了闭合回路,我们需要计算从当前关键帧Ki到回路关键帧Kl的相似变换,回路中的关键帧Kl提供了回路的累积误差。这个相似变换也用来作为回路的几何验证。
在重定位的过程中,如果对于当前帧有几个地方的场景相似,就可能有好几个回路。这样,我们首先计算ORB特征点的一致性,即与地图点关联的ORB的当前帧与回路中的关键帧,按照第3节B中的过程执行。现在,对每个回环,我们有了3D到3D的一一对应关系。我们对每个回环执行RANSAC迭代,计算相似变换。如果相似度Sil有足够的有效数据,第1个回环就成功了。
C.  与局部地图构建线程同步

        在修正回路之前,当闭环控制完成当前操作后它就会停止运行,发送一个信号给本地地图构建线程。一旦本地地图构建线程停止,闭环控制就要修正回路。这个过程非常必要,2个线程都可能会修改关键帧的位姿,地图云点(地图点里面可能造成混淆,导致地图构建失败)。


D.  回路融合

        回路修正的第一步就是融合重复的地图点,插入闭环控制的关联视觉地图。开始的时候,用相似变换Sil来修正Tiw关键帧的位姿,这种修正方法可以复制到Ki相邻的关键帧上,然后串联执行所有的相似变换,这样回环的两端就可以有效对齐。回路的关键帧可以看到所有的地图点,与它邻近的点都投影到Ki上,这些投影的点在一个狭小的局部区域进行搜索匹配。所有匹配的地图点和Sil中的有效数据融合。融合过程中的所有有效的关键帧将更新关联图像中的边缘,产生的新的边缘用于闭环控制。
E.  关联视图位姿图像优化

        为了闭合回路,修正累积误差,我们将执行一个全局优化。当执行误差调整时,有必要使用鲁棒成本计算函数,我们需要先算出一个最初的方案供优化器收敛功能使用。这个方案由相互关联图像的位姿优化后的结果组成,而闭环边缘上的误差分布在整个图像中。图像位姿优化器通过相似变换修正尺度偏移。这个方法比我们之前的方法更通用,之前的方法中,图像的位姿只是连接关键帧形成一个圈,其他的都一样,优化过程也一样,这里就不在讲了。
F.  全局偏差调整

        整个地图最后会通过单点的图像位姿优化完成。优化过程和第5节D里面所说的局部偏差调整一样,不过这里所有的关键帧和地图点都会被优化。优化后,局部地图构建会再次发出。

7. 上机调试

我们做了两个实验,用来演示系统的优势 。第一个是手持相机在实验室顺序完成一个回路,环境闭塞、相机剧烈移动。第二个是一段视频在更大场景下测试这个系统。系统被集成到ROS里面,我们用录制的视频模拟相机的运动,图像帧率都一样。附录1中的视频是和PTAM系统的对比。
A.  实验室视频 

        这个视频是30fps,752x480分辨率的。如图3所示。重定位有一些难度,如图4所示。所有的追踪时间如图5所示。90%的帧追踪都少于40毫秒。在实际步骤中,追踪时间会稍微增加,因为关联图像之间的关联程度更大,局部地图更大。闭环侦测花了5毫秒从关键帧数据库中取回回路,关键帧数据库包含86个关键帧,计算相似度和融合回路花了173毫秒,图像位姿优化花了187毫秒优化图像里面的1692个边缘。最后,全局误差调整花了518毫秒。




我们用同样的步骤也比较了PTAM。开始时,尝试了20多次来初始化。PTAM在后续好几步都跟丢了,我们的系统没有,在重定位中的失效是由于缺少不变的视角。


B.  NewCollege
        这个实验室一个立体视频,我们只处理左边的图像,是20fps,512x384分辨率下拍摄的。图6显示了不同时间的地图重构,图7显示了最后的重构,包含690个关键帧,33000个点。图5显示了每帧所有的处理时间,90%的图像帧都少于50毫秒。图6显示了在中间部分机器人重新跑了大的回路,局部地图大于探测到的地方,所以追踪花了更多的时间。回路检测花了7毫秒在280关键帧的数据库中检测回路。回路融合花了333毫秒,位姿优化花了2.07秒优化10831个边缘的图像。我们非常清楚地看到,在一个大的回路中优化所有相互关联的图像复杂度太大,所以并不需要优化所有的边缘,这个方法我们将在后续工作中进行。

8. 结论

我们构建了一个新的视觉SLAM系统构建可识别的地图。不需要对所有的特征点采用SLAM算法,只需要追踪相机的当前位姿,我们映射地图用于识别位置和物体。这有效地扩展了地图的复用性。与PTAM在小型地图的应用对比后,前段的复杂度大,在相机重定位上有巨大的改进。后端可以执行大尺度的地图构建,包括有效可靠的闭环控制。我们目前在研究地图的初始化,由于时间空间限制我们在这里就忽略了,稀疏的图像位姿可以通过闭环控制优化。我们将会发布源代码,大家就可以从中受益。

感谢

本项目得到了西班牙xxx项目的支持,xxx奖学金支持。(抱歉,完全看不懂西班牙文,西班牙式英语的翻译难度也是看得人醉了。)


参考文献

[1] D. G´alvez-L´opez and J. D. Tard´os. Bags of binary words for fast place recognition in image sequences. IEEE Transactions on Robotics, 28(5):1188–1197, 2012.
[2] G. Klein and D. Murray. Parallel tracking and mapping for small AR workspaces. In International Symposium on Mixed and Augmented Reality (ISMAR), 2007.
[3] R. Kuemmerle, G. Grisetti, H. Strasdat, K. Konolige, and W. Burgard. g2o: A general framework for graph optimization. In IEEE International Conference on Robotics and Automation (ICRA), 2011.
[4] V. Lepetit, F. Moreno-Noguer, and P. Fua. EPnP: An accurate O(n) solution to the PnP problem. International Journal of Computer Vision, 81(2):155–166, 2009.
[5] R. Mur-Artal and J. D. Tard´os. Fast relocalisation and loop closing in keyframe-based SLAM. In IEEE International Conference on Robotics and Automation (ICRA), 2014.
[6] E. Rublee, V. Rabaud, K. Konolige, and G. Bradski. ORB: an efficient alternative to SIFT or SURF. In IEEE International Conference on Computer Vision (ICCV),
2011.
[7] M. Smith, I. Baldwin, W. Churchill, R. Paul, and P. Newman. The new college vision and laser data set. The International Journal of Robotics Research, 28(5):595–
599, 2009.
[8] H. Strasdat, J. M. M. Montiel, and A. J. Davison. Scale drift-aware large scale monocular SLAM. In Robotics:Science and Systems (RSS), 2010.
[9] H. Strasdat, A. J. Davison, J. M. M. Montiel, and K. Konolige. Double window optimisation for constant time visual SLAM. In IEEE International Conference on Computer Vision (ICCV), 2011.
[10] H. Strasdat, J. M. M. Montiel, and A. J. Davison. Visual SLAM: Why filter? Image and Vision Computing, 30(2): 65–77, 2012.

翻译过程中参考资料:

随机抽样一致 RANSAC(转)

http://www.cnblogs.com/cfantaisie/archive/2011/06/09/2076864.html

Bundle Adjustment到底是什么?

http://www.zhihu.com/question/29082659


--------2016年2月26日---翻译初稿完成---17:50-------------------------------------------------------------------------------

--------感谢麒麒、敏敏这两天的陪伴和容忍------------------------------------------------------------------------------------


词袋模型在图像序列中快速位置识别的应用

Bags of Binary Words for Fast Place Recognition in Image Sequences

翻译:2016年3月2日 Taylor Guo  


关键词:词袋模型(Bag-of-Word)  特征向量(descriptor)

闭环检测目前多采用词袋模型(Bag-of-Word),源自于计算机视觉理论。
它实质上是一个检测观测数据相似性的问题。
词袋模型中,提取每张图像中的特征,把它们的特征向量(descriptor)进行聚类,建立类别数据库。
比如说,眼睛、鼻子、耳朵、嘴等等(实际应用中基本上是一些边缘和角)。
假设有10000个类。然后,对于每一个图像,可以分析它含有数据库中哪几个类。以1表示有,以0表示没有。那么,这个图像就可用10000维的一个向量来表达。而不同的图像,只要比较它们的向量即可。

图像词袋模型也是一种基于图像局部特征的标分类算法,它只考虑目标的局部区域的表面特征,而忽略他们之间的空间关系,对目标的整体形状不加限制,这样建立的目标模型就有很大的灵活性,不会局限于某一种形状的特征,可以处理类内目标的形状变化。

图像与文本对比: 

文本

文集

(Corpus)

文档

(Document)

单词

(Word)

字典

(Vocabulary)

图像

图像集

(Image set)

图像

(Image)

视觉单词

(Visual Word)

视觉字典

(Visual Vocabulary)

 图像词袋模型的基本结构:

 

所谓词袋,就是包含一组数据的打包或封装。在一个词袋中往往包含了若干幅图的基本特征元素。在一个完整的词袋中,一般有若干幅图的局部特征,包括形状、结构、颜色等具有鲁棒性,不变性的特征。由于词袋具有一类或多类图像的全部特征,故而当我们提取出词袋中的元素时,就可以对相近类图像进行描述,同时也可以用作不同类别图像的分类。词袋模型在图像描述中的应用是近年的研究热点。

词袋模型的原理非常简单,词袋模型是文本的简化描述模型。在此模型中,文本被表达成无序的单词组合,不去考虑语法与词序。以文本为例,如果一个文本X表示一连串有顺序的词的排列,那么机器对于X的识别其实就是计算出X在所有文本词语中出现的可能,也就是概率多个词语概率的相乘p(X)=p(X1)p(X2|X1)…p(Xn|Xn-1)其中P(x1)表示第一个词出现的概率,p(X2|X1)表示在第一个词出现的前提下第二个次出现的概率,而词袋模型就是这种文本模型的特例,即Xk出现的概率与前面的X无关,故有p(X)=p(X1)p(X2)…p(Xn)成立。

主要利用词袋模型的特点,根据已知的图像对未知的(机器未能识别的)图像进行描述,以达到对待描述图像的一个机器性认知,主要步骤分为三步:特征提取、特征码本的聚类、数据分析及统计,条形图显示。Visual words的撷取大致上是将图像的SIFT features,在keypoint feature space上做K-means clustering的结果,以histogram来表示,是一种bag-of-features。除了可用于retrieval外,visual words也被用于image classification。

 

Visual words (简称VWs) 近年来在image retrieval领域被大量使用,其motivation其实是从text retrieval领域而来,是基于文字上的textual words,套用在影像上的模拟。如同于一篇文章是由许多文字(textual words) 组合而成,若我们也能将一张影像表示成由许多 “visual words”组合而成,就能将过去在text retrieval领域的技巧直接利用于imageretrieval;而以文字搜寻系统现今的效率,将影像的表示法「文字化」也有助于large-scale影像搜寻系统的效率。在文献 [1]  “Video Google: A Text Retrieval Approach to Object Matching in Videos,” Proc.  IEEE International Conference on Computer Vision, 2003有提到motivation of visual words的细节。首先我们先回顾textretrieval的过程:1. 一篇文章被parse成许多文字,2. 每个文字是由它的「主干(stem)」来表示的。例如以 ‘walk’ 这个字来说,‘walk’、‘walking’、‘walks’ 等variants同属于 ‘walk’ 这个主干,在text retrieval system里被视为同一个字。3. 排除掉每篇文章都有的极端常见字,例如 ‘the’ 和 ‘an’。4. 一篇文章文章的表示法,即以每个字出现频率的histogram vector来表示。5. 在此histogram中,对于每个字其实都有给一个某种形式weight,例如Google利用PageRank [2] 的方式来做weighting。6. 在执行文字搜寻时,回传和此query vector最接近(以角度衡量)的文章。

步骤1:侦测影像中的SIFT keypoints,并计算keypoint descriptors。例如在原始SIFT文献 [3] 使用Difference of Gaussians (DoG) 来侦测keypoints,而以一个128-D的向量作为descriptor。侦测keypoints的动作相当于上一节所说的1. 将文章parse成一个一个的文字。

步骤2:将所有训练影像的所有keypoint descriptors,散布于一个128-D的keypoint feature space中,再执行一个clustering algorithm,例如K-means或是这学期教过的EM。在image retrieval领域中,cluster数 K 常订为104 ~ 106。同一个cluster里的keypoints,相当于是同一个 “visual word stem” 的variants,在retrieval / classification系统中被视为同一个VW,因此K也被称为系统里的 “vocabulary size”。clustering后的结果相当于上一节所说的2. 同一个word stem下有许多的variants。

步骤3:最后,一张影像可看成由许多VW(原先是keypoints)组成。因为在retrieval领域,我们并不在意文字的排列顺序,只在意文章中文字的出现频率,同样的道理,一张影像中我们只在乎每个VW stem的出现频率。以这种概念构成的特征被称为 “Bag-of-features”,只在乎袋子里有什么物品,而不是物品的排列顺序。因此影像特征的表示法为根据VW出现频率的 “visual word histogram”。这种概念与上一节4.的文字出现频率histogram相同。

结论:Visual words可看作是将影像中local的keypoint descriptors,套上clustering algorithm后,变成整张影像的global feature。

Visual words 除了大量用于image retrieval外,也可以直接作为features用于image classification。本专题的目的就是将visual words作为影像特征,并套用于multi-class image classification。


 

 

摘要:

    我们采用视觉词袋模型,通过FAST+BRIEF特征提出一种位姿识别方法,通过构造词汇树生成二进制特征向量描述器空间,使用树形结构加速几何验证和匹配。整个过程,包括特征提取,共26300张图像序列,每帧22ms,比之前的方法要快很多。

一简介

视觉SLAM的一个最重要要求是要具有良好鲁棒性的位姿识别,在自主导航过程中,未观测到的区域需要重新观测时,一般的匹配算法就会失效。如果观测数据有效,闭环控制就可以提供正确的数据关联,从而获得完整的地图。在机器人的应用中,由于视觉模糊、突然运动、移动阻塞或定位失效后,也可以采用这种方法。这种方法在一个小范围的环境中,用图像构建地图,性能优良;但在大范围的环境中,从图像到图像的FAB-MAP构建地图的方法更好。这种方法通过机器人在线获取图像,构建数据库,其新获取的图像与之前的那副图像非常相似,相似的图像序列形成一个闭环回路。最近几年的图像匹配算法都是基于词袋模型中的数字向量比较的方法。词袋模型产生了有效地、快速地图像匹配,但如果图像失真,对闭环回路却不是一个好方法。那么,我们就需要验证图像的视觉匹配,进行特征匹配。闭环回路控制算法的瓶颈是特征提取,这一步骤的算法复杂度是其他步骤的10倍左右。这就要求SLAM算法同时运行在两个无耦合关系的线程上:一个执行SLAM功能;另一个用作闭环回路控制,如文章5《CI-Graph SLAM for 3D Reconstruction of Large and ComplexEnvironments using a Multicamera System》所述。

在本文中将采用常用CPU和单目相机提出一种算法用于闭环回路侦测,实时构建云点匹配。这个方法基于图像词袋模型和几何特征验证,提出优化算法。主要通过基于FAST关键点的BRIEF特征向量描述器提高速度,在第三节里会具体解释。BRIEF特征向量描述器是一个二进制向量,每一个位上的值是由关键点附近指定的两个像素的亮度比较得到的结果。尽管BRIEF特征向量描述器在尺度和旋转上不变,我们的实验表明在运动机器人上针对相机平面运动闭环回路鲁棒性非常好,在运算时间和算法特性上取得很好的平衡。

本文使用存储于二进制空间上的词袋模型,讨论了顺序索引和逆序索引,如第四章所述。据我们所知,这是第一次采用二进制字典用于闭环回路检测。逆序方法用于提取与给定图像相似的图像。顺序索引有效地获取图像间的云点匹配,加快回路确认中的几何特征检验。

第五节详细讲述了闭合回路检测算法的细节。为了检验回路是否闭合,我们验证当前图像匹配的一致性。本文方法针对同一位姿的相似图像,避免数据库检索时重复计算。在处理图像匹配时,我们将表示同一位姿的相似图像进行分组来解决这一问题。

第六节对实验进行了评估,分析了算法不同部分的优点。对比了BRIEF和SURF特征算法的效率,提出了用于闭合回路控制的特征向量描述器。还分析了闭环回路验证中实时几何特征一致性测试程序的性能。最后提供了在5种公共数据集0.7-4米轨迹下的测试结果。完成了整个闭环回路的检测过程,包括特征提取,26300张图像,其中最长处理时间52毫秒,平均处理时间22毫秒,明显强于之前的方法。

这个工作的早期版本如《Real-timeloop detection with bags of binary words》所示,在本文中我们增强了顺序检索方法,加强了该实验的评估方法,在最新的数据集上提供了实验结果,与FAB-MAP2.0算法进行了对比。

二  相关工作

由于其优良性能,基于图像的位姿识别在机器人领域备受重视。例如采用全向相机的闭环回路检测系统FAB-MAP。FAB-MAP采用词袋模型表示图像,使用Chow-Liu树获取关键字的视图相关概率。FAB-MAP已经成为闭环回路检测的标准方法,但当相机长时间提供的图像具有相似的内容结构时,其鲁棒性会降低。在文章4《Fast and incremental method forloop-closure detection using bags of visual words》中,提出了用于创建增量式在线视觉字典,存储图像和颜色。两个词袋模型用于贝叶斯滤波器的输入,贝叶斯滤波器基于上一匹配的概率估计出两幅图像的匹配概率。与概率方法不同的是,我们采用实时一致性检验增强检测的可靠性。这种方法在之前的工作中《CI-Graph SLAM for 3D Reconstruction of Large and ComplexEnvironments using a Multicamera System》和《Robust PlaceRecognition With Stereo Sequences》证明是有效的。本文第一次采用了词袋模型避免了匹配过程中相似图像间的重复运算,可以使系统在更高的频率上工作。

为了确认闭合回路,通常采用几何特征检验。我们采用极值约束获取最优匹配,采用顺序索引更快地计算相似点匹配。文章《View-basedmaps》使用立体相机视觉里程方法实时构建视觉地图,采用词袋模型检验闭合回路。几何特征测试是计算用于图像匹配的空间变换。然而,他们并未考虑图像匹配的一致性问题,这需要采用几何测试寻找闭合回路。

大多数的闭环回路工作,使用SIFT或SURF提取特征,这种方法对于亮度、尺度和旋转变换具有不变的特征,在视角较小的变化情况下性能良好。但特征提取往往需要计算100-700毫秒,如果不使用GPU,采用近似SIFT特征向量描述器,或者减小尺度,来减小特征提取的计算时间,文章《View-based maps》提出了一种压缩随机树方法,该方法计算了一个图像区块和其他已经离线训练的区块的相似度,链接这些相似度的值形成区块特征向量,使用随机正射投影减小尺寸,这种方法提供了快速特征向量的描述器,适合实时应用。我们的工作和这篇文章中类似,使用富有效率的特征提取方法降低处理时间,BRIEF特征向量描述器,或BRISK,或ORB(ORB: An Efficient Alternative to SIFTor SURF)都是采用二进制,计算速度快。一个主要的优势是信息量精简,使用了更少的内存,更快地进行比较,词袋模型的运算速度也就更快。

 

三  二进制特征向量

局部特征提取(主要是关键点和它们的特征描述向量)的计算代价巨大,在比较图像,实时场景计算中,这是一个瓶颈。为了解决这个问题,我们采用FAST关键点和最新的BRIEF特征向量描述。FAST关键点采用Bresenham点画圆算法,比较半径为3像素以内的灰度值来检测角点,只有很少的一部分像素用来对比,角点的获取速度非常快,适用于实时应用的系统中。

         针对每个FAST关键点,我们在它们周围都画了一个方形区块计算BRIEF特征向量。每个图像区块BRIEF特征向量描述器是一个二进制特征向量。每个位是图像区块中两个像素之间亮度比较的结果的值。这些区块已经经过高斯核函数滤除噪声进行过平滑处理。给定图像区块尺寸Sb,待测像素对是在离线状态下随机选择的。除Sb外,我们还必须设置参数Lb:待测试的数量(比如特征向量的长度)。对于图像中的点P,其BRIEF特征向量B(P)表示为:

Bi(p)是特征向量第i位;I(.)是平滑后像素点的亮度;ai和bi是2维平面上相对于测试点i的距离,值为。特征向量不需要训练,只是离线状态下,随机选择的像素点,几乎不消耗时间。最初的BRIEF特征向量描述器根据常态分布选择测试点ai,bi的坐标。我们发现用相邻的一对点的测试效果更好,通过采样分布和选择配对的点的坐标。关于特征向量的长度和区块的大小,我们选Lb=256,Sb=48,这在特征描述和运算时间上取得较好的平衡。

         BRIEF特征向量描述器的优势是运算和比较速度非常快(Lb=256个位时,每个关键点是17.3微秒)。这些描述器只是特征向量的一个位,测量两个向量之间的距离可以通过计算它们之间不同位的数量来解决,也就是用汉明距离计算两个向量对应位置的不同字符的个数,(换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数),通过执行xor异或操作就可以了。这种方法比SIFT或SURF更适合这个应用,在SIFT或SURF特征向量描述中,计算欧氏距离使用的是浮点运算。

 

四  图像数据库

         由具有层次结构的词袋模型、顺序索引和逆序索引组成图像数据库,如图1所示,这个图像数据库用于侦测之前访问过的地方。

         词袋模型是使用视觉字典将一副图像转换成离散数字向量,用于管理图像的数据集。视觉字典通过将视觉单词W用向量描述空间存储,在离线状态下创建而成。与SIFT或SURF特征向量不同,我们采用二进制向量描述空间,创建一个精简的字典。在层级架构词袋模型上,字典组织成一个树状结构。通过训练图像提取具有丰富数据的一组特征,这与那些稍后在线创建的独立开来。采用K-medians聚类算法(数据挖掘,机器学习的重要分支)[k-means++: The advantages of carefulseeding]先将提取的特征向量分成kw二进制聚类。并将产生的非二进制值直接转换成0。这些聚类形成字典树里的第一层节点。其他层的节点通过同样的方法计算出来,直到Lw层。最后,我们得到一个有W个叶子的树,也就是W个单词的字典。每个单词根据其在训练文集库中的相关性分配权重,减小那些经常使用的单词的权重,这样他们的区别就不明显。我们通过[Video Google: A text retrievalapproach to object matching in videos]文章中的方法,采用使用频率反向分类(tf-idf: term frequency-inverse document frequency)方法进行处理。然后,将图像It,在时间t内,转换成词袋向量Vt∈Rw,特征的二进制描述器遍历字典树,选择每层的中间节点使得汉明距离最小化。

         为了检验两个词袋向量v1和v2的相似度,我们计算L1的值s(v1,v2),这个值的在0到1之间[0…1]:

     (2)

   图像词袋由逆序指针指示。这个结构用于存储视觉单词wi,视觉单词组成视觉字典,视觉字典形成图像It。这样当检索图像,作比较操作时,就不会对比图像中那些一样的视觉单词,这对检索数据库非常有用。我们用逆序指针指向一对数据<It, vti>,可以快速获取图像上的视觉单词的权重。当新的图像It加入到数据库中的时候,逆序指针就会更新,指针也方便在数据库中查找图像。搜索图像时,词袋模型中的两种结构(词袋和逆序指针)只有一种会经常用到。在常用的方法中,我们用顺序指针可以方便地存储每幅图像的特征。我们通过以下方法将字典中的节点分层,假如树一共有l层,从叶子开始为0层,即l=0,到根结束,l=Lw。对于每幅图像It,我们将l层的节点存储在顺序指针中,而l层是图像It的视觉单词的父节点,局部特征ftj与节点关联。我们用顺序指针和词袋模型树估算BRIEF向量描述器中的最邻近的节点。对于特征相同的单词或具有共同l层父节点的单词,当我们计算特征的相关性时,这些顺序指针可以加快几何验证过程。当获取一个将要匹配的候选特征时,几何验证非常必要,新的图像加进数据库,顺序指针就会更新。

 

五  闭合回路检测算法

   我们基于之前的工作《CI-Graph SLAM for 3D Reconstruction of Large and ComplexEnvironments using a Multicamera System》和《Robust PlaceRecognition With Stereo Sequences》,提出检测闭合回路的算法。具体步骤如下面四步所示:

A.  数据库查询

   我们用图像数据库存储和查询任何一副给定的图像。当图像It被转换成词袋向量Vt时,在数据库中查找Vt,查询到一系列的匹配的候选向量对<Vt, Vt1>,<Vt, Vt2>,… ,和与它们关联的相似度值S(Vt, Vtj)。这个相似度的值与图像和图像上视觉单词的分布相关。我们将相似度值进行排列,希望向量Vt顺序排列,通过文章《Robust place recognition with stereo sequences》中的工作规范化相似度值η:

我们通过s(Vt, Vt-Δt)计算Vt的值,Vt-Δt是前一幅图像的词袋向量。s(Vt, Vt-Δt)很小时,比如机器人在转弯的时候,会错误地造成高数值。这样,我们就忽略没有到达最小值的图像,或者指定特征的数量。这个最小值会去掉一些图像,这些图像可能有被用于正确地侦测闭环回路的相似度值η。那么,我们就用一个比较小的值来防止有效的图像被丢弃。我们去掉那些图像,它们的η(Vt,Vtj)小于这个最小的阈值


                 

小型增强现实工作空间的并行自主导航与地图构建

Parallel Tracking and Mapping for Small AR Workspaces

作者: Geoge Klein, David Murray         2007年


小型增强现实工作空间的并行自主导航与地图构建

翻译:Taylor Guo                    2016年2月24日

        本文并不一字一句翻译,而是根据实际项目需求和产品应用,略去次要部分,选取主要部分,以求快速掌握实际应用方案。

如需完整文档,请自行学术搜索。


        概要:本文主要讲在未知场景中,对摄像头位姿估计的方法。与机器人中采用SLAM类似,我们针对小型增强现实工作空间里手持式相机进行自主导航和定位。

        自主导航和地图构建将分成两个线程:追踪相机的运动和从图像帧里处理3D导航地图的点特征。这里会涉及到优化技术和应用的实时性:本应用里面的地图在自主导航里面使用上千个地标,是最新的精确的健壮的系统。


1. 应用简介

        增强现实使用给用户提供更多信息的环境。可以用于城市导航地图、零件的CAD模型、甚至是一些离散的信息。该应用可以使用户和静止的物体动态交互,如果模型或地图对机器或程序来说易于理解,那么增强现实应用的注册信息就可以直接执行,这其实也是基于相机的增强现实的主流方法。


        不幸的是,机器程序易于理解的地图并不存在,它需要物体被标记。因此,需要传感器来获取这些特征,而传感器又有使用范围和质量的限制。信息的注册也就限制了追踪效果。那么,在增强现实应用中,就会使用扩展的追踪方法,就是在未知的场景里预先添加信息来获取最初需要的信息,这样就避免之前传感器检测不到某些未知地图的状况。最开始地图是一个比较小的点阵,后面的版本mono-SLAM算法已经可以不需要预先提供初始信息或地图了。


        本文讨论使用校准过的相机在未知场景中构建环境地图。建立环境场景后,将虚拟物体放入场景中,在这个过程中可以精确地与真实物体关联。

        我们并没有预先加入足够的信息到用户使用环境中,很多增强现实应用就不适用。我们的方法是通过远程专家提供有意义的提示和注解,本应用中采用预先虚拟模拟的沙盘。

        我们从地图的云点估计一个飞机的模型,这可以推广到一般的物体的虚拟特征。如图所示。实际上,我们将平面物体(有纹理)转换成互动的立体的虚拟影像,在这个阶段,我们开发了简单的游戏。相机界面变成了同时观察和用户交互的工具。



        为了能让用户更自由地与虚拟环境交互,我们需要快速、精确和健壮的相机追踪算法,当进入新场景时,能重构地图,那么这样就有一些限制,场景要尽可能小,要静止画面不能扭曲。小,意味着用户需要花更多的时间在同一个地方,如桌子、房间角落或单一建筑物前。我们也考虑到应用的扩展,扩展到大型的增强现实工作空间,如城市。


2. SLAM方法

方法总结:

a.    自主导航和地图构建分离,用两个并行的线程;

b.    地图构建基于关键帧,使用批处理方法(使用Bundle Adjustment 减小误差)

c.    地图的初始化采用立体匹配

d.    更新的点阵通过极值点获取

e.    获取大量的点用来构建地图


       这里可以比较一下目前最新的方法。手持相机的同步导航和地图构建,EKF-SLAM和FAST SLAM,导航和地图构建紧密地关联,相机的位姿和图标的位置根据每幅图像帧同时更新。我们认为手持相机比移动的机器人更难追踪:机器人获取的数据可以测得距离;机器人可以以很慢的速度移动。相反,单目手持相机无法应用在这种场景中,数据融合产生错误,不可避免。而上面的两种方法,可能会加大这种错误。即使通过JCBB和RANSAC算法增强系统的健壮性,增强现实仍然无法使用。

       这样自主导航和地图重构就要分开。两个功能分开后,导航就没有必要依赖于基于概率论的地图构建,健壮的自主导航方法就可以加入。实际上,两个功能之间并没有数据关联。由于计算机多线程处理能力,自主导航功能就贯穿于整个图像处理过程中,并增强性能。

       当相机没有移动的时候,图像帧里包含足够多的信息,没有必要每一帧都拿来做地图构建。我们主要处理少量有用的关键帧。这些关键帧的能实时地处理,这个过程是在下一个关键帧进来之前完成。然后,用高度精确的批处理算法处理后面的地图构建,这个算法如Bundle Adjustment.

      Bundle Adjustment 在视觉里程导航中被证明行之有效,我们觉得采用这个方法。首先,通过立体5点构建初始地图,然后用本地Bundle Adjustment追踪相机最近的N个位姿,以获取较长距离下的期望精度。当系统初始化后,我们使用本地地图更新,我们试图构建全局地图,那些特征点可以再次被访问,这样就可以提供全幅地图优化。最后,我们不采用2D追踪而使用极值特征搜索。


3. 更进一步工作

系统采用UKF,使用了很少的特征点构建地图。

还有采用了学习算法,预先标记点追踪,识别特征,在训练阶段采用经典的Bundle Adjustment 算法,追踪性能不错,但没有经过学习后,没有后续尝试。还有通过其他的估计方法发了论文,说更精确,更健壮,但牺牲了系统性能,处于不稳定状态。

还有采用了SfM方法,加入了惯性传感器和鱼眼透镜,从3D位姿估计中耦合了2D特征导航算法,健壮性增强。


4. 地图

地图由M个特征点构成,位于世界坐标w下。地图Pj中的j点,坐标为Pjw=(xjw,yjw,zjw,1)T。每个坐标由nj个像素点组成。

地图系列由N个关键帧。每个关键帧以相机为中心点的坐标系,第i个关键帧是ki.

世界坐标系与关键帧坐标系的转换为:Ekiw.

每个关键帧有4个8bpp灰度值的图像金字塔;第0层存了一幅640x480的照片,第3层子抽样分辨率是80x60。


并不是每个像素都单独存储,观察到每帧的特征点后,只存储这个帧的特征点。每个地图有一个关键帧,每个关键字有一个金字塔组合,像素位于金字塔的层级中。

在金字塔层级中,每块是8x8的像素方块;在世界坐标系下,块的大小取决于金字塔层数,到关键帧中心的距离,还有块的方位。


后面的例子里,每个地图上有2000到6000个特征点M,有关键帧N=40到120个。


5. 自主导航

在3D地图估计方法构建后,将设计基于特征点的自主导航系统。

导航系统获取图像,实时估计相机位姿构建地图。

基于这样的估计,虚拟的增强图像可以画在相机动画帧的上面。

每帧画面上,系统执行如下导航步骤:

1. 获取新的图像帧,根据运动模型预先估计位姿;

2. 根据图像帧的位姿估计,地图特征点投射到照片上;

3. 根据少量的(50)粗略的特征搜索图像;

4. 根据这些粗略匹配更新相机位姿;

5. 根据大量的(1000)特征点映射的图像再次搜索;

6. 在所有匹配后,最终的关键帧的位姿估计就计算出来了。


5.1  截取图像

相机可以提供640x480像素的图像帧,速率30Hz。这些帧可以转换成8bpp灰度,用于自主导航和增强现实显示。

导航系统构建4层图像金字塔,每层用FAST-10 conrner detector扫描。

相机位姿的估计模型:decaying velocity model. 有点像a-b constant velocity model,但缺少测量,预估过程速度会下降,最终停下来。


5.2  相机的位姿和映射

为了将地图上的点投影到飞机图片上,需要将世界坐标系转换成以相机为中心的坐标系C。

可以通过矩阵4x4 Ecw 与矩阵的相乘(线性变换与线性变换的乘积),获得相机的位姿: Pjc=Ecw x Pjw (1)










5.3  图块搜索




5.4  位姿更新








5.5  导航优化

        为了增强导航系统对相机运动、图块搜索和位姿更新的适应能力,我们需要做两次。初步粗略搜索只搜索当前图像金字塔的当前帧的最上面一层50个点。这样搜索范围就比较大。新的位姿就可以计算出来。然后,1000个图像块继续搜索。更精细的搜索将在更高一级的金字塔图像块中。最终的位姿就是这样一个由从粗到细的过程。


5.6  导航功能质量与错误恢复




6  地图构建







6.1  地图初始化






6.2  关键帧插入和极值搜索


6.3  Bundle Adjustment






6.4  数据关联精细化



6.5  程序执行备注



7  结果


7.1  视频导航性能




7.2  地图构建状况




7.3 与EFK SLAM合成对比分析








7.4 与EFK SLAM子集对比分析


7.5 手持式相机AR


8 后续工作的不足



8.1 失败分析

8.2 地图构建不充分


9 结论



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORB-SLAM2:基于可识别特征的自主导航与地图构建 的相关文章

  • vscode_c++_slambook 编译配置

    工作目录 配置文件 launch json version 0 2 0 configurations name slamBook程序调试 type cppdbg request launch program fileDirname buil
  • 正交矩阵的保范性:正交变换不改变向量的长度(范数)

    在推导使用SVD分解解方程时 用到了正交矩阵的保范性这一性质 1 正交矩阵定义 A mathbf A intercal A A A A
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 速腾聚创雷达最新驱动安装(包含ring和timestamp)运行lio-sam

    记录一下搞slam的过程 ring和timestamp 最近想跑lio sam 需要用到ring和timestamp两个参数 lio sam作者用的velodyne雷达是带这两个参数的 但是rs雷达的老版驱动录制的点云包没有这两个参数 在g
  • 从零开始一起学习SLAM(9)不推公式,如何真正理解对极约束?

    文章目录 对极几何基本概念 如何得到极线方程 作业 此文发于公众号 计算机视觉life 原文链接 从零开始一起学习SLAM 不推公式 如何真正理解对极约束 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后 感觉书上的内容没那么难了
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋
  • 深度相机Kinect2.0三维点云拼接实验(一)

    文章目录 摘要 Kinect2 0简介 工作原理 RGB相机成像原理 深度相机成像原理 总结 参考文献 摘要 Kinect2 0是微软推出的一款RGB D相机 它即支持普通相机的拍摄 也支持脉冲测量深度信息 本系列文章基于该传感器给出基本的
  • 激光SLAM7-基于已知位姿的构图算法

    1 通过覆盖栅格建图算法进行栅格地图的构建 1 1 Theory 1 2 code 这里没有判断idx和hitPtIndex是否有效 start of TODO 对对应的map的cell信息进行更新 1 2 3题内容 GridIndex h
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • 视觉SLAM技术及其应用(章国锋--复杂环境下的鲁棒SfM与SLAM)

    SLAM 同时定位与地图构建 机器人和计算机视觉领域的基本问题 在未知环境中定位自身方位并同时构建环境三维地图 应用广泛 增强现实 虚拟现实 机器人 无人驾驶 SLAM常用的传感器 红外传感器 较近距离感应 常用与扫地机器人 激光雷达 单线
  • IMU预积分的一些理解

    IMU预积分 算是比较简单的一个算法 无奈网上找到的资料都讲的晦涩难懂 看明白了也觉得不过如此 讲一下我的理解 整体流程 1 推导IMU离散运动方程 2 根据离散运动方程 进行预积分 并将预积分的误差项拆分出来 因为我们在定义误差的时候 有
  • 高斯牛顿法求非线性最小二乘的步骤和c++代码实现

    slam图优化的本质是一个非线性优化问题 Gauss Newton求解步骤 1 线性化误差函数 2 构建线性系统 3 求解线性系统 4 更新解 并不断迭代直至收敛 一个简单的代码实现 一维参数xy 高维变为对应的矩阵即可 include
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • LOAM算法详解

    激光SLAM 帧间匹配方法 Point to Plane ICP NDT Feature based Method 回环检测方法 Scan to Scan Scan to Map LOAM创新点 定位和建图的分离 里程计模块 高频低质量的帧
  • Eigen几何模块的使用方法

    include
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国
  • SLAM练习题(十一)—— G2O实战

    SLAM 学习笔记 写在前面的话 算是一点小小的感悟吧 估计位姿的方法有线性方法和非线性方法 线性方法就是特征点法中的2D 2D的对极约束 3D 2D的PnP问题 非线性方法有BA优化 它将位姿的估计问题转换成了一个误差关于优化量的最小二乘

随机推荐

  • 关于pickle的load,loads等

    基础知识 python自带的file函数只能存储和读取字符串格式的数据 pickle可以存储和读取成其他格式比如list dict的数据 来自 https www zhihu com question 38355589 如需更详细 关于lo
  • 三十八、java版 SpringCloud分布式微服务云架构之Java 网络编程

    Java 网络编程 网络编程是指编写运行在多个设备 计算机 的程序 这些设备都通过网络连接起来 java net 包中 J2SE 的 API 包含有类和接口 它们提供低层次的通信细节 你可以直接使用这些类和接口 来专注于解决问题 而不用关注
  • windows定时自动备份

    windows定时自动备份 1 创建bat脚本 1 本地备份 复制以下代码保存该文件 修改文件名为以 bat结尾的文件 echo off echo 正在复制 C a 文件夹的内容至 D b 文件夹下 xcopy C a D b e I d
  • pip 命令行“ImportError: No Module Named Typing”

    pip遇到ImportError No Module Named Typing 原因在于运行的是python2版本 升级到python3就不会有这个问题 但是因为Mac中同时有python2和python3 可以把pip安装在python3
  • 如何写出高效的sql的一点想法及oracle常用hint用法

    author skate time 2009 05 15 如何写出高效的sql的一点想法 迷糊的问题 1 什么样的sql 才算是高效的sql呢 2 sql为什么不走索引 如何让sql走索引 即改变sql的执行计划3 索引有哪几种 4 什时候
  • 多显示器设置检测不到_那些与显示设置相关的事

    点击上方 蓝字 点击右上角 选 设为星标 标星 防走丢 那些与显示设置相关的事 本文阅读目录 显示分辨率的概念与设置 刷新率的概念与设置 不能满屏显示的原因 显卡控制面板 控制台的概念 多显示器设置 一 显示分辨率的概念与设置 显示分辨率
  • mysql 第10 天

    变量 1 定义 declare DECLARE var name type DEFAULT value 例如 定义一个 DATE 类型的变量 名称是 last month start DECLARE last month start DAT
  • 【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

    每个人能力有限 水平高低不同 我们身在大环境里 虽然在同一个起跑线上 但是时间久了 你会发现 并越来越感觉到和身边其他人有了差距 慢慢的会有一定的落差感 怎么办呢 通过此篇文章我们来简单聊聊 目录 一 焦虑怎么办 1 接受自己的不完美 2
  • P1182 数列分段 Section II

    题目描述 对于给定的一个长度为N的正整数数列 A 现要将其分成 M M N 段 并要求每段连续 且每段和的最大值最小 关于最大值最小 例如一数列 4 2 4 5 1 要分成 3 段 将其如下分段 4 2 4 5 1 第 1 段和为 6 第
  • java jsonarray 追加_我们如何在Java中将JSONArray添加到JSONObject?

    该JSON是用于交换数据的基于文本的格式 它是轻量级的组件 与语言无关 我们还可以将JSONArray添加到JSONObject 我们需要首先将一些项目添加到ArrayList中 并将此列表传递给JSONArray类的put 方法 最后使用
  • go dll 传char*

    go调用dll中方法参数为 char类型 tiger1103 2017 12 25 10 58发布 1224浏览 问与答 我有一个dll库 里面有一个C实现的方法 int GetPeopleName char strTmp int strL
  • stateflow基础知识之(时序逻辑)

    stateflow状态转移和动作过程中 可以使用两种类型的时序逻辑 基于事件和绝对时间 基于事件的时序逻辑可跟踪重复发生的事件 绝对时间时序逻辑则基于 Stateflow 图的仿真时间定义时间段 要对这些重复事件或仿真时间进行操作 可以使用
  • 总结:对Java内存模型JMM的理解

    JMM规定了线程的工作内存和主内存的交互关系 以及线程之间的可见性和程序的执行顺序 一方面 要为程序员提供足够强的内存可见性保证 另一方面 对编译器和处理器的限制要尽可能地放松 JMM对程序员屏蔽了CPU以及OS内存的使用问题 能够使程序在
  • MySql的常见的语句总结

    目录 MySql的高级查询语句 数据准备 查询中常用的DISTINCT IN BETWEEN OR DESC ASC COUNT MAX LIMIT等关键字 SQL中关于日期的函数 SQL的分组查询和多表查询 sql的子查询以及UNION和
  • 【报错】 openai.error.RateLimitError: Rate limit reached for default-text-davinci-003 in organization

    使用open AI的API调用模型的时候 会出现以下报错 openai error RateLimitError Rate limit reached for default text davinci 003 in organization
  • mysql可扩展用户属性_MySQL扩展--可伸缩性最佳实践:来自eBay的经验

    在eBay 可伸缩性是我们每天奋力抵抗的一大架构压力 我们所做的每一项架构及设计决策 身前身后都能看到它的踪影 当我们面对的是全世界数以亿计的用户 每天的页面浏览量超过10亿 系统中的数据量要用皮字节 1015或250 来计算 可伸缩性是生
  • 解释器和编译器的区别

    解释器与编译器的区别 两者都是将高级语言转换成机器码 解释器在程序运行时将代码转换成机器码 编译器在程序运行之前将代码转换成机器码 编译器相当于做好一桌子菜再开吃 解释器就是吃火锅边煮边吃 吃火锅效率要低一点
  • CStatusBar技巧

    一 状态条控制的主要功能 状态条控制 Status Bar Control 比较容易理解 使用起来也比较简单 状态条是位于父窗口底部的一个水平子窗口 它可以被分成多个显示信息的小区域 其MFC中封装的CstatusBarCtrl控制类提供了
  • 加更一个小项目中的几个神奇的函数,tiff文件在matlab的读取和显示,以及如何在底图上画图和透明度设置

    项目需求 在地图tiff文件上画出轨迹和轨迹周围一定距离的范围 难点 tiff文件格式的读取 图片与经纬度之间的转换 图片具有透明度 在图片上作图 boston R geotiffread boston tif figure mapshow
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    ORB SLAM2 基于可识别特征的自主导航与地图构建 ORB SLAM Tracking and Mapping Recognizable Features 转自 http blog csdn net cicibabe article d