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

本篇博客在前人的基础上实际操作和总结的,稍有不同,主要是根据个人环境配置和编译的。
参考博客:白巧克力亦唯心

/usr/include/eigen3/Eigen/src/Core/util/Constants.h:162:37: note: declared here EIGEN_DEPRECATED const unsigned int AlignedBit = 0x80; ^~~~~~~~~~ In file included from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.h:35:0, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.cpp:27: /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/../core/base_binary_edge.h:60:80: warning: ‘Eigen::AlignedBit’ is deprecated [-Wdeprecated-declarations] typedef Eigen::Map<Matrix<double, Dj, Di>, Matrix<double, Dj, Di>::Flags & AlignedBit ? Aligned : Unaligned > HessianBlockTransposedType; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~ In file included from /usr/include/eigen3/Eigen/Core:344:0, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/../core/jacobian_workspace.h:30, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/../core/optimizable_graph.h:41, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/../core/base_vertex.h:30, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.h:34, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.cpp:27: /usr/include/eigen3/Eigen/src/Core/util/Constants.h:162:37: note: declared here EIGEN_DEPRECATED const unsigned int AlignedBit = 0x80; ^~~~~~~~~~ In file included from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.h:34:0, from /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/types_seven_dof_expmap.cpp:27: /home/ubuntu/catkin_ws/src/ORB_SLAM2/Thirdparty/g2o/g2o/types/../core/base_vertex.h: In instantiation of ‘class g2o::BaseVertex<7, g2o::
03-16
<think>好的,我现在需要帮助用户解决Eigen::AlignedBit被标记为过时的编译警告问题,特别是在编译ORB_SLAM2和g2o时。让我先理清楚这个问题的背景和可能的解决方案。 首先,用户提到的错误信息是关于在ORB_SLAM2的LoopClosing.cc文件中,mnFullBAIdx++这行代码引发了警告,说在bool类型上使用operator++已经过时。不过用户现在的问题是关于Eigen库中的AlignedBit被弃用,所以可能这两个问题有关联,或者用户同时遇到了多个编译警告。 根据引用[2],用户了解到Eigen 3.3版本取消了AlignedBit,建议使用3.2版本。这说明用户可能当前使用的是Eigen 3.3或更高版本,而ORB_SLAM2或g2o的代码中使用了已经被弃用的AlignedBit标志,导致编译警告。解决这个问题的方法可能有两种:降级Eigen到3.2版本,或者修改代码以适应新版本的Eigen。 接下来,我需要验证这两种方法的可行性。首先,降级Eigen版本可能是一个直接的解决方案,但用户可能需要保持其他依赖库的兼容性,或者希望使用更新的Eigen版本。因此,修改代码可能是更优的选择,但需要知道具体在哪些地方用到了AlignedBit。 查看ORB_SLAM2和g2o的代码,通常在这些库中,AlignedBit可能用于内存对齐,特别是在使用Eigen的数据类型时,例如Eigen::Vector3d或Eigen::Matrix等。在旧版Eigen中,可能需要显式指定内存对齐方式,使用Eigen::AlignedBit,但在新版本中,这可能已经被自动处理,或者需要不同的方式指定。 根据Eigen的文档,3.3版本之后,对于动态大小的矩阵,内存对齐可能不再需要手动指定,或者可以使用其他宏来代替。例如,Eigen::aligned_allocator可能替代旧的方法。因此,用户需要找到代码中使用AlignedBit的位置,将其替换为适合新版本的方法。 可能的代码修改包括将模板参数中的Eigen::AlignedBit替换为Eigen::AutoAlign或者直接移除,如果新版本默认已经处理了对齐问题。例如,在g2o的代码中,可能有类似这样的结构: template <typename T> using AlignedVector = std::vector<T, Eigen::aligned_allocator<T>>; 或者在使用容器时指定对齐分配器。如果原来的代码使用了Eigen::AlignedBit作为模板参数,可能需要调整这些地方。 另外,用户提到的编译错误中,mnFullBAIdx++可能是一个bool变量,但被当作整型进行自增操作,这在C++中是不允许的,或者已经被弃用。这可能是另一个独立的问题,需要将mnFullBAIdx的类型从bool改为int或size_t等整型类型。 因此,用户需要处理两个不同的问题:一个是Eigen::AlignedBit的弃用警告,另一个是bool变量的自增操作警告。不过用户当前的问题主要集中在Eigen的警告上。 总结可能的解决方案: 1. 降级Eigen到3.2版本,这样可以避免AlignedBit的问题。但需要注意其他库可能依赖更高版本的Eigen,可能存在兼容性问题。 2. 更新ORB_SLAM2和g2o的代码,将涉及AlignedBit的地方替换为新版本Eigen的语法。例如,将EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏的使用检查是否正确,或者使用对齐的容器分配器。 3. 查找ORB_SLAM2和g2o的官方社区或GitHub仓库,是否有针对新版本Eigen的补丁或分支,可能已经有人解决了这个问题。 根据引用[3],用户尝试过使用CMake编译但遇到堆空间问题,转而使用VS2019配置。这可能意味着用户在Windows环境下编译,需要手动管理依赖库的版本。 现在需要具体指导用户如何修改代码。例如,在g2o中,可能有类似以下代码: typedef std::vector<MyClass, Eigen::aligned_allocator<MyClass>> AlignedVector; 或者在使用Eigen类型作为成员变量的类中,需要添加EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏来确保正确的内存对齐。如果这些地方使用了旧的AlignedBit标志,可能需要调整。 此外,检查Eigen的更新日志,AlignedBit被弃用后,应该使用什么替代方法。根据Eigen的文档,内存对齐现在可能更自动,或者需要使用不同的宏或分配器。 可能的步骤: - 查找代码中所有包含Eigen::AlignedBit的地方,替换为新的方法,或者删除该标志。 - 确保所有使用Eigen类型的类正确使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏。 - 如果使用C++11或更高版本,可以使用对齐的分配器如std::aligned_allocator,或者继续使用Eigen提供的aligned_allocator。 另外,用户可能需要修改g2o库中的代码,因为g2o可能依赖Eigen的对齐设置。例如,在g2o/solvers/linear_solver_eigen.h中,可能有需要调整的部分。 最后,如果用户无法立即修改所有代码,临时解决方案是使用Eigen 3.2版本,直到代码库更新支持新版本Eigen。</think>### 解决 Eigen::AlignedBit 被弃用的编译警告问题 #### 1. 问题根源分析 编译警告源于代码中使用了 Eigen 3.3+ 已弃用的 `Eigen::AlignedBit` 标志,该标志在内存对齐操作中被标记为过时[^2]。常见场景包括: - **显式内存对齐声明**:例如在模板参数或容器定义中指定对齐方式。 - **第三方库依赖**:ORB_SLAM2 和 g2o 可能依赖旧版 Eigen 的语法。 #### 2. 解决方案 ##### 方法一:降级 Eigen 至 3.2 版本 - **步骤**: 1. 下载 Eigen 3.2:[官方发布页面](https://gitlab.com/libeigen/eigen/-/releases/3.2.10)。 2. 替换现有 Eigen 头文件目录(通常位于 `/usr/include/eigen3` 或项目本地依赖路径)。 3. 重新编译 ORB_SLAM2 和 g2o。 - **注意**:需确保其他依赖库兼容 Eigen 3.2。 ##### 方法二:修改代码适配 Eigen 3.3+ - **关键修改点**: 1. **移除 `Eigen::AlignedBit` 声明** 查找代码中类似以下片段并删除 `Eigen::AlignedBit`: ```cpp typedef Eigen::Matrix<double, 6, 6> Matrix6d; // 旧代码可能包含: // typedef Eigen::Matrix<double, 6, 6, Eigen::AlignedBit> Matrix6d; ``` 2. **使用 `Eigen::aligned_allocator` 替代对齐分配器** 在 STL 容器中使用 Eigen 类型时,显式指定对齐分配器: ```cpp std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> points; ``` 3. **添加 `EIGEN_MAKE_ALIGNED_OPERATOR_NEW` 宏** 在自定义类中,若包含固定大小的 Eigen 类型成员变量,需在类声明中添加宏: ```cpp class MyClass { public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW // 确保 new 操作符对齐内存 Eigen::Vector3d position; }; ``` - **示例修改(针对 g2o)**: 在 g2o 的 `vertex_se3.h` 或类似文件中,检查是否遗漏对齐宏,并补充定义。 #### 3. 验证与编译 1. 清理项目构建缓存: ```bash rm -rf build/ && mkdir build && cd build ``` 2. 重新生成 Makefile 并编译: ```bash cmake .. -DCMAKE_BUILD_TYPE=Release make -j4 ``` #### 4. 补充建议 - **更新代码库**:检查 ORB_SLAM2/g2o 的 GitHub 仓库,查看是否有针对 Eigen 3.3+ 的补丁分支。 - **调试工具**:若仍存在对齐错误,可使用 `gdb` 或 `AddressSanitizer` 检测内存越界问题。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值