g2o的安裝及初步使用

聲明:本博客僅供個人學習使用。轉載自  Jasmine_shine


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的使用,對之後的理解可能是好的。

本篇博客在前人的基礎上實際操作和總結的,稍有不同,主要是根據個人環境配置和編譯的。 
參考博客:白巧克力亦唯心





發佈了34 篇原創文章 · 獲贊 76 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章