SLAM:使用G2O-ORB-SLAM(编译)
前言:
没有新雪,看看自己所做的事情,有没有前人做过。果然,EKF_SLAM的版本出现了Android版本的OpenEKFMonoSLAM, G2O-ORB SLAM也出现了VS2012版本。
一、SLAM 问题:
机器人需要在自身位置不确定的条件下,在完全未知环境中创建地图,同时利用地图进行自主定位和导航。这就是移动机器人的同时定位与地图创建(SLAM) 问题,最先是由Smith Self 和Cheeseman 在1988年提出来的,被认为是实现真正全自主移动机器人的关键。 由 Smith,
R.C. and P. Cheeseman, 提出的论文:On the Representation and Estimation of Spatial Uncertainty. 《International Journal of Robotics Research》, 1986. 5(4): p. 56 -- 68. 以滤波的形式表示SLAM问题。
随后的时间里,Se,
S., D. Lowe and J. Little,的论文: Mobile robot localization and mapping with uncertainty using scale-invariant visual landmarks. 《The international Journal of robotics Research》, 2002. 21(8): p. 735--758.中使用了卡尔曼滤波的方法。
使用EKF的方法是一段时间内的SLAM主流方法。
SLAM问题描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和传感器数据进行自身定位,同时建造增量式地图。在SLAM中,机器人利用自身携带的传感器识别未知环境中的特征标志,然后根据机器人与特征标志之间的相对位置和里程计的读数估计机器人和特征标志的全局坐标。这种在线的定位与地图创建需要保持机器人与特征标志之间的详细信息。近几年来,SLAM的研究取得了很大的进展,并已应用于各种不同的环境,如:室内环境、水下、室外环境。
二、图计算的问题
另外一条路径:SLAM问题本质上是场景重建,主要方式是帧间匹配构建三维场景,即构建增量式地图。主要三维构建方法是BA ,直观上可以使用的计算机科学算法为图优化。
直到21世纪初,卡尔曼滤波器仍在SLAM系统占据最主要的地位,Davison经典的单目SLAM:Divide and Conquer: EKF SLAM in O(n), Paz Lina M et al., 《IEEE Transaction on Robotics》, 2008即是用EKF做的。由于滤波器方法存储n个路标要消耗n平方的空间,在计算量上有点难以控制。尽管08年有人提出分治法的滤波器能把复杂度弄到O(n)
,但实现手段比较复杂。
后来,出现了基于图优化的SLAM方法: Visual SLAM: Why filter? Strasdat et. al.,《 Image and Vision Computing》, 2012.,渐渐有取而代之的地位。根本原因是计算能力的提高,可以在图优化的计算上达到要求。
图优化实际上是解一种非线性最小二乘问题,主要用于离线的slam优化,也有用在在线的方式的。 最小二乘解决的就是偏差全局最小的问题,再在原基础量上叠加最小偏差量即为最优量。 图优化将问题全部抽象成 node(点)与edge(边)的问题。
g2o:http://www.openslam.org/g2o.html,就是对图优化问题的一个求解器。它原理上是一个通用的求解器,并不限定于某些SLAM问题。你可以用它来求SLAM,也可以用ICP, PnP以及其他你能想到的可以用图来表达的优化问题。g2o是一个平台,你可以加入你自己的线性方程求解器,编写自己的优化目标函数,确定更新的方式。g2o的作者说Guassian-Newton和Levenberg-Marquardt方法比较naive,但是g2o的本质就是这些算法的实现。事实上,g2o
iSAM SPA和 sSPA等非线性优化算法只是在非线性问题线性化时处理得不一样,在线性化后要求解线性方程都是利用了已有的linear solver库来求解,如 CSparse CHOLMOD PCG等,他们都需要依靠Eigen这个线性代数库。
三、ORB_SLAM的方法
ORB_SLAM:https://github.com/raulmur/ORB_SLAM 的创新点为使用了ORB特征,但主要构建地图框架为图优化,整个工程有用于构建地图的g2o库、用于回环检测的DBoW2、用于点云处理的PCL库及第三方库、以及用于图像处理的ORB特征提取器和预处理算法等。
四、编译问题
可以直接使用工程文件附带的g2o的源代码编译,不需要其他的辅助编译工作。
源代码出现了编译问题。
问题一:
没有仔细阅读源代码,发现工程自带的G2O库找不到使用的函数:
Optimizer.cpp使用的函数: g2o::EdgeSE3ProjectXYZ* e = new g2o::EdgeSE3ProjectXYZ();
read()及write()函数都出现链接错误。
使用最新的Git版本,仍然出现找不到函数这种链接错误。最后,终于发现问题,项目所带的源代码相对于工程是正确的,而Git最新版本进行了大量的修改,所以使用项目自带的源代码进行重新编译。
可以进行编译并生成一些lib文件,有一些编译失败,但不影响程序的运行。
问题二:
出现:error LNK2019: 无法解析的外部符号 __imp___ 此种链接错误,修改方法为:
移除_DENUG或将_DENUG改为NDENUG
项目可以运行了。
SLAM:使用G2O-ORB-SLAM(编译)的更多相关文章
- 从零开始一起学习SLAM | 掌握g2o边的代码套路
点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...
- 从零开始一起学习SLAM | 掌握g2o顶点编程套路
点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...
- 从零开始一起学习SLAM | 为什么要学SLAM?
在<零基础小白,如何入门计算机视觉?>中我提到过,计算机视觉的研究目前主要分为两大方向:基于学习的方法和基于几何的方法.其中基于学习的方法最火的就是深度学习,而基于几何方法最火的就是视觉S ...
- SLAM学习笔记 - 视觉SLAM方法资源汇总
工具类: ros框架 linux系列教程 vim Eigen Eigen快速入门 Pangolin Pangolin安装与使用 数据集: TUM 数据格式 提供pyt ...
- SLAM概念学习之随机SLAM算法
这一节,在熟悉了Featue maps相关概念之后,我们将开始学习基于EKF的特征图SLAM算法. 1. 机器人,图和增强的状态向量 随机SLAM算法一般存储机器人位姿和图中的地标在单个状态向量中,然 ...
- 常用的SLAM解决方案
ORB SLAM 可以去Github上自己搜索现成的SLAM程序包 在此基础上做优化 视觉SLAM的分类方法:按摄像头的多少分为单目和双目,按是否使用概率方法分为概率法和图法 链接 学习SLAM重要的 ...
- (2)RGB-D SLAM系列- 工具篇(依赖库及编译)
做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...
- 一起做RGB-D SLAM(7) (完结篇)
第七讲 添加回环检测 2016.11 更新 把原文的SIFT替换成了ORB,这样你可以在没有nonfree模块下使用本程序了. 回环检测的阈值作出了相应的调整. 请以现在的github上源码为准. 简 ...
随机推荐
- js 保留几位小数位数
定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.
- GMT,UTC,DST,CST时间详解
全球24个时区的划分 相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究 ...
- 优化实例- not use hash to avoid temp space issue
在展开下面的original sql 和 execution plan之前,要知道这个SQL的问题就在于占用大量的TEMP space orignal SQL SELECT roster.IC_N A ...
- pthread2
下面我们来看看这个demo #include <stdio.h> #include <pthread.h> #include <unistd.h> #include ...
- servlet和Spring的DispatcherServlet详解
Servlet是什么 1. Servlet是服务器端运行的一个程序,是一个被编译好的Java类.它不是框架等. 2. Web容器的启动,需要依赖Servlet.当web服务器开始执行时,servlet ...
- hdu 1874 畅通project续
最短路问题,尽管a!=b,可是同一条路測评数据会给你非常多个.因此在读入的时候要去最短的那条路存起来.........见了鬼了.坑爹 #include<iostream> #include ...
- 王立平--Failed to pull selection
解决的方法:重新启动eclipse
- hibernate实战笔记1---初探
因为在学习Spring的时候学到有关数据库的章节的时候,提及到了hibernate的集成,可是我对hibernate技术差点儿是一点不了解.仅仅是知道它是一个orm对象映射框架,所以在初探的章节做一下 ...
- Codeforces--630D--Hexagons(规律)
D - Hexagons! Crawling in process... Crawling failed Time Limit:500MS Memory Limit:65536KB ...
- E20170817-ts
panel n. 镶板; 面; (门.墙等上面的) 嵌板; 控制板; inventory n. 清查; 存货清单; 财产目录,财产目录的编制; 存货总值;