orb-orbslam2搭建每一帧都初始化了吗

【泡泡机器人原创专栏】ORB_SLAM开发攻略(二):ORB-SLAM和markerless AR的结合
上一篇遗留了一个重要问题,就是有人问:怎么做到识别益达瓶子,然后益达瓶子上渲染出模型的呢?  答案是没有做到。那是因为凑巧地图初始化那一瞬间,镜头正好在益达瓶子上,这个是不可控的。ORB_SLAM的矩阵初始化,是基于创建关键帧时候摄像头的位置,这样虚拟物体的位置和旋转等都是不可控的。所以这里初步打算加入markerlessAR来标记虚拟物体的位置。这样系统的初始化可以分为这样几个步骤:程序启动后就进入对目标图像的探测。这里是用的是一张公交卡。在没有识别到目标图像之前保持识别状态。由于识别探测目标图像的速度是很快的,所以此时帧率可以达到满帧。(30FPS)识别到公交卡之后,进入markerlessAR对公交卡图像的跟踪状态。跟踪每一帧都绘制虚拟人物。此时同时调用orbslam的初始化,虽然跟踪+绘制虚拟人物用的时间只有大约10ms,但是orbslam初始化每帧将近200ms,所以此时系统会比较卡顿。帧&#x左右。跟踪状态下,如果跟踪失败,就会重新进入状态1:对目标图像的探测。探测成功后再次进入状态2跟踪,同时继续orbslam初始化。直到orbslam地图创建成功。orbslam地图创建成功的同时,获取orbslam地图的坐标系,以及当前虚拟人物在markerlessAR的坐标系,做一次矩阵变换,让虚拟人物出现到orbslam地图坐标系的相同位置。此时markerlessAR的探测和跟踪都停止。完全进入orbslam的跟踪。帧率上升到10左右。(注:markerlessAR和模型绘制框架动画等都来自本人之前的项目,除了orbslam2之外,并没有引入其他ARSDK等。)总之一句话简单概括下:费了这么大力气究竟有什么用:如下图。不管镜头晃动到哪里创建地图,不管orbslam地图有没有创建成功,虚拟物体一定会出现在公交卡的上方。而不是镜头晃到哪里创建了地图,就出现在哪里。也不是晃到什么角度创建了地图,虚拟人物就呈现什么角度。这种方式目前来说有如下的优点:在orbslam地图创建成功之前(有时候要晃很久才创建成功),基于markerlessAR,虚拟人物也是一直出现的。在orbslam地图创建成功之后,虚拟人物还是出现在目标图像的位置。如果orbslam地图创建失败,还可以继续走markerlessAR。重新创建。目前发现的问题点就是:地图初始化成功瞬间,markerlessAR的坐标系转换到orbslam的坐标系转换,目前我直接采用逆矩阵。发现大体位置是对的,但是稍微有些偏。目前不清楚从数学的角度,一个camera坐标系怎么转换到另一个,尤其是在尺度有差距的时候,不知道是否有精确的方法。最后放上完整视频:
如何提前阅读【泡泡机器人原创专栏】ORB_SLAM开发攻略(三)抢鲜版?      长按下图,识别图中二维码,关注“泡泡机器人SLAM”(ID:paopaorobot_slam)公众号,回复 &攻略3& 获取【泡泡机器人原创专栏】ORB_SLAM开发攻略(三)抢鲜版。【版权声明】泡泡机器人SLAM的所有文章全部由泡泡机器人的成员花费大量心血制作而成的原创内容,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!【注】商业转载请联系刘富强(liufuqiang_)进行授权。普通个人转载,请保留版权声明,并且在文章下方放上“泡泡机器人SLAM”微信公众账号的二维码即可。【编辑】王琛最近在读ORB-SLAM的代码,虽然代码注释算比较多了,但各种类和变量互相引用,看起来有点痛苦。索性总结了一下Tracking部分的代码结构,希望能抓住主要思路,不掉坑里。
作者的程序分为两种模式:SLAM模式和Localization模式。SLAM模式中,三个线程全部都在工作,即在定位也在建图。而Localization模式中,只有Tracking线程在工作,即只定位,输出追踪结果(姿态),不会更新地图和关键帧。Localization模式主要用于已经有场景地图的情况下(在SLAM模式下完成建图后可以无缝切换到Localization模式)。Localization模式下追踪方法涉及到的关键函数是一样的,只是策略有所不同。
以下介绍SLAM模式下的追踪算法。
初始追踪(Init pose estimation)
作者在追踪这部分主要用了几种模型:运动模型(Tracking with motion model)、关键帧(Tracking with reference key frame)和重定位(Relocalization)。
下面一一介绍。
Tracking with motion model
假设物体处于匀速运动,那么可以用上一帧的位姿和速度来估计当前帧的位姿。上一帧的速度可以通过前面几帧的位姿计算得到。这个模型适用于运动速度和方向比较一致,没有大转动的情形下,比如匀速运动的汽车、机器人、人等。而对于运动比较随意的目标,当然就会失效了。此时就要用到下面两个模型。
Tracking with reference key frame
假如motion model已经失效,那么首先可以尝试和最近一个关键帧去做匹配。毕竟当前帧和上一个关键帧的距离还不是很远。作者利用了bag of words(BoW)来加速匹配。首先,计算当前帧的BoW,并设定初始位姿为上一帧的位姿;其次,根据位姿和BoW词典来寻找特征匹配(参见);最后,利用匹配的特征优化位姿(参见)。
Relocalization
假如当前帧与最近邻关键帧的匹配也失败了,意味着此时当前帧已经丢了,无法确定其真实位置。此时,只有去和所有关键帧匹配,看能否找到合适的位置。首先,计算当前帧的Bow向量。其次,利用BoW词典选取若干关键帧作为备选(参见);再次,寻找有足够多的特征点匹配的关键帧;最后,利用特征点匹配迭代求解位姿(RANSAC框架下,因为相对位姿可能比较大,局外点会比较多)。如果有关键帧有足够多的内点,那么选取该关键帧优化出的位姿。
姿态优化(Track local map)
姿态优化部分的主要思路是在当前帧和(局部)地图之间寻找尽可能多的对应关系,来优化当前帧的位姿。实际程序中,作者选取了非常多的关键帧和地图点。在跑Euroc数据集MH_01_easy时,几乎有一半以上的关键帧和地图点(后期&3000个)会在这一步被选中。然而,每一帧中只有200~300个地图点可以在当前帧上找到特征匹配点。这一步保证了非关键帧姿态估计的精度和鲁棒性。个人觉得这里有一定的优化空间。
更新局部地图(Local mapping thread)
这里简单提一下local mapping thread。Tracking成功以后,需要更新motion model,并判断当前帧是否是新的关键帧。如果是,将其加入并更新局部地图(local map),建立当前关键帧与其它关键帧的连接关系,更新当前关键帧与其它关键帧之间的特征点匹配关系,并利用三角法生成新的三维点,最后做一个局部优化(local BA,包括相邻关键帧和它们对应的三维点,参见)。
作者的这部分程序逻辑判断很多,如果读者对作者的程序有兴趣,那么可以参照下图来阅读追踪这部分的程序。
Map is active应改为Localization is active。从Localization is active开始,NO代表SLAM模式,YES代表Localization模式。
该系列的其它文章:
阅读(...) 评论()你们为什么不喜欢高家明,他也是深情的高伟光呐!
视频地址复制
Flash地址复制
Html地址复制
离线看更方便
用或其他应用扫描二维码
每一帧都是深情的高家明11-2
广播电视节目制作经营许可证:(沪)字第1248号
| 网络文化经营许可证:沪网文[6号 | 信息网络传播视听节目许可证:0910417 | 互联网ICP备案:沪ICP备号-3 沪ICP证:沪B2- | 违法不良信息举报邮箱: | 违法不良信息举报电话:转3
网上有害信息举报专区: |}

我要回帖

更多关于 orb slam2 github 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信