视觉SLAM十四讲(高翔第二版)

视觉SLAM十四讲高翔第二版调试记录


前言

在B站搜索slam,看高翔老师的视频

  1. 安张Ubuntu1804,然后学一下linux操作系统,简单看一下视频。
  2. 打开终端下载本书的程序
    git clone https://github.com/gaoxiang12/slambook2
    下载的程序不需要解压(不过有时候会下载不了,是因为github.com打不开),另外看一下终端地址,会下载到对应文件夹。
  3. 最好先简单看一下书,再对照着视频看。

一、3.7可视化演示程序运行全过程Pangolin plotTrajectory.cpp

参考https://blog.csdn.net/holly_Z_P_F/article/details/116324358

1. 在3rdparty中下载Pangolin

对应地址终端中 git clone https://github.com/stevenlovegrove/Pangolin;(有时候会终端下载不了,在网站上下载是一样的,不过需要解压一下)

2. 安装Pangolin.h

在(Pangolin/include/pangolin)

mkdir build
cd build 
cmake ..
make

3. 参考链接

https://blog.csdn.net/holly_Z_P_F/article/details/116324358

4. 打开plotTrajectory.cpp

按照3中修改(Vim,KDevelop, visual studio code都行,不过记得修改之后保存)

5. 然后

mkdir build
cd build 
cmake ..
make
./plotTrajectory

最后一步(注意:终端在build地址运行)

参考原文:https://blog.csdn.net/holly_Z_P_F/article/details/116324358

二、4.4.1Sophus的基本使用方法 useSophus.cpp

1.首先,按照书中的Sophus安装包进行安装,可能出现:

编译过程中可能会出现的问题:

/Sophus/sophus/so2.cpp:32:26: error: lvalue required as left operand of assignment
unit_complex_.real() = 1.;

/Sophus/sophus/so2.cpp:33:26: error: lvalue required as left operand of assignment
unit_complex_.imag() = 0.;

(原文链接:https://blog.csdn.net/Night___Raid/article/details/105113617)

该错误可以定位到so2.cpp源码文件下:(更多问题可参考https://blog.csdn.net/haxiongha/article/details/82464148)

SO2::SO2()
{
  unit_complex_.real() = 1.;
  unit_complex_.imag() = 0.;
}

对应位置修改为


SO2::SO2()
{
  //unit_complex_.real() = 1.;
  //unit_complex_.imag() = 0.;
  unit_complex_.real(1.);
  unit_complex_.imag(0.);
}

2. 模板类Sophus

但是,后续在ch4中进行编译可能会出现fatal error: sophus/se3.hpp: 没有那个文件或目录,这是由于书中给的Sophus库不是模板库。需要安装其模板库。
slam十四讲(第二版)中安装的为模板类Sophus,该sophus对eigen库的版本有要求,如果你有3.3以下的版本的eigen,那么请先卸载:

sudo rm -rf /usr/include/eigen3 /usr/lib/cmake/eigen3 /usr/share/doc/libeigen3-dev /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums  

安装eigen3.3以上版本(这里我选用最新的3.3.6,注意3.2系列的不可以!!!)

注意:千万不要使用 sudo apt-get install libeigen3-dev 因为这个命令下载的是3.2版本的eigen,从而无法与模板类的sophus相匹配

正确方法:
(1)在官网(http://eigen.tuxfamily.org/index.php?title=Main_Page)下载安装包:eigen-3.3.6.tar.bz2 ,然后提取到此处
(2)进入文件夹eigen-3.3.6,右键在终端打开。
(3)进行安装

mkdir build
cd build
cmake ..
sudo make install
Sophus安装

自己建立一个文件夹,在终端打开,然后

git clone https://github.com/strasdat/Sophus.git
cd Sophus/
 
mkdir build
cd build
cmake ..
make
sudo make install

且强调sudo make install一定要有,注意:sudo make install安装后会到usr/local/include/sophus下,可以打开看看,是不是有se3.hpp.

安装之后,对useSophus.cpp进行编译运行(mkdir build, cd build, cmake … , make ),make过程中可能会出现fatal error:Egien/Core 没有那个文件或者目录 ,这是由于和useSophue.cpp同一文件夹中的CMakeLists.txt,其第8行中的地址错误导致。

cmake_minimum_required(VERSION 3.0)
project(useSophus)

# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED)

# Eigen
include_directories("/usr/local/include/eigen3/")
add_executable(useSophus useSophus.cpp)
target_link_libraries(useSophus Sophus::Sophus)

add_subdirectory(example)

应将 "/usr/include/eigen3/“修改为“/usr/local/include/eigen3/”
此处错误修改的另一种方法:include

sudo cp -r /usr/local/include/eigen3/ /usr/include/eigen3/

意思是:将/usr/local/include/eigen3/地址下的文件复制到/usr/include/eigen3/

后续还可能出现错误:具体忘了

#include <ftm/> 

就是没有ftm库

方法:

git clone https://github.com/fmtlib/fmt
cd fmt/
 
mkdir build
cd build
cmake ..
make
sudo make install

最后,在对useSophus.cpp进行编译运行(mkdir build, cd build, cmake … , make )
还是在build下

./useSophus.cpp

版权声明:本文为CSDN博主「F.D.I.O.E.H.R」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Night___Raid/article/details/105113617

三、4.4.2 例子:评估轨迹的误差trajectoryError.cpp

问题1:

undefined reference to `vtable for fmt::v7::format_error'
undefined reference to `fmt::v7::detail::assert_fail(char const*, int, char const*)' 

是没有链接fmt库,链接上fmt 库应该就没问题。

target_link_libraries(trajectoryError ${Pangolin_LIBRARIES})

改为

target_link_libraries(trajectoryError ${Pangolin_LIBRARIES} fmt)

问题2:

trajectory ./example/groundtruth.txt not found.
trajectory ./example/estimated.txt not found.
trajectoryError: /home/haha/slambook2/ch4/example/trajectoryError.cpp:22: int main(int, char**): Assertion `!groundtruth.empty() && !estimated.empty()' failed.
已放弃 (核心已转储)

还是trajectoryError.cpp中地址的问题。
打开trajectoryError.cpp
解决办法:

我们打开源码

把本来写的是 ./examples/groundtruth.txt 改成 …/…/examples/groundtruth.txt

…/…/examples/groundtruth.txt

因为你观察外边的目录结构,就发现这个txt文件是存在examples下面的,但是呢你使用KDevelop执行的时候,是在examples/build下执行的

所以要先… 退出build 再 … 退出examples 然后 /examples/groundtruth.txt

另一个与之类似

修改之后,重新cmake
————————————————
版权声明:本文为CSDN博主「1900_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/holly_Z_P_F/article/details/116324358

上一篇:SLAM十四讲-(3)三维空间刚体运动


下一篇:2021-05-13