GTSAM 的使用

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 = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
# 指定头文件部分
INCLUDEPATH += /usr/include
INCLUDEPATH += /usr/local/include
INCLUDEPATH += /usr/include/eigen3
# 指定源码部分
SOURCES += main.cpp
# 指定链接库
LIBS += -lboost_system
LIBS += -ltbb
LIBS += -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++ 11
include(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这个库是一个很特别的库,只要指定该库的头文件位置,就可以使用该库。


  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值