前言:

没有新雪,看看自己所做的事情,有没有前人做过。果然,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___  此种链接错误,修改方法为:

               所在的项目点右键,选择“属性”-> “配置属性”-> “C/C++”-> “预处理器”-> “预处理定义”
移除_DENUG或将_DENUG改为NDENUG

项目可以运行了。

SLAM:使用G2O-ORB-SLAM(编译)的更多相关文章

  1. 从零开始一起学习SLAM | 掌握g2o边的代码套路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...

  2. 从零开始一起学习SLAM | 掌握g2o顶点编程套路

    点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...

  3. 从零开始一起学习SLAM | 为什么要学SLAM?

    在<零基础小白,如何入门计算机视觉?>中我提到过,计算机视觉的研究目前主要分为两大方向:基于学习的方法和基于几何的方法.其中基于学习的方法最火的就是深度学习,而基于几何方法最火的就是视觉S ...

  4. SLAM学习笔记 - 视觉SLAM方法资源汇总

    工具类: ros框架 linux系列教程     vim Eigen     Eigen快速入门 Pangolin  Pangolin安装与使用 数据集: TUM         数据格式 提供pyt ...

  5. SLAM概念学习之随机SLAM算法

    这一节,在熟悉了Featue maps相关概念之后,我们将开始学习基于EKF的特征图SLAM算法. 1. 机器人,图和增强的状态向量 随机SLAM算法一般存储机器人位姿和图中的地标在单个状态向量中,然 ...

  6. 常用的SLAM解决方案

    ORB SLAM 可以去Github上自己搜索现成的SLAM程序包 在此基础上做优化 视觉SLAM的分类方法:按摄像头的多少分为单目和双目,按是否使用概率方法分为概率法和图法 链接 学习SLAM重要的 ...

  7. (2)RGB-D SLAM系列- 工具篇(依赖库及编译)

    做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...

  8. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  9. 一起做RGB-D SLAM(7) (完结篇)

    第七讲 添加回环检测 2016.11 更新 把原文的SIFT替换成了ORB,这样你可以在没有nonfree模块下使用本程序了. 回环检测的阈值作出了相应的调整. 请以现在的github上源码为准. 简 ...

随机推荐

  1. php 漏洞分析

    addslashes() 函数返回在预定义字符之前添加反斜杠的字符串.

  2. .Net防sql注入的方法总结

    #防sql注入的常用方法: 1.服务端对前端传过来的参数值进行类型验证: 2.服务端执行sql,使用参数化传值,而不要使用sql字符串拼接: 3.服务端对前端传过来的数据进行sql关键词过来与检测: ...

  3. 关于PyQt5,在pycharm上的安装步骤及使用技巧

    前序 之前学习了一款GUI图形界面设计的Tkinter库,但是经大佬的介绍,PyQT5全宇宙最强,一脸的苦笑 毫不犹豫的选择转战PyQT5,在学习之前需要先安装一些必须程序,在一番查阅后,发现PyQt ...

  4. 协程,greenlet原生协程库, gevent库

    协程简介 协程(coroutine),又称为微线程,纤程,是一种用户级的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来时,恢复之前保存的上下文 ...

  5. Codeforces Round #404 (Div. 2)——ABCDE

    题目这里 A.map裸题 #include <bits/stdc++.h> using namespace std; map <string, int> p; string s ...

  6. 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组

    题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件:  1.P,Q是正整 ...

  7. 造成segment fault,产生core dump的可能原因

    1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, spr ...

  8. 2.1-VLAN/TRUNK/VTP

    2.1-VLAN/TRUNK/VTP     注意:配置VLAN时要退出VLAN配置模式才会执行 如果VLAN被删除或者shutdown,那么属于这个vlan的接口将被阻塞(灯一直是橙色,变不了绿色) ...

  9. Android 四大组件学习之ContentProvider五

    上几节学习了ContentProvider的实际用途,读取短信.插入短信,读取联系人.插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件.比方什么短信软件.此 ...

  10. poj 1080 Human Gene Functions (最长公共子序列变形)

    题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...