关于SLAM的那些事——通用图优化(G2O)环境搭配(windows8.1 vs2013)

好久不见啊各位亲,最近刚中期答辩完,得以有时间好好更新下博客啦。 自从上一个单目AR系统做完后,就仔细思考了一下我到底在做什么,接下来要做什么。之前博客上写的是3d重建,后来视野开阔了之后发现无论我做3d重建,SLAM,AR,重要的都是姿态更新。一个精准的稳定的姿态更新,决定着系统的好坏。贝叶斯滤波器(EKF扩展卡尔曼滤波,PF粒子滤波)和通用图优化(G2O)是使得姿态更加精准稳定的两种方法。近些年来G2O在视觉SLAM领域逐渐成为了主流的后端优化方法。
具体的视觉SLAM流程和G2O的相关知识,我将在模块《关于SLAM的那些事》里的接下来两篇文章中讲到(包括自己优化的一些代码)。本篇博客主要讲一下G2O在windows环境下的搭配。为什么要选windows,因为这些年一直用的是vs的编辑器(vc++6.0,vs2012,vs2013),对于这个熟悉的领域突然换到ubuntu下使用cmake还是有点不适应的(尽管这么说,我还是推荐做学术的童鞋多用用linux系统如ubuntu,各种库真的很方便而且能学到很多东西)。言归正传,接下来讲一下开发win32程序和x64程序的G2O的环境搭配。

首先放一张G2O官方github的windows编译的步骤图以及G2O源码的下载链接

一共6个步骤:编译Eigen,安装Qt,编译libQGVLiewer,Cmake编译g2o,VS2013生成g2o,添加环境变量并开始使用。不需要g2o_viewer.exe来查看优化结果的不需要qt和libqgliewer(我觉得一般人都需要)。在ubuntu下还需要suitesparse但是windows不需要(其实EXTERNAL中有csparse)。

1.编译Eigen3.2.7

这个步骤在我的PCL编译中有详细讲解

2.安装Qt5.5.1

这里我们安装的是5.5.1的32位和64位的版本。大家也可以下载Qt4和Qt5的其他版本,都是可行的。注意下载的时候选择离线安装包里的windows主机下面的。有一个点要强调一下,要开发win32程序,程序中用到的所有lib和dll都需要是32位的,要开发x64程序,程序中用到的所有lib和dll都需要是64位的。include就无所谓了都一样。为什么要开发64位的程序呢,因为32位的程序在64位的win7,win8,win10系统里最大只能使用4G内存(微软官方说明,使用IMAGE_FILE_LARGE_ADDRESS_AWARE设置),而64位的程序可以使用高达几百G的内存。当然有小伙伴要说怎么可能使用那么多的内存,肯定存在内存泄漏问题,但是我还是想说,在内存管理得当的基础上,内存越大,我们能做的事越多。下载完成后分别安装,并用容易区分的名字命名(当然也可以只下载安装大家需要的位数的版本):

大家可以使用cmd输入qmake -v来查看qt是否安装成功。

接下来安装vs2013的QT插件(其他下载 中的 Visual Studio Add-in 1.2.4 for Qt5 (156 MB)),可以在vs中打开qt的工程(如下一步中的libQGLViewer.pro):

当然也可以用qt creator打开编译,但是我的C盘user中的用户名是中文,而creator编译过程中产生的临时变量在C:\Users\柴\AppData中老是识别不了中文,报错,而我不太熟悉qt creator所以经过尝试没有解决于是使用了vs的插件来打开编译qt工程。下载安装好之后打开vs2013,左上角可以看到QT5,开发选项:

添加刚才安装的qt版本的name和path。name自己决定,path按照下图中的写:

(注意图中下方的默认版本设置比较重要,下一步中编译不同版本的libqglviewer需要这里设置不同默认版本的qt)

3.编译libQGLViewer_2.6.3

安装好QT之后,我们下载libQGLViewer_2.6.3,解压后我们用vs2013打开(左上角QT5 -> 打开工程):

右键点击QGLViewer中的生成,或者按下图中的方式生成:

等待,然后看到了成功编译的Debug版本:(注意我们之前设置默认使用的是64位的qt,所以这里得到的是64位的libqglviewer编译结果: QGLViewerd2.lib QGLViewerd2.dll)

选择Release,再编译生成一遍:

同样成功编译并得到了64位的release版的libqglviewer编译结果: QGLViewer2.lib QGLViewer2.dll。

对于32位的,我们只需要更改qt插件的默认配置版本:

确定后重新使用插件打开libQGLViewer.pro,编译生成debug和release即可。完成后可以用不同名字区分开来,方便后续步骤库的选取:

4.Cmake编译g2o源代码

有了Eigen,Qt,libQGLViewer,我们就可以开始编译g2o源代码了,这里也是分32位和64位两个版本。文章一开始已经放出了G2O的下载链接,解压一次命名为win32,在解压一次命名为x64:

(先以32位为例)打开cmake,源码路径和编译路径为下图,提示建立build:

32位的话编译器选择Visual Studio 12 2013:

只需关注eigen,qt,libqglviewer,其他的如csparse等cmake已经帮我们找到了,不需要管。先找到Ungrouped Entries里和G2O里的EIGEN,添加路径(我的为C:/third_party/eigen/include/eigen3,大家的后缀应该一样X:/.../eigen/include/eigen3)。然后对于qt,如果没有改过安装后的qt原文件夹的名字的话,cmake是可以找到的。但是我们这里改成了Qt_32,所以还需要手动添加一下路径(如下图),QT_QMAKE_EXECUTABLE选择qmake.exe文件,Qt5_DIR选择文件夹cmake中的Qt5文件夹:

对于libqglviewer,手动添加include和lib(其中lib为文件,QGLViewerd2.lib是debug版,QGLViewer2.lib是release版):

include选择的是QGLViewer文件夹,而不是里面的文件:

手动添加完后,点击configure,系统会找到剩下的qt相关信息:

再次点击configure确认即可。没有红色后点击generate,即可在build中生成g2o.sln:

接下来再走一边x64的流程。 cmake设置好64位的源代码路径和编译路径,提示创建build文件夹并选择Visual Studio 12 2013 Win64编译器(注意和32位不用):

设置好eigen,qt,libqglviewer的路径:

点击configure:

确认qt的其他信息然后再点一次configure,无红色提示后点击generate:

我们可以看到32位和64位的build文件夹中都出现了g2o.sln:

5.VS2013生成G20

用VS2013打开win32的g2o.sln,然后生成all_build:

等待,然后得到全部成功的结果:

Release下再生成一边:

成功后可以在bin看到生成的lib,dll,exe文件:

VS打开64位文件夹中的g2o.sln然后生成debug版的all_build:

然后64位的release版的all_build:

6.添加环境变量并开始使用

添加环境变量,在path中添加dll的文件夹路径,32位和64位都加上,只开发win32的话不需要添加64位的:

C:\Qt_32\Qt5.5.1\5.5\msvc2013\bin;C:\Qt_64\Qt5.5.1\5.5\msvc2013\bin;C:\g2omaster_x64\bin\Release;C:\g2o-master_x64\bin\Debug; C:\g2o-master_win32\bin\Release; C:\g2o-master_win32\bin\Debug;

到此G2O的编译和环境配置就都完成啦。我在我的slam工程中已经成功使用g2o,其中有一些注意点,将在《关于SLAM的那些事》的第三篇文章中讲到(就是下下篇啦,下篇讲一下视觉SLAM的基本流程和代码)。这里说几个重要的:(1)把C:\g2o-master_win32\build\g2o\config.h拷贝到C:\g2o-master_win32\g2o\下,不然vs中提示找不到config.h (2)把C:\g2o-master_win32\EXTERNAL\csparse\cs.h
和 cs_api.h拷贝到C:\g2o-master_win32\g2o\solvers\csparse\里,然后打开本文件夹下的csparse_helper.h文件,把#include <cs.h>改成#include "cs.h" (3)右键vs工程,属性,C/C++,预处理器 中加上 _WINDOWS

下面两张图是我跑TUM数据集中的Fr1_XYZ数据集(792帧)的g2o优化结果:第一张没有加保护措施,新的一帧和上一个关键帧之间如果一直没有匹配上(合适的汉明距离,合适的姿态变换),那么接下来很多帧都会丢失,直到重新回到上一个关键帧附近的场景;第二张加了保护措施,连续6帧以上没匹配上,就会把新的一帧加入到关键帧里,同时计算上一个关键帧到这个关键帧的连续姿态变换然后存到图优化的边中。

57个关键帧节点,616条边:

139个关键帧节点,1270条边:

具体的信息接下来的博客中会慢慢讲道。我现在还在学习G2O,未来努力看能不能改进点什么。最后推荐一篇大牛半闲居士的博客,我在上面也学到了很多东西,感谢大家,欢迎交流,共同进步!

时间: 2024-08-07 17:00:32

关于SLAM的那些事——通用图优化(G2O)环境搭配(windows8.1 vs2013)的相关文章

网站服务器部署及优化---1---LAMP环境搭建(rhel6.5)

RedHat Enterprise 6.5 第一步:安装apache yum install -y httpd      安装相应软件包(前提是需要搭好yum源) service httpd start    启动apache服务 默认配置文件为:/etc/httpd/conf/httpd.conf 模块配置文件存放目录:/etc/httpd/conf.d 注:Apache可以通过扩展模块来扩充自己的功能,通常一个模块对应一个文件在/etc/httpd/conf.d目录下 /etc/httpd/

浏览器从输入网址发生的事(前端优化)

监控网页与程序性能 当在浏览器地址栏输入一个网址开始,到最终页面的呈现,浏览器完成了他的工作.我们要优化这个程序呈现的速度,首先就得弄明白这其中都发生了 什么事? 1.处理环节与顺序 这张图大致的描述了浏览器的一系列工作. 2.chrome中的performance属性 在chrome 浏览器的console中输入window.performace会得到下图的内容 usedJSHeapSize  js对象占用的内存一定小于totalJSHeapSize totalJSHeapSize  可使用的

一起做RGB-D SLAM (4)

第四讲 点云拼接 广告:“一起做”系列的代码网址:https://github.com/gaoxiang12/rgbd-slam-tutorial-gx 当博客更新时代码也会随着更新. SLAM技术交流群:254787961 读者朋友们大家好!尽管还没到一周,我们的教程又继续更新了,因为暑假实在太闲了嘛! 上讲回顾 上一讲中,我们理解了如何利用图像中的特征点,估计相机的运动.最后,我们得到了一个旋转向量与平移向量.那么读者可能会问:这两个向量有什么用呢?在这一讲里,我们就要使用这两个向量,把两张

前端性能优化-基础认知

基础:1.本地存储 2.后端逻辑 DNS寻址以及IP解析访问 Network 下的 Headers -> Remote Address 一样可以访问本站 WebServer 背后的事 性能优化包括前端.后端.网络以及硬件机器 页面渲染流程HTML页面请求浏览器的js引擎 尽量减少页面的reflow防止js绘制dom节点阻塞其他标签的解析甚至下载,比如 document.write 浏览器的JS引擎 WebPageTest 分析网络性能 性能优化:Yahoo军规 技术优化出发点 写成可复用的模块

VIO回顾:从滤波和优化的视角

https://mp.weixin.qq.com/s/zpZERtWPKljWNAiASBLJxA 根据以上网页自己做的总结: 在机器人社区中,定位与构图问题属于状态估计问题.主流使用的工具可以对给定噪声测量的动态系统进行随机估计,例如扩展卡尔曼滤波器(EKF)或粒子滤波器(PF). 一些内部传感器可以测量姿势随时间的变化,这种变化关系可以用公式表示为移动平台的数据驱动动力学模型,包括地面移动机器人中的光学编码器和飞行机器人中的IMU,众所周知它们具有累积误差和测量偏差. 一些外部传感器,如相机

Magnetic field constraints and sequence-based matching for indoor pose graph SLAM

摘要 姿态图优化的目的是根据相对姿态测量的约束来估计机器人的轨迹.由于室内环境中的磁场在时域中是稳定的,而在空间域中是足够变化的,因此我们可以利用这些特性来生成姿态图的约束.在本文中,我们提供了一种通过采用姿态图优化和室内磁测量来解决同时定位和制图(SLAM)问题的方法.具体而言,分别设计了用于局部航向校正和全局环路闭合的不同类型的约束.特别是对于环路闭合约束,我们首先检查室内磁场的空间相似性,并验证使用测量序列而不是单个测量可以减轻磁测量的歧义.然后根据磁测量的顺序提出闭环算法,并将其应用于姿

二级域名的优化方法

因为百度的一次大更新,一些之前完好的网站都被无情得k掉.只剩下一些二级域名,由于主站的庇佑还活着,不得已只能开始着手优化二级域名的站了. 大家都知道二级域名不同一级域名,就连换友链也是坑爹的,人家一看到二级域名就懒得来换了.而且各方面优化起来还是比较难的,那么,二级域名到底该如何优化呢? 优化二级域名最有效的一点就是提高主站权重. 对于搜索引擎来说你的二级域名是一个独立的站点,同时它也和我们的主域名网站有着很微妙的关系.我们可以打个比方,假如我们有一个主站,而如果我们在短期内在这个主域名下开通了

数据库5.5.32编译安装和简单的初步优化

.数据库5.5.32编译安装和简单的初步优化 1.环境: [[email protected] sbin]# cat/etc/redhat-release CentOS release 6.6 (Final) Ip:外网:10.0.0.31  内网:172.16.1.31 2.安装步奏: Useradd mysql -s /sbin/nologin -M Id mysql yum install cmake -y yum install libaio-develncurses-devel -y

nginx运维实战之开山篇-安装时优化实战

本次博文议程如下: 1.1 NGINX安装和基本优化 测试环境:centos6.5 x64 ip 192.168.1.62 安装前基本优化详见 1.1.1 隐藏版本 为了防止被黑客扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32版本,默认情况下可能导致服务器错误的将任何类型的文件以php的方式进行解析,比如上传一个jpg格式的木马到论坛网站,通过漏洞解析成一个