我们会连续给大家放出ORB_SLAM从入门、移植,到开发的一系列开发攻略,篇篇干货,欢迎大家分享到自己朋友圈,推荐给自己的朋友们~
以前读过部分PTAM代码。 不过对于ORB_SLAM还没有接触过。最近打算有时间看一看。正好赶上ORB_SLAM2,所以直接从ORB_SLAM2入手。
文末有ORB-SLAM开源代码的iOS版本以及MacOSX版本的下载链接地址呦~
看代码以前,首先还是先跑起来看看效果再说。ORB_SLAM2代码结构非常好。依赖也比较少。主体依赖仅有DBoW2/g2o/eigen3。另外Map的绘制部分还依赖一个Pangolin。这几个库相对来说都比较好移植。
但是不知道为什么,使用Pangolin后在Mac上跑起来总是出现崩溃的问题。所以就没有使用Pangolin来绘制Map,而是自己随便绘制了一下Map的点,不过发现绘制出来稍微和现实有些差距(如下图线的地方可以看到特征点位置不准确的有些偏上,应该是画的时候哪里错误了 待调查)。
在Mac上总体上速度还是很快的(没有对代码进行任何优化,参数也没调整)。
接下来直接在iOS上测试了一下。iOS出现了严重的数据加载非常慢的问题。iPhone 5C 大约需要3,4分钟才能把词典文件载入。这个肯定是不行的。主要原因一个是词典太大未压缩的txt文件145M,另一点在于词典文件的读入方式效率太低。修改为二进制的方式读入(参考自一个fork)后,可以大大加快词典文件载入效率,在iPhone 5C上从3,4分钟提高到8秒左右可以加载完毕。
iPhone 5C的加载视频:
初次移植的版本效果不太好的地方:
针对这些问题后期做了一些改进。
-
加载词典时间目前还没有改善(目前iPhone5C 8秒),这里重新制作小一点的词典应该是可以缩短加载时间的的,不过效果上可能会受到一些影响。毕竟作者提供的词典文件是经过大量测试和验证的。
-
运行效率通过减少配置文件的特征点数(减到了500),FPS上升到了10左右,大约8-9比较多。但是这个帧率还是太低了,目前还没有想到好的优化方法。估计在CPU更加强大的手机上面应该会好些。目前效率的瓶颈首先在于ORB特征的提取。要占整体时间的大部分。提取的越多效果越好(初始化也越容易),但占用的时间会越长。ORB提取这么多点的用时是符合常理的,而且考虑到整体包括BoW都是基于ORB方案的,所以不太可能换成其他特征。所以只能考虑在保证质量的同时尝试减少提取的数量。
-
目前特征点不足时候,初始化会失败。失败后目前需要退出程序后,重新打开程序。
下为截图,可以看到在中间一大片区域没有明显特征点的情况下,Pose依然非常稳定。
从使用的体验上来说,移动摄像头的时候需要循序渐进。不能动作太大,不然会直接丢失目标。再加上帧率本身就相对低,所以在手机上整体体验的确不是很好(不过类似iPhone6/6S之类的手机CPU应该帧率会有提升)。但是slam效果非常好,Pose比较稳定和准确,重新定位时候也很容易,这一点对比PTAM还是有很大提升的。PTAM的重定位用的是基于缩略图,而ORBSLAM用特征BoW匹配可以更容易丢失后恢复。
最后附上完整视频地址(录屏时帧率稍低):
增加Mac版本对比(Mac版本非常流畅,2000点也完全没有卡顿)
补充:两个视频中,3D模型都出现在瓶子的上方。这个版本并没有任何markerless识别的功能。完全是orbslam的默认行为,即坐标系总是基于第一个关键帧创建,由于开始建立坐标系时第一个拍摄的就是瓶子,所以坐标系会恰好建立在那里,然后人物就会恰好出现到上方。接下来会考虑加入markerlessAR识别,这样物体的位置才能确定,而不是出现在初始化地图的关键帧位置。
如何获取ORB-SLAM的iOS及MacOSX的移植版本开源代码?
长按下图,识别图中二维码,关注“泡泡机器人SLAM”(ID:paopaorobot_slam)公众号,回复 "开源" 获取
ORB-SLAM的iOS及MacOSX的移植版本开源代码
。