ORB_SLAM 初接触
来源:互联网 发布:万国数据是干嘛的 编辑:程序博客网 时间:2024/06/06 02:28
MacOSX 移植版本: GitHub - meiroo/ORBSLAM2-OSX
iOS 移植版本: meiroo/ORBSLAM2-iOS · GitHub
====================================
看代码以前,首先还是先跑起来看看效果再说。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的加载视频: Personal Projects by Meiroo 第三排的视频。
目前几个体验不太好的地方:
- 加载时间虽然提高到8秒左右,但还是稍长。
- 运行效率太低。计划先调整一下参数,初步调整到能较好的实时运行。
- 特征点不足时候,初始化会失败。这里体验不是很好。
这几个如果有思路修改,会发新文章。
附录:1
DBoW2 回环检测/重定位 算法解析
ORB-SLAM 和 Kintinuous 都使用 DBoW2 作为回环检测算法,这里对 DBoW2 算法做简要介绍。
DBoW2 论文中使用的特征检测算法是 Fast keypoint,见论文 “Machine learning for high speed corner detection”
使用的特征描述子是 Brief 描述子,见论文 “Brief: Binary robust independent elementary features”
Brief 描述子和 ElasticFusion 中使用的 Randomized Ferns 描述子不同的是,Brief 描述子在
如下:
其中
Randomized Ferns 回环检测算法介绍:
http://blog.csdn.net/fuxingyin/article/details/51436430
ORB-SLAM 中用的是 ORB 特征描述子用 DBoW2 做回环。
Kintinuous 中用的是 Surf 描述子用 DBoW2 做回环。
Bag of Words 字典建立
1、从训练图像中离线抽取特征
2、将抽取的特征用 k-means++ 算法聚类,将描述子空间划分成 k 类
3、将划分的每个子空间,继续利用 k-means++ 算法做聚类
4、按照上述循环,将描述子建立树形结构,如下图所示:
字典树在建立过程中,每个叶子也就是每个 word 记录了该 word 在所有的训练图像中出现的频率,出现的频率越高,表示这个 word 的区分度越小,频率的计算公式如下:
在线更新字典树
当在字典树中需要插入一幅新图像
其中
在树构建的过程中每个叶子节点存储了 inverse index,存储了到达叶子节点的图像
对于一幅图像所有的描述子,做上述操作,可以得到每个 word 的值,将这些值构成图像的描述向量
对两幅图像比较计算其相似度时,两幅图像相似度计算公式如下:
两幅图像越相似得分越高。
字典树除了存储了 inverse index,还存储了 direct index 如上图所示,direct index 方便两幅图像特征搜索,建立特征之间的对应,计算两帧之间的位姿转换。
Database query
由于在计算相似度时,相似度的大小和字典树、图像等有一定关系,这里采用归一化的方式,消除这两种因素的影响:
归一化相似度计算公式如下:
其中
当
Matching group
假设图像
Temporal consistency
假设图像
Efficient geometrical consistency
1、对于一幅新图像
inverse index 加快待比较的图像搜索速度
由于 inverse index 存储了哪些图像也到达该叶子节点,在选择待比较的图像时,只需要比较到达相同叶子节点的图像,不需要和存储的每幅进行比较,从而加快比较速度。
direct index 加快特征比较速度
假设图像
参考文献:
“Real-Time Loop Detection with Bags of Binary Words”
“Bags of Binary Words for Fast Place Recognition in Image Sequences”
“Brief: Binary robust independent elementary features”
“Machine learning for high speed corner detection”
2
g2o(General Graph Optimization)—通用图优化算法
g2o的本质:g2o是一个算法集的C++实现,而并不是在算法理论上的创新,即根据前人求解非线性最小二乘的理论,根据具体的问题,选用最合适的算法。
它是一个平台,你可以加入你自己的线性方程求解器,编写自己的优化目标函数,确定更新的方式。g2o的作者说Guassian-Newton和Levenberg-Marquardt方法比较naive,但是g2o的本质就是这些算法的实现。事实上,g2o iSAM SPA和 sSPA等非线性优化算法只是在非线性问题线性化时处理得不一样,在线性化后要求解线性方程都是利用了已有的linear solver库来求解,如 CSparse CHOLMOD PCG等,他们都需要依靠Eigen这个线性代数库。
g2o的用途:很多机器人的应用如SLAM(同步定位与制图)还有计算机视觉中的光束优化(bundle adjustment 参考http://blog.csdn.net/abcjennifer/article/details/7588865;
http://courses.cs.washington.edu/courses/cse576/05sp/projects/proj3/artifacts/yongjoon/index.html)都会涉及到最小化非线性误差函数的问题。这类应用中,非线性误差函数可以用图(graph)的形式来表征。整个问题的求解就是要找到最符合观测量的相机参数或机器人状态。
g2o的实现:
类似算法:iSAM (参考http://openslam.org/iSAM.html)
SPA2d (参考http://users.ics.forth.gr/~lourakis/sba/)
HOG_Man
g2o与其他算法的效果对比:(具体参考论文:《g2o:a general graph optimization》)
Fig1:
Fig2:
Fig3:isam与其他算法的对比(参考:http://people.csail.mit.edu/kaess/isam/comparison.html)
3C++矩阵处理工具——Eigen
最近和一些朋友讨论到了C++中数学工具的问题,以前总是很2地自己写矩阵运算,或者有时候在matlab里计算了一些数据再往C程序里倒,唉~想想那些年,我们白写的代码啊……人家早已封装好了!首先推荐几个可以在C++中调用的数学平台:eigen、bias、lapack、svd、CMatrix,本文着重eigen做以讲解,希望对各位有所帮助。
下面是本文主线,主要围绕下面几点进行讲解:
**********************************************************************************************
Eigen是什么?
Eigen3哪里下载?
Eigen3的配置
Eigen3 样例代码有没有?
去哪里更深入学习?
**********************************************************************************************
Eigen是什么?
Eigen是C++中可以用来调用并进行矩阵计算的一个库,里面封装了一些类,需要的头文件和功能如下:
Eigen的主页上有一些更详细的Eigen介绍。
Eigen3哪里下载?
这里是我下好的,这里是官网主页,请自行下载,是个code包,不用安装。
Eigen的配置
直接上图了,附加包含目录那里填上你放Eigen文件夹的位置即可。
Eigen的样例代码有没有?
当然有,这篇文章重点就是这里!
以下是我整理的一些常用操作,基本的矩阵运算就在下面了,算是个入门吧~主要分以下几部分:
建议大家放到编译环境里去看,因为我这里有一些region的东西,编译器下更方便看~
去哪里更深入学习?
Please refer to Eigen中的类及函数、Eigen的官方教程,和一些教程上的相关内容。
- ORB_SLAM 初接触
- ORB_SLAM记录
- ORB_SLAM之双目
- 单目ORB_SLAM 实战
- ORB_SLAM : semi dense code
- ORB_SLAM 编译过程详解
- ORB_SLAM测试过程
- ORB_SLAM 使用Kinect
- SLAM: Orb_SLAM中的ORB特征
- 树莓派之orb_slam(1)
- Ubutu搭建ORB_SLAM运行环境
- 初接触Tomcat
- .Net Assembly初接触
- 消息初接触
- Webwork2初接触
- 消息初接触
- python初接触
- PHP初接触
- IOS 学习之路(一) 徒手写界面(3)使用框架
- Android 下使用tcpdump 抓包工具
- play_scala框架学习03
- 1006. Sign In and Sign Out (25)
- 过滤和拦截器区别
- ORB_SLAM 初接触
- Netty
- iOS开发解决使用融云sdk融云头像问题第二版 (终结了 完美)
- 推送网页到kindle
- 开发平台的演变
- swift 学习指南
- play_scala框架学习04 表单
- 一个多maven项目聚合的实例
- Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能