Ubuntu20.04 编译安装视觉SLAM十四讲用到的几个库时走过的坑

本文目录

  • 安装Eigen3
  • 安装Pangolin
  • 安装Sophus
  • 安装OpenCV
  • 重要补充
  • 为什么有些需要安装,有些仅需编译?
    • 简单的解释
    • 简单的梳理
      • Eigen3:
      • Sophus:
  • 还能在这些地方找到我

安装Eigen3

由于我之前安装过Eigen,所以这里就不介绍是怎么安装的了。

Eigen的安装路径为:/usr/include/eigen3/

安装Pangolin

下载安装Pangolin时,我并没有按照书上的做法从slambook2/3rdpart/Pangolin安装,而是参照Github官网https://github.com/stevenlovegrove/Pangolin的教程:因为直接git clone下载的文件夹是一直在更新的master分支,有可能存在不稳定的测试特性,
请添加图片描述
所以我选择下载一个稳定的发布版v0.6的压缩包解压后再:

cd ~/gh-zhuoqun-chen/Pangolin-0.6
mkdir build
cd build
cmake ..
make 
sudo make install 

这样就安装好Pangolin了。

测试slambook2/ch3/examples/plotTrajectory.cpp时,发现make编译不成功,原因是中间的一行代码有问题:

string trajectory_file = "./examples/trajectory.txt";

这个相对路径报错,改为绝对路径后编译就可以正常运行了。

string trajectory_file = "/home/zqchen/Desktop/slambook2/ch3/examples/trajectory.txt";

安装Sophus

到github.com/strasdat/Sophus上直接下载最新的主分支,我是下载的zip压缩包,此时主分支最新的合并后的版本号是49a7e12。把Sophus-master.zip解压后得到Sophus-master文件夹。在该文件夹中新建build文件夹,cd buildcmake ..make。按照书上书上P87页和P89页的说法,

Sophus库只需编译即可,无须安装。# P87
基于模板的Sophus库和Eigen一样,是仅含头文件而没有源文件的。# P89

接下来我没有执行sudo make install便去测试,我按照书上slambook2/ch5/CMakeLists.txt来编译,会发现make不通过,报错为:fatal error: sophus/se3.hpp: 没有那个文件或目录。此时可以分析一下原因。

slambook2/ch5/CMakeLists.txt的内容有这样一句:

add_subdirectory(rgbd)

说明会进一步执行slambook2/ch5/rgbd/CMakeLists.txt,而这个里面有这样两句:

find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})

报错原因就在于此:即找不到Sophus的头文件路径。有两种解决办法,第一种是修改CMakeLists.txt添加一些语句使得最终把Sophus包含进来,但是写什么语句能做到这样网上的解决的办法有很多而我觉得太复杂了果断放弃采取第二种方法:老老实实的在执行完make后执行sudo make installSophus安装到usr/local/inlcude/下面,这样find_packageinclude_directories两句话就起效了,安装完后Sophus存在的各个路径为下图:
Ubuntu20.04 编译安装视觉SLAM十四讲用到的几个库时走过的坑_第1张图片
到这一步,又出现了一个坑:尝试测试运行一下:/home/zqchen/Desktop/slambook2/ch4/example/trajectoryError.cpp,在该example目录下新建build文件夹并编译后报错Sophus需要用到fmt,而我之前没有安装过fmt,于是又重新去下载fmt

# 不知道网络代理是不是有点问题,git clone 这一步我替换成了下载压缩文件后解压
git clone  https://github.com/fmtlib/fmt.git 
cd fmt
mkdir build
cd build
cmake ..
make
sudo make install

下载完按理来说不应该有问题了吧,结果又产生与fmt相关的报错,查看/home/zqchen/Desktop/slambook2/ch4/example/CMakeLists.txt里面的内容,好家伙,里面有这样几句:

option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)
find_package(Pangolin REQUIRED)
if(USE_UBUNTU_20)
    message("You are using Ubuntu 20.04, fmt::fmt will be linked")
    find_package(fmt REQUIRED)
    set(FMT_LIBRARIES fmt::fmt)
endif()

心态崩了呀,原来对于Ubuntu20.04,还不能只是cmake ..,而是要cmake -D USE_UBUNTU_20=ON显式指明这个参数才行,这还是我也是受到博客Sophus库安装踩坑(SLAM十四讲)启发才找到的,我看博客视觉SLAM第2版第4讲Sophus遇到的问题也提到了这一点…

安装OpenCV

这一步坑比较多,我从OpenCV官网上下载opencv-3.1.0.zip解压后按照书上的方法先安装依赖后cmake ..报错,无法进一步接着执行make来编译,所以无法正常安装。参考了一些博客吧,我最后选择了opencv-3.4.7这个版本。

按照官网的教程:
Ubuntu20.04 编译安装视觉SLAM十四讲用到的几个库时走过的坑_第2张图片

下载opencv-3.4.7.zip解压后cmake ..执行make后仍然报错:

fatal error: Eigen/Eigenvalues: No such file or directory

参考了一篇博客ubuntu 下配置opencv3.10问题-Eigen/Eigenvalues: No such file or directory后,我是这样做的

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_EIGEN=OFF -D CMAKE_INSTALL_PREFIX=/usr/local/opencv/3.4.7 ..

选项WITH_EIGEN是为了在编译的时候暂时忽略Eigen的相关内容
选项CMAKE_INSTALL_PREFIX是为了让opencv-3.4.7安装在/usr/local/opencv/3.4.7目录下,防止和其他版本的opencv的路径一致而导致混乱。

接下来执行

make -j4
sudo make install

就成功安装opencv-3.4.7了。

博客Ubuntu下多版本OpenCV共存和切换解释了/usr/local/opencv/3.4.7/share/OpenCV路径下OpenCVConfig.cmake文件的作用:

在OpenCV编译好后,所在目录中会生成OpenCVConfig.cmake文件,这个文件中指定了CMake要去哪里找OpenCV,其.h文件在哪里等。

存在多版本OpenCV时,需要找到所需版本对应的OpenCVConfig.cmake文件,并将其路径添加到工程的CMakeLists.txt中。

安装完后测试slambook2/ch5/imagBasics/imageBasics.cpp时又发现了问题,发现又是编译不能通过。

根据博客ubuntu20.04 18.04编译视觉SLAM十四讲slambook2/ch5/imageBasics/发现是官网的这个CMakeLists.txt少了几行内容,这几行内容在书上倒是打印出来了,文本文件里却没有:

对原来的txt进行修改:

project(imageBasics)

add_executable(imageBasics imageBasics.cpp)

# 以下三句为新添加进去的
set(CMAKE_CXX_FLAGS "-std=c++11")
# 链接OpenCV库
find_package( OpenCV REQUIRED )
#添加头文件
include_directories( ${OpenCV-INCLUDE_DIRS})

target_link_libraries(imageBasics ${OpenCV_LIBS})
 
add_executable(undistortImage undistortImage.cpp)
# 链接OpenCV库
target_link_libraries(undistortImage ${OpenCV_LIBS})

编译的步骤还是一样:进入imageBasics文件夹:

mkdir build
cd build
cmake ..
make

此处又有坑了,如果直接./imageBasics会报错:

terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid 已放弃 (核心已转储)

需要执行./imageBasics ../ubuntu.png才可以成功运行,看到出现一张图片的效果。

不知是不是我的方法有问题,我在很多篇博客里都看到可以用:

pkg-config --modversion opencv

查看OpenCV的版本,可是我就一直没看到,明天我再看看是哪里出现了问题。

重要补充

很多章节的源程序里面的数据文件(.txt、.png)的路径都用的相对路径,而我的Ubuntu20.04会报错找不到文件,全部都需要替换成绝对路径就不会报错了。

为什么有些需要安装,有些仅需编译?

简单的解释

slambook2中已经给出了每一章节的CMakeLists.txt文件,这些文件中的某些语句(或称为命令)就是为了能够找到相应的源代码需要用到的各种头文件和库文件的具体位置的,但是Eigen3、Pangolin、Sophus、OpenCV3中有些是需要安装到诸如usr/local/ usr/include等路径下的;有些则无需这样,只需要在任意路径下面编译后就可以拿来直接用。

简单的梳理

根据博客3. 视觉SLAM十四讲各种库安装,我在这里简单梳理一下哪些是仅仅需要编译就可以使用的,哪些要安装才能使用:

Eigen3:

按道理来说Eigen3仅含头文件而没有库文件,仅需要编译即可使用,不需要安装,但通常的做法是用apt进行“安装”

sudo apt-get install libeigen3-dev

“安装”后,头文件在/usr/include/eigen3,没有库文件。

Sophus:

按书上来说Sophus仅含头文件而没有库文件,仅需要编译即可使用,不需要安装,但根据我的实际测试经验,发现也是选择安装比较方便。

sudo make install

还能在这些地方找到我

  • 夏小正的鲜小海的知乎

  • 夏小正的鲜小海的CSDN

  • 夏小正的鲜小海的博客园

  • 夏小正的鲜小海的个人博客 - zqchen.me

  • 夏小正的鲜小海的Github - zhuoqun-chen

  • 夏小正的鲜小海的Gitee - zhuoqun-chen

  • 夏小正的鲜小海的Github Gists - zhuoqun-chen

你可能感兴趣的:(SLAM,SLAM,C++,CMake,OpenCV)