首页 > 学院 > 开发设计 > 正文

GTSAM 的使用

2019-11-08 00:50:07
字体:
来源:转载
供稿:网友

GTSAM 的使用

GTSAM 是一个在机器人领域和计算机视觉领域用于平滑(smoothing)和建图(mapping)的C++库。它与g2o不同的是,g2o采用稀疏矩阵的方式求解一个非线性优化问题,而GTSAM是采用因子图(factor graphs)和贝叶斯网络(Bayes networks)的方式最大化后验概率。


GTSAM 的安装

官网给出了详细的安装过程,由于其所依赖的库比较少,所以安装起来比较方便,有两点需要注意:

-BOOST库的版本不要低于1.43 -CMake的版本不要低于2.6 一般默认安装的CMake都不会低于2.6,所以只要boost库要求。此外,在编译链接以及后续的库使用的过程中,可能会用的tbb库(Intel® Threading Building Blocks )。这是一个C++的并行运算库。


GTSAM的使用

C++对于第三方库的使用方法其实是让代码在编译和链接时找到两个部分:第三方库的头文件以及lib文件。根据集成开发环境(IDE)的不同,配置文件的写法也不同,在这里列举两种配置文件写法。一种是QT下的.PRo文件。另一个是通用的CMakeLists.txt文件,这里所使用的IDE是KDevelop。

QT下的配置使用KDevelop下的配置使用

QT下的配置使用 最简单的.pro文件大致分为四个部分:

QT自动生成的部分指定源码部分指定头文件部分指定链接库# 自动生成部分TEMPLATE = appCONFIG += console c++11CONFIG -= app_bundleCONFIG -= qt# 指定头文件部分INCLUDEPATH += /usr/includeINCLUDEPATH += /usr/local/includeINCLUDEPATH += /usr/include/eigen3# 指定源码部分SOURCES += main.cpp# 指定链接库LIBS += -lboost_systemLIBS += -ltbbLIBS += -L/usr/local/lib -lgtsam

上述文件中指定了eigen3库,boost库,tbb库。GTSAM在使用时依赖于这三个库。 INLCUDEPATH是指定GTSAM安装后头文件所在位置。LIBS是指定程序链接时所需要的库。其格式是: -L path -lname L后面是跟着libname.so/libname.a等形式的库文件所在的绝对路径。-l后面加上库文件去掉lib后的名称。

KDevelop下的配置使用 KDevelop主要是使用CMakeLists.txt配置。关于CMakeLists.txt的编写,有一个比较通俗简易的tutorial,叫做CMake Practice。可以在网上搜一下,比较容易找到。 CMakeLists.txt中对于第三方库的配置大致包含三个部分。

找到第三方库指定头文件指定链接库# 指定工程名称project(gtsam_test)cmake_minimum_required(VERSION 2.8)# 使用c++ 11include(CheckCXXCompilerFlag)CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")else() message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")endif()# 寻找第三方库,使用大小写都可以,这里列举了两种方式find_package(Boost COMPONENTS thread filesystem date_time system REQUIRED)FIND_PACKAGE(GTSAM REQUIRED)# 包含第三方库头文件路径,可以使用绝对路径INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})INCLUDE_DIRECTORIES(${GTSAM_INCLUDE_DIR})INCLUDE_DIRECTORIES("/usr/include/eigen3")add_executable(gtsam_test main.cpp)# 链接库 target_link_libraries(gtsam_test ${Boost_LIBRARIES} -lgtsam -ltbb)install(TARGETS gtsam_test RUNTIME DESTINATION bin)

如果程序在编译时出现undefined function 的错误,一般是是在包含第三方库时出了问题,可能是没有指定头文件路径,或指定的路径是错误的,可以根据cmake命令的输出观察是否找到正确的路径。 如果编译时出现undefined reference 的错误,一般是在链接库的位置出错,可能是没有指定链接库,也可能是指定的名称有错。 这里与QT一个很大的不同就是在使用C++ 11 时要必须声明。因为GTSAM对其有依赖,所以需要有上述的一段代码。 此外,其实可以发现eigen3这个库是一个很特别的库,只要指定该库的头文件位置,就可以使用该库。



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表