g2o: 如何使用g2o的例子

8人阅读 评论(0) 收藏 举报
分类:

g2o 重要的文献:

1.论文 Grisetti, Giorgio, et al. “A tutorial on graph-based SLAM.” IEEE Intelligent Transportation Systems Magazine 2.4 (2010): 31-43. pdf 
2.论文 Kümmerle, Rainer, et al. “g2o: A general framework for graph optimization.” Robotics and Automation (ICRA), 2011 IEEE International Conference on. IEEE, 2011. pdf 
3.课件 Least Squares and SLAM Pose-SLAM pdf1 pdf2

g2o代码示例

1. simple_optimize

simple_optimize 所在的github 链接地址

首先, 看效果

数据集可以在OpenSLAM Vertigo 下载, 详见链接
包括 city10000, intel, manhattan, ring, ringCity, sphere2500.

先测试sphere2500.

运行前 
运行前 
运行后 
运行后

测试manhattanOlson3500.

运行前 
这里写图片描述 
运行后 
这里写图片描述

sphere2500 和manhattanOlson3500的维度不一样,故而给出两次测试.

其次, 看代码

此处的代码是sphere2500测试. 
simple_optimize.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/slam2d/vertex_se2.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); 

#include <iostream>

using namespace std;
using namespace g2o;

#define MAXITERATION 10
int main()
{
    // 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);

    // create the optimizer
    SparseOptimizer optimizer;

    if(!optimizer.load("../data/sphere_bignoise_vertex3.g2o"))
    // if(!optimizer.load("../data/manhattanOlson3500.g2o"))
    {
        cout<<"Error loading graph"<<endl;
        return -1;
    }else
    {
        cout<<"Loaded "<<optimizer.vertices().size()<<" vertices"<<endl;
        cout<<"Loaded "<<optimizer.edges().size()<<" edges"<<endl;
    }

    // VertexSE2* firstRobotPose = dynamic_cast<VertexSE2*>(optimizer.vertex(0));
    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.save("../data/manhattanOlson3500_after.g2o");
    optimizer.clear();

    return 0;
}
  • 代码中需要注意的地方, 

1. G2O_USE_TYPE_GROUP 保证能够进graph的load 和save, 进行类型注册, 也就是optimizer.load 和optimizer.save 在执行时有相对的类型对应. slam3d 和slam2d是对应不同的顶点和边的类型. 这里都registration.

G2O_USE_TYPE_GROUP(slam3d);
G2O_USE_TYPE_GROUP(slam2d); 
  • 1
  • 2
  1. MAXITERATION 执行优化次数

  2. VertexSE3* firstRobotPose 
    此处本来是设定不优化的固定点的,但是考虑不同的维度的顶点需要采用不同的类型设置固定点,所以在此提出.

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(simple_optimize)

#Enable support for C++11
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

#set binary path
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set lib path
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#set .cmake path
#SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "{CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
#ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)

# find g2o lib
find_package(G2O REQUIRED)
IF(G2O_FOUND)
    include_directories(${G2O_INCLUDE_DIR})
    message("G2O lib is found:"${G2O_INCLUDE_DIR})
ENDIF(G2O_FOUND)

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(simple_optimize simple_optimize.cpp)
target_link_libraries(simple_optimize ${G2O_LIBS})
  • 而对于manhattanOlson3500的测试代码, 三维到二维仅仅需要修改3处 

1. optimizer.load() 
2. optimizer.save() 
3. VertexSE3* firstRobotPose 成VertexSE2* firstRobotPose

最后, 介绍使用过程

为方便使用,也为自己存档, CSDN下载地址: 
g2o example simple_optimize

接着, 编译运行

cd simple_optimize
mkdir build
cmake ..
make
cd ../bin
./simple_optimize
  • 查看结果
g2o_viewer ../data/sphere_after.g2o 
查看评论

G2O计算摄像机位姿变化的例子。

  • 2017年12月15日 16:43
  • 790KB
  • 下载

graph slam学习:g2o

1. graph_slam 学习 关于graph-slam的学习详细参照教材 2005版 第11章 图优化实际上是解一种非线性最小二乘问题,主要用于离线的slam...
  • zyh821351004
  • zyh821351004
  • 2015-06-16 17:42:40
  • 13633

g2o安装教程

安装依赖sudo apt-get install libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev 使用cm...
  • Iriving_shu
  • Iriving_shu
  • 2016-12-24 15:31:36
  • 650

graph slam tutorial : g2o 的使用

下载安装g2o,怎么安装,注意安装那些库,并用优化前后的图简单介绍介绍。        g2o作为一个外接程序库在自己程序里怎么使用呢?如果不熟悉cmake的话,可以点击这里(看文章中在工程中查找...
  • heyijia0327
  • heyijia0327
  • 2015-10-12 11:06:30
  • 21094

图优化理论与g2o的使用

1 前言以及回顾    各位朋友,自从上一篇《视觉SLAM漫谈》写成以来已经有一段时间了。我收到几位热心读者的邮件。有的希望我介绍一下当前视觉SLAM程序的实用程度,更多的人希望了解一下前文提到...
  • ganbaoni9yang
  • ganbaoni9yang
  • 2016-01-06 11:14:58
  • 1041

windows编译g2o图优化框架(vs2010)

windows编译g2o图优化框架(vs2010)
  • u012736826
  • u012736826
  • 2016-05-11 15:15:34
  • 1831

使用G2O拟合曲线

这是参考自清华大学的高翔所著的《视觉SLAM十四讲》读后感,笔记和摘要。 使用G2O拟合曲线。...
  • oneJN
  • oneJN
  • 2017-05-18 11:37:00
  • 366

【转】 slam 优化包g2o 学习

1. graph_slam 学习       关于graph-slam的学习详细参照教材> 2005版     第11章        图优化实际上是解一种非线性最小二乘问题,主要用于离线的sla...
  • akunainiannian
  • akunainiannian
  • 2015-10-07 10:07:20
  • 4356

g2o编译及配置

对于ubuntu14.04来说g2o的编译和配置还是比较容易的,只不过今天走了一段弯路,很是上火。现在写出我掉进去的坑,希望其他人不要再踩了。 1.首先在https://github.com/Rai...
  • u013004597
  • u013004597
  • 2016-09-10 21:02:49
  • 1683

g2o小记

1耗时问题在g2o中有许多Solver可以选择。 实测发现Dense非常非常的慢,慢到不能用。 后面改成Cholmod就非常快。 在使用Cholmod时还需要在cmakelists里加一个lib...
  • u010566411
  • u010566411
  • 2017-06-07 21:41:34
  • 1777
    个人资料
    持之以恒
    等级:
    访问量: 9087
    积分: 311
    排名: 25万+