由于我之前安装过Eigen
,所以这里就不介绍是怎么安装的了。
Eigen的安装路径为:/usr/include/eigen3/
下载安装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";
到github.com/strasdat/Sophus上直接下载最新的主分支,我是下载的zip压缩包
,此时主分支最新的合并后的版本号是49a7e12
。把Sophus-master.zip
解压后得到Sophus-master
文件夹。在该文件夹中新建build
文件夹,cd build
后cmake ..
并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 install
把Sophus
安装到usr/local/inlcude/
下面,这样find_package
和include_directories
两句话就起效了,安装完后Sophus
存在的各个路径为下图:
到这一步,又出现了一个坑:尝试测试运行一下:/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-3.1.0.zip
解压后按照书上的方法先安装依赖后cmake ..
报错,无法进一步接着执行make
来编译,所以无法正常安装。参考了一些博客吧,我最后选择了opencv-3.4.7这个版本。
下载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仅含头文件而没有库文件,仅需要编译即可使用,不需要安装,但通常的做法是用apt
进行“安装”
sudo apt-get install libeigen3-dev
“安装”后,头文件在/usr/include/eigen3,没有库文件。
按书上来说Sophus
仅含头文件而没有库文件,仅需要编译即可使用,不需要安装,但根据我的实际测试经验,发现也是选择安装比较方便。
sudo make install
夏小正的鲜小海的知乎
夏小正的鲜小海的CSDN
夏小正的鲜小海的博客园
夏小正的鲜小海的个人博客 - zqchen.me
夏小正的鲜小海的Github - zhuoqun-chen
夏小正的鲜小海的Gitee - zhuoqun-chen
夏小正的鲜小海的Github Gists - zhuoqun-chen