视觉SLAM十四讲高翔第二版调试记录
- 前言
- 一、3.7可视化演示程序运行全过程Pangolin plotTrajectory.cpp
- 二、4.4.1Sophus的基本使用方法 useSophus.cpp
- 三、4.4.2 例子:评估轨迹的误差trajectoryError.cpp
前言
在B站搜索slam,看高翔老师的视频
- 安张Ubuntu1804,然后学一下linux操作系统,简单看一下视频。
- 打开终端下载本书的程序
git clone https://github.com/gaoxiang12/slambook2
下载的程序不需要解压(不过有时候会下载不了,是因为github.com打不开),另外看一下终端地址,会下载到对应文件夹。 - 最好先简单看一下书,再对照着视频看。
一、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