g2o的安装及初步使用
2015-12-07 14:37
471 查看
g2o的安装及初步使用
运行环境:ubuntu12.04 + g2o
个人原创,转载请注明来自Jasmine_shine的专栏:
一、g2o的安装
1、安装依赖项:
sudo apt-get install libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-qt4-dev
2、从官网上下载并从源码安装,下载网址为https://github.com/RainerKuemmerle/g2o。
将此文件解压,可以采用命令,也可以直接右键“提取到此处“,然后放到你想放的文件路径里。源码安装:
如果编译没有出错,就会在/usr/local/include看到g2o的包含文件,在usr/local/lib看到g2o的库文件,在usr/local/bin看到g2o的可执行文件。
具体的安装方式可参考博客:http://www.cnblogs.com/gaoxiang12/p/4739934.html
二、g2o的小试牛刀
g2o是一些大牛们封装好的一个可以计算图优化的一个库,因此只需要输入一组点和边的信息,g2o就可以进一步优化你的这些点和边。下面是一个优化圆的例子。
在Ubuntu环境下,要先创建一个文件夹,代表一个工程。这个工程必须包含几个子文件夹,分别是bin(生成的可执行文件的存放路径),include(包含的头文件,也就是.h文件),data(提取的实验数据), src(源文件,也就是.cpp文件), CMakeLists.txt(编译环境设置)。
此时的CMakeList.txt与源文件中的不同,只需设置一些简单的编译条件即可:
在这里,我们值涉及到一个简单的main.cpp文件,如下:
此外,在src文件夹下必须建一个CMakeList.txt文件,用于编译main.cpp。
到目前为止,main.cpp以及编译配置都已经完成,数据的输入data提取的是这个网址里的数据:https://github.com/HeYijia/GraphSLAM_tutorials_code/tree/master/g2o_test/data。
一般情况下,编译所需的文件都已经差不多了,但是这个程序依赖很多库,所以需额外在工程文件夹下添加一个cmake_modules文件夹,里面包含很多cmake文件。下载地址为:https://github.com/HeYijia/GraphSLAM_tutorials_code/tree/master/g2o_test/cmake_modules。
so,你现在可以执行
到目前为止,如果没有意外的话,应该在bin文件夹下生成了一个跟工程名相同的可执行文件,只需要执行这个文件./g2o_test,就会在data文件夹下生成一个.g2o的文件。采用g2o_viewer 即可看到生成的文件。但是由于个人在安装的时候在/usr/local/bin没有生成g2o_viewer这个可执行文件,所以不能可视化这个文件。
后续的话,可能会更注重g2o的原理了,毕竟操作是最简单的,先从形象话了解一些g2o的使用,对之后的理解可能是好的。
本篇博客在前人的基础上实际操作和总结的,稍有不同,主要是根据个人环境配置和编译的。
参考博客:白巧克力亦唯心
运行环境:ubuntu12.04 + g2o
个人原创,转载请注明来自Jasmine_shine的专栏:
一、g2o的安装
1、安装依赖项:
sudo apt-get install libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-qt4-dev
2、从官网上下载并从源码安装,下载网址为https://github.com/RainerKuemmerle/g2o。
将此文件解压,可以采用命令,也可以直接右键“提取到此处“,然后放到你想放的文件路径里。源码安装:
mkdir build cd build cmake .. make sudo make install
如果编译没有出错,就会在/usr/local/include看到g2o的包含文件,在usr/local/lib看到g2o的库文件,在usr/local/bin看到g2o的可执行文件。
具体的安装方式可参考博客:http://www.cnblogs.com/gaoxiang12/p/4739934.html
二、g2o的小试牛刀
g2o是一些大牛们封装好的一个可以计算图优化的一个库,因此只需要输入一组点和边的信息,g2o就可以进一步优化你的这些点和边。下面是一个优化圆的例子。
在Ubuntu环境下,要先创建一个文件夹,代表一个工程。这个工程必须包含几个子文件夹,分别是bin(生成的可执行文件的存放路径),include(包含的头文件,也就是.h文件),data(提取的实验数据), src(源文件,也就是.cpp文件), CMakeLists.txt(编译环境设置)。
此时的CMakeList.txt与源文件中的不同,只需设置一些简单的编译条件即可:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) PROJECT( g2o_test ) SET(CMAKE_CXX_COMPILER "g++") SET( CMAKE_BUILD_TYPE Debug ) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include ) LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib) ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src )
在这里,我们值涉及到一个简单的main.cpp文件,如下:
#include "g2o/core/sparse_optimizer.h" #include "g2o/core/block_solver.h" #include "g2o/core/factory.h" #include "g2o/core/optimization_algorithm_levenberg.h" #include "g2o/solvers/csparse/linear_solver_csparse.h" #include "g2o/types/slam3d/vertex_se3.h" //#include "g2o/types/slam3d/edge_se3.h" // 使用 宏函数 声明边和顶点类型,注意注释掉了上面两个头文件 G2O_USE_TYPE_GROUP(slam3d); //G2O_USE_TYPE_GROUP(slam2d); //2d平面 #include <iostream> using namespace std; using namespace g2o; #define MAXITERATION 50 int main() { cout<< "Hello g2o"<<endl; // create the linear solver BlockSolverX::LinearSolverType * linearSolver = new LinearSolverCSparse<BlockSolverX::PoseMatrixType>(); // create the block solver on the top of the linear solver BlockSolverX* blockSolver = new BlockSolverX(linearSolver); //create the algorithm to carry out the optimization OptimizationAlgorithmLevenberg* optimizationAlgorithm = new OptimizationAlgorithmLevenberg(blockSolver); /* //如果没用前面的宏函数,而是调用的是edge_se3和vertex_se3头文件 //想让程序能识别VertexSE3这些数据类型,就要显示的调用它们,如下 //如果只用了头文件,而没用显示调用,那么这些数据类型将不会link进来 //在下面的optimizer.load函数将不能识别这些数据类型 for(int f=0; f<10;++f) { VertexSE3* v = new VertexSE3; v->setId(f++); } */ // create the optimizer SparseOptimizer optimizer; if(!optimizer.load("../data/sphere_bignoise_vertex3.g2o")) { cout<<"Error loading graph"<<endl; return -1; }else { cout<<"Loaded "<<optimizer.vertices().size()<<" vertices"<<endl; cout<<"Loaded "<<optimizer.edges().size()<<" edges"<<endl; } //优化过程中,第一个点固定,不做优化; 也可以不固定。 VertexSE3* firstRobotPose = dynamic_cast<VertexSE3*>(optimizer.vertex(0)); firstRobotPose->setFixed(true); optimizer.setAlgorithm(optimizationAlgorithm); optimizer.setVerbose(true); optimizer.initializeOptimization(); cerr<<"Optimizing ..."<<endl; optimizer.optimize(MAXITERATION); cerr<<"done."<<endl; optimizer.save("../data/sphere_after.g2o"); //optimizer.clear(); return 0; }
此外,在src文件夹下必须建一个CMakeList.txt文件,用于编译main.cpp。
# 添加g2o的依赖 # 因为g2o不是常用库,要添加它的findg2o.cmake文件 LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules ) SET( G2O_ROOT /usr/local/include/g2o ) FIND_PACKAGE( G2O ) # CSparse FIND_PACKAGE( CSparse ) INCLUDE_DIRECTORIES( ${G2O_INCLUDE_DIR} ${CSPARSE_INCLUDE_DIR} ) find_package(Eigen3 REQUIRED) find_package(CSparse REQUIRED) #find_package(Cholmod REQUIRED) include_directories(${CSPARSE_INCLUDE_DIR}) include_directories(${EIGEN3_INCLUDE_DIR}) #include_directories(${CHOLMOD_INCLUDE_DIR}) SET(G2O_LIBS g2o_cli g2o_ext_freeglut_minimal g2o_simulator g2o_solver_slam2d_linear g2o_types_icp g2o_types_slam2d g2o_core g2o_interface g2o_solver_csparse g2o_solver_structure_only g2o_types_sba g2o_types_slam3d g2o_csparse_extension g2o_opengl_helper g2o_solver_dense g2o_stuff g2o_types_sclam2d g2o_parser g2o_solver_pcg g2o_types_data g2o_types_sim3 cxsparse ) ADD_EXECUTABLE(g2o_test main.cpp) target_link_libraries(g2o_test ${G2O_LIBS}) #target_link_libraries(g2o_test csparse g2o_core g2o_solver_cholmod g2o_solver_csparse g2o_types_slam3d)
到目前为止,main.cpp以及编译配置都已经完成,数据的输入data提取的是这个网址里的数据:https://github.com/HeYijia/GraphSLAM_tutorials_code/tree/master/g2o_test/data。
一般情况下,编译所需的文件都已经差不多了,但是这个程序依赖很多库,所以需额外在工程文件夹下添加一个cmake_modules文件夹,里面包含很多cmake文件。下载地址为:https://github.com/HeYijia/GraphSLAM_tutorials_code/tree/master/g2o_test/cmake_modules。
so,你现在可以执行
mkdir build cd build cmake .. make
到目前为止,如果没有意外的话,应该在bin文件夹下生成了一个跟工程名相同的可执行文件,只需要执行这个文件./g2o_test,就会在data文件夹下生成一个.g2o的文件。采用g2o_viewer 即可看到生成的文件。但是由于个人在安装的时候在/usr/local/bin没有生成g2o_viewer这个可执行文件,所以不能可视化这个文件。
后续的话,可能会更注重g2o的原理了,毕竟操作是最简单的,先从形象话了解一些g2o的使用,对之后的理解可能是好的。
本篇博客在前人的基础上实际操作和总结的,稍有不同,主要是根据个人环境配置和编译的。
参考博客:白巧克力亦唯心
相关文章推荐
- UML类图
- 15个初学者必看的基础SQL查询语句
- Mybatis+SpringMVC+注解事务遇到的一些问题及解决
- Android中SharedPreferences的总结
- IOS之Objectivc-c获取本地存储路径
- 安装帝国CMS遇到“修改php.ini,将:short_open_tag 设为 On”的解决方法+“建立目录不成功!请检查目录权限”问题
- [Fine Uploader] 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]
- iOS键盘操作
- 创建数据库,并定义ContentProvider接口
- 基于jQuey实现鼠标滑过变色(整行变色)
- Apache JMeter--压力测试工具
- js实现遍历含有input的table实例
- 整合大量开源库温习基础项目(四)伸缩实现OverscrollScale以及MaterialLoadingProgressBar
- 整合大量开源库温习基础项目(四)伸缩实现OverscrollScale以及MaterialLoadingProgressBar
- CSS3颜色格式和透明度
- Linux下添加新硬盘,分区及挂载
- js 验证电话号 座机及手机号
- git远程代码库回滚(webstorm下)
- git本地代码库回滚(webstorm下)
- memcache和redis区别