g2o学习记录(3)源码下的example例子运行

g2o(3)源码下的example例子运行

  由于我使用的是Cmake3.5.1版本,高版本必须加上

cmake_minimum_required(VERSION 3.5)

  第一次运行cmake命令的时候会出现:

/usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/tanqiwei/Documents/environment/g2o/g2o/examples
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at interactive_slam/slam_parser/parser/CMakeLists.txt:30 (install):
  install TARGETS given no ARCHIVE DESTINATION for static library target
  "parser_library".


CMake Error at interactive_slam/slam_parser/interface/CMakeLists.txt:24 (install):
  install TARGETS given no ARCHIVE DESTINATION for static library target
  "interface_library".


-- Configuring incomplete, errors occurred!
See also "/home/tanqiwei/Documents/environment/g2o/g2o/examples/cmake-build-debug/CMakeFiles/CMakeOutput.log".

[Finished]

  去阅读后,你会发现其实是目录没有设置的缘故

  对于Cmake的Install可以在这里查看详情。为了简单期间,我就下面这么使用(到时候不行再删,我就是这么任性)

        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static

  更新的分别是报错的那两个CMakeLists.txt。

  然后得到Cmake运行如下所示:

/usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/tanqiwei/Documents/environment/g2o/g2o/examples
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tanqiwei/Documents/environment/g2o/g2o/examples/cmake-build-debug

[Finished]

  已经没有报错了,然后我们运行build命令,会发现报错是下面那样的错误。

/usr/bin/cmake --build /home/tanqiwei/Documents/environment/g2o/g2o/examples/cmake-build-debug --target convert_sba_slam3d -- -j 2
Scanning dependencies of target convert_sba_slam3d
[ 50%] Building CXX object data_convert/CMakeFiles/convert_sba_slam3d.dir/convert_sba_slam3d.cpp.o
In file included from /usr/include/c++/5/unordered_map:35:0,
                 from /usr/local/include/g2o/core/hyper_graph.h:36,
                 from /usr/local/include/g2o/core/optimizable_graph.h:35,
                 from /home/tanqiwei/Documents/environment/g2o/g2o/examples/data_convert/convert_sba_slam3d.cpp:33:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support \
  ^
In file included from /usr/local/include/g2o/types/sba/types_sba.h:33:0,
                 from /home/tanqiwei/Documents/environment/g2o/g2o/examples/data_convert/convert_sba_slam3d.cpp:35:
/usr/local/include/g2o/types/sba/sbacam.h:41:22: fatal error: Eigen/Core: 没有那个文件或目录
compilation terminated.
data_convert/CMakeFiles/convert_sba_slam3d.dir/build.make:62: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/convert_sba_slam3d.cpp.o' failed
make[3]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/convert_sba_slam3d.cpp.o] Error 1
CMakeFiles/Makefile2:195: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/all' failed
make[2]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/all] Error 2
CMakeFiles/Makefile2:207: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/rule' failed
make[1]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/rule] Error 2
Makefile:188: recipe for target 'convert_sba_slam3d' failed
make: *** [convert_sba_slam3d] Error 2

  和第一篇博文一样,修改/usr/local/include/g2o/types/sba/sbacam.h,在前面加上eigen3修改成<eigen3/Eigen/Core>,目前我还没有找到很好的办法,希望大家可以帮忙想个办法,现在这个是最愚蠢也算很有效的办法了。

  类似的还有/usr/local/include/g2o/types/sba/types_sba.h。

  运行过程中,比如报错如:

/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support \

  在example下的总的CMakeList.txt加上:

set(CMAKE_CXX_FLAGS "-std=c++11")

  然后会报错,比如:

/usr/bin/cmake --build /home/tanqiwei/Documents/environment/g2o/g2o/examples/cmake-build-debug --target convert_sba_slam3d -- -j 2
[ 50%] Building CXX object data_convert/CMakeFiles/convert_sba_slam3d.dir/convert_sba_slam3d.cpp.o
[100%] Linking CXX executable convert_sba_slam3d
/usr/bin/ld: 找不到 -lcore
/usr/bin/ld: 找不到 -ltypes_slam3d
/usr/bin/ld: 找不到 -ltypes_sba
collect2: error: ld returned 1 exit status
data_convert/CMakeFiles/convert_sba_slam3d.dir/build.make:94: recipe for target 'data_convert/convert_sba_slam3d' failed
make[3]: *** [data_convert/convert_sba_slam3d] Error 1
CMakeFiles/Makefile2:195: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/all' failed
make[2]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/all] Error 2
CMakeFiles/Makefile2:207: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/rule' failed
make[1]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/rule] Error 2
Makefile:188: recipe for target 'convert_sba_slam3d' failed
make: *** [convert_sba_slam3d] Error 2

  这种情况下,在第一篇博文有描述,主要是生成的库文件并不是其内部写的那些名字,第一篇博文中有列举表格。

  这里修改比如在example下的data_convert下的CMakeLists.txt:

target_link_libraries(convert_sba_slam3d g2o_core g2o_types_slam3d g2o_types_sba)

  前面都加上g2o_前缀。

  这时候再运行你会发现,会指出:

[ 50%] Linking CXX executable convert_sba_slam3d
/usr/bin/ld: CMakeFiles/convert_sba_slam3d.dir/convert_sba_slam3d.cpp.o: undefined reference to symbol '_ZN3g2o11CommandArgsD1Ev'
//usr/local/lib/libg2o_stuff.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
data_convert/CMakeFiles/convert_sba_slam3d.dir/build.make:94: recipe for target 'data_convert/convert_sba_slam3d' failed
make[3]: *** [data_convert/convert_sba_slam3d] Error 1
CMakeFiles/Makefile2:195: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/all' failed
make[2]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/all] Error 2
CMakeFiles/Makefile2:207: recipe for target 'data_convert/CMakeFiles/convert_sba_slam3d.dir/rule' failed
make[1]: *** [data_convert/CMakeFiles/convert_sba_slam3d.dir/rule] Error 2
Makefile:188: recipe for target 'convert_sba_slam3d' failed
make: *** [convert_sba_slam3d] Error 2

  指出你没有libg2o_stuff.so,这在第一篇博文也有描述过如何解决。

  我们只需要继续修改刚刚前面的那个文件,加入g2o_stuff即可。

target_link_libraries(convert_sba_slam3d g2o_core g2o_types_slam3d g2o_types_sba g2o_stuff)

  这时候的data_convert/convert_sba_slam3d可以运行了,只不过运行参数不对。

Error: program requires parameters
Usage: /home/tanqiwei/Documents/environment/g2o/g2o/examples/cmake-build-debug/data_convert/convert_sba_slam3d gm2dl-input gm2dl-output

General options:
-------------------------------------------
-help / -h           Displays this help.

  现在先不管这些,我们继续按照以上流程把所有都改完错误。

  不过中途还有类似于当前项目中的Eigen3找不到。

/home/tanqiwei/Documents/environment/g2o/g2o/examples/data_fitting/curve_fit.cpp:27:22: fatal error: Eigen/Core: 没有那个文件或目录

  这种情况下,你可以学我处理的第一种,也可以在CMakeList.txt加入下面的命令。

find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIRS})

add_executable(curve_fit curve_fit.cpp)
set_target_properties(curve_fit PROPERTIES OUTPUT_NAME curve_fit${EXE_POSTFIX})
target_link_libraries(curve_fit core)

  细心的你或许已经发现,target_link_libraries中居然有core,这是不是很熟悉,快加g2o_前缀。

  然而运行的时候,你会发现,又缺了libg2o_stuff.so,这个改法前面已经说过,不再赘述。

  其实第一篇的CMakeList.txt我也想这么改,把所有eigen3的那种改法变成这种格式,不过发现g2o是写了的,但是为什么会如此不太清楚。

find_package(Eigen3 REQUIRED)
if (TARGET Eigen3::Eigen)
  set(G2O_EIGEN3_EIGEN_TARGET Eigen3::Eigen)
else()
  include_directories(${EIGEN3_INCLUDE_DIR})
endif ()

  你会发现,你的curve_fit运行出来的,结果就是:

Target curve
a * exp(-lambda * x) + b
Iterative least squares solution
a      = 1.98894
b      = 0.406972
lambda = 0.201044


Process finished with exit code 0

  后面也诸如此类修改吧。

  最后你在命令行用make命令的运行结果就是:

  我们都编译通过了。

  接下来运行前面的例子。比如convert_sba_slam3d,我输入个-h看看。

  看来需要给出输入的东西和输出的东西,这就不是我现在所关注的了,以后有时间再说。

结语

  虽然编译成功了,但是还有部分的example,其实它的CMakeList.txt并没有编译,这就需要后面一个个编译了,这看情况我到时候记录不记录,祝各位一起共同学习和成长。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
g2o源码比较复杂,主要分为以下几个部分: 1. core:核心部分,包括图模型(Graph)、顶点(Vertex)、边(Edge)、优化算法(OptimizationAlgorithm)等。 2. solver:求解器部分,包括线性求解器(LinearSolver)、稀疏矩阵(SparseBlockMatrix)、稠密矩阵(DenseBlockMatrix)等。 3. types:类型部分,包括各种图优化问题相关的数据类型,如向量(Vector)、旋转矩阵(SE3)、四元数(Quaternion)等。 4. stuff:工具部分,包括文件读写、时间计算、随机数生成、命令行参数解析等。 下面以求解一个简单的图优化问题为例,简单介绍g2o源码结构和使用方法。 首先,我们需要定义一个图模型,并向模型中添加顶点和边。比如,我们可以定义如下的图模型: ```c++ #include <g2o/core/sparse_optimizer.h> #include <g2o/core/block_solver.h> #include <g2o/core/optimization_algorithm_levenberg.h> #include <g2o/solvers/eigen/linear_solver_eigen.h> typedef g2o::BlockSolver<g2o::BlockSolverTraits<2,1>> BlockSolverType; typedef g2o::LinearSolverEigen<BlockSolverType::PoseMatrixType> LinearSolverType; typedef g2o::OptimizationAlgorithmLevenberg OptimizationAlgorithmType; int main(int argc, char** argv) { // 构建图优化模型 g2o::SparseOptimizer optimizer; optimizer.setVerbose(true); // 设置线性求解器和块求解器 LinearSolverType *linearSolver = new LinearSolverType(); BlockSolverType *blockSolver = new BlockSolverType(linearSolver); OptimizationAlgorithmType *optimizationAlgorithm = new OptimizationAlgorithmLevenberg(blockSolver); // 设置求解算法和优化器 optimizer.setAlgorithm(optimizationAlgorithm); // 添加顶点 g2o::VertexSE2 *v1 = new g2o::VertexSE2(); v1->setId(0); v1->setEstimate(g2o::SE2(0,0,0)); optimizer.addVertex(v1); g2o::VertexSE2 *v2 = new g2o::VertexSE2(); v2->setId(1); v2->setEstimate(g2o::SE2(1,0,0)); optimizer.addVertex(v2); // 添加边 g2o::EdgeSE2 *e = new g2o::EdgeSE2(); e->setVertex(0, v1); e->setVertex(1, v2); e->setMeasurement(g2o::SE2(1,0,0)); e->setInformation(Eigen::Matrix3d::Identity()); optimizer.addEdge(e); // 执行优化 optimizer.initializeOptimization(); optimizer.optimize(10); // 输出结果 std::cout << v1->estimate().toVector().transpose() << std::endl; std::cout << v2->estimate().toVector().transpose() << std::endl; return 0; } ``` 在上面的代码中,我们首先定义了一个g2o::SparseOptimizer对象,然后设置了线性求解器和块求解器,以及Levenberg-Marquardt优化算法。接着,我们向模型中添加了两个顶点和一条边,其中边的测量值为(1,0,0),信息矩阵为单位矩阵。最后,我们执行了10次优化,并输出了优化后的顶点估计值。 g2o源码结构比较复杂,但是其设计思想清晰,代码风格规范,易于扩展和修改。使用g2o库可以快速高效地解决各种图优化问题,是图优化领域不可或缺的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuYunTan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值