"0.基础"而不是"0基础",把它放在1的前面,用0来强调作某件事以前必须已经完成某事的概念.正所谓磨刀不误砍柴工,若是你不想浪费3个小时坎坷的去砍柴,那最好老老实实花上1个小时磨好刀.
本文面向具备cmake,linux shell,ROS基础的SLAM研究者.请读者自行学习如下知识:linux
首先orbslam2做为一个大型程序,并非彻底本身造的轮子,而是在一些非核心的地方使用了第三方库的.学计算机的都知道若是本身程序使用了第三方库,编译时须要找到头文件,连接时须要找到库文件.大型程序的构建过程也是同样的,orblsam2须要找到第三方库的头文件和库文件,这个交给cmake来处理,咱们重点来谈谈它的第三方库.这又分为两个种:程序员
为了说明这点,咱们能够查看工程的CMakeLists.txt文件shell
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${EIGEN3_LIBS} ${Pangolin_LIBRARIES} ${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so ${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so )
从上面代码能够看出,程序连接了5个库,其中OpenCV,EIGEN3,Pangolin来自系统中,DBoW2和g2o来自现场编译后生成的库文件.故咱们在构建orbslam等大型工程时,不是一上来就编译,而是要先解决依赖.这里略去第三方库的安装和编译方法.api
当全部依赖的库文件和头文件都准备就绪,就能够开始编译orbslam了.接着看CMakeLists.txt:app
add_library(${PROJECT_NAME} SHARED src/System.cc src/Tracking.cc src/LocalMapping.cc src/LoopClosing.cc src/ORBextractor.cc src/ORBmatcher.cc src/FrameDrawer.cc src/Converter.cc src/MapPoint.cc src/KeyFrame.cc src/Map.cc src/MapDrawer.cc src/Optimizer.cc src/PnPsolver.cc src/Frame.cc src/KeyFrameDatabase.cc src/Sim3Solver.cc src/Initializer.cc src/Viewer.cc )
注意到做者的源码都编译成了一个动态库,根据cmake的命名规则,应该是一个叫libORB_SLAM2.so的文件.可是为何不直接编译可执行程序?非要画蛇添足地搞一个动态库?其实否则,之因此这样作出于两点缘由:ide
封装成核心API库是一种有益之法,尤为是当你本身须要构建大型程序时,读者可自行体会.oop
再往下看,cmake就开始编译做者提供的demo了.做者提供了4个200来行左右的demo源程序,分别是rgbd_tum.cc,stereo_kitti.cc,mono_tum.cc,mono_kitti.cc学习
# Build examples set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D) add_executable(rgbd_tum Examples/RGB-D/rgbd_tum.cc) target_link_libraries(rgbd_tum ${PROJECT_NAME}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Stereo) add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc) target_link_libraries(stereo_kitti ${PROJECT_NAME}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Monocular) add_executable(mono_tum Examples/Monocular/mono_tum.cc) target_link_libraries(mono_tum ${PROJECT_NAME}) add_executable(mono_kitti Examples/Monocular/mono_kitti.cc) target_link_libraries(mono_kitti ${PROJECT_NAME})
总共生成了4个demo程序,先编译,后link到前面生成的核心API库上.优化
程序的运行并不像咱们在使用win时的那么简单,由于程序具备专业性,不具有相关专业基础知识的人每每会在各类错误提示中浪费本身的时间.但总的来讲也是有规律可循的,其实也简单,仅仅是提供程序运行所必要的数据和配置文件便可.推荐你们保持良好的习惯,阅读官方提供的运行说明.了解程序运行所须要的数据和配置,事先将其准备好,而后按照做者的教程运行.orbslam2的运行略.ui
请注意,以上的程序是普通的桌面程序,是直接利用驱动来读取相机数据的,下面编译基于ros的demo,固然这部分也是略
软件工程是个系统工程,一个小问题也会形成大错误.因此报错是件很日常的事.即便是对于老手.面对报错,咱们应该
若是看完一篇文章,没有收获,纯属浪费时间;若是看完一篇文章,能解决另外一个问题,那么起码不亏;若是看完一篇文章,能解决一类问题,你才叫正真的赚到了.读到这里,若是你以为没有收获,请关闭页面,不要再浪费你本身的时间.若是你如今以为学习了一些经验技巧,那么就能够继续了.
你能够尝试编译运行较新的DSO,这里咱们来试试高翔博士基于orbslam2改写的orbslam2带点云程序
首先下载源码.看过说明以后大概有了了解,但仍然不甚明了,不知orbslam2_modified.zip与ORB_SLAM2_modifiedy文件夹有什么异同.这是我遇到的第一个问题,详细查看了ORB_SLAM2_modifiedy下的文件,确实有修改,且第三方库完整,决定编译这个文件夹.
接着照例查看CMakeLists.txt,其内容基本与orbslam相同,可是从逻辑上讲应该增长点云库的,这里咱们先无论它.而后查看build.sh的安装脚本,过程也是与orbslam2大同小异,只是最后多了一个词典转换程序(提供),用于讲词典转换成二进制的.通过查看以后,得出的结论是,编译过程基本类似,改动主要在代码层面.
经过刚才的文件查看,发现一些潜在问题,就是build文件夹已经存在,甚至第三方库已经编译成功.若干demo的可执行程序已经编译出来了.表面上看是捡了便宜,不用编译了,其实这样是会带来许多麻烦的.为何这么说?
走到这里,你已经会编译运行各类开源slam项目了,也许你是付出不少时间精力,学习各类cmake,shell教程,被各类报错折磨,可是我仍是要打击你一下,构建开源项目是最基本的工程素养,外面随便一个工程师都会.到目前为止咱们只是编译别人的工程,跑跑别人的代码.