g2o: 如何使用g2o的例子

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 
### 回答1: 要修改g2o_viewer的颜色,你需要打开g2o_viewer的源代码,找到对应的颜色设置部分进行更改。以下是一个例子: 在源代码中搜索 "glColor3f",这是设置颜色的函数。 找到需要更改的颜色的代码行,例如: ```cpp glColor3f(1.0f, 1.0f, 1.0f); // 设置颜色为白色 ``` 将颜色值更改为所需的颜色值,例如: ```cpp glColor3f(0.0f, 0.0f, 1.0f); // 设置颜色为蓝色 ``` 保存修改后的代码并重新编译g2o_viewer。打开程序后,你应该看到新的颜色已经生效了。 请注意,这只是一个简单例子,实际上你可能需要修改多个颜色设置才能完全改变g2o_viewer的外观。 ### 回答2: g2o_viewer是一个用于可视化和调试g2o图优化结果的工具。g2o图是基于顶点和边的表示方法,用于求解非线性最小二乘问题。为了修改g2o_viewer中的颜色,我们可以按照下面的步骤进行操作。 首先,打开g2o_viewer的源代码文件夹,并找到用于设置图元素颜色的相关代码块。这些代码通常可以在g2o_viewer.cpp或类似的文件中找到。 其次,查找需要修改颜色的图元素的名称或标识。g2o图通常包含不同类型的顶点和边,我们可以根据需要修改其中的任意一种类型或多种类型的颜色。 然后,确定要修改的颜色。可以通过修改RGB值或使用预定义的颜色名称来实现。预定义颜色名称通常以字符串形式存储,比如“红色”可以表示为“red”或“#FF0000”。 接下来,在相应的代码块中添加修改颜色的语句。具体的语法和方法可能因工具版本和实现而有所不同。一种常见的方法是通过调用g2o_viewer提供的设置颜色的函数。这些函数通常具有类似于“setColor()”的名称,并接受参数(顶点或边的标识符,颜色值)。根据具体的函数和参数命名规则,把需要修改颜色的图元素的标识和相应的颜色值传递给函数。 最后,重新编译和运行g2o_viewer,查看修改后的颜色效果。根据修改颜色的具体范围和代码位置,可能需要重新编译整个工具或仅编译特定的文件。 通过以上步骤,我们可以在g2o_viewer中修改不同图元素的颜色。根据具体的需求和实现,可以分别修改某个特定顶点、边或整个g2o图的颜色。这样做可以帮助我们更好地理解和分析优化结果。 ### 回答3: g2o_viewer是一个用于可视化图优化结果的工具,它基于OpenGL库开发而成,可以方便地查看和分析图优化算法的结果。 在g2o_viewer中,要修改颜色,可以通过对代码进行修改或者通过设置参数来实现。下面介绍两种方法: 第一种方法是通过修改代码来修改颜色。在g2o_viewer的源代码中,可以找到与颜色相关的变量或者函数进行修改。例如,在绘制节点的函数中,可以修改绘制节点的颜色,可以通过修改绘制边的函数来修改绘制边的颜色。这种方法需要对g2o_viewer的源代码比较熟悉,需要具备一定的编程能力。 第二种方法是通过设置参数来修改颜色。在运行g2o_viewer的时候,可以通过命令行参数或者配置文件来设置一些参数,从而达到修改颜色的目的。例如,可以通过设置参数来修改节点的颜色、边的颜色以及其他图元的颜色。具体的参数设置方式可以参考g2o_viewer的使用文档或者相关的帮助文档。 总之,要在g2o_viewer中修改颜色有多种方法,可以通过代码修改或者设置参数来实现。具体选择哪种方法取决于个人的需求和熟悉程度。不过无论采用哪种方法,都需要对g2o_viewer有一定的了解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值