slam十四讲~环境安装以及问题记录

SLMA十四讲”中环境配置

参考资料:
https://zhuanlan.zhihu.com/p/452256687
https://blog.csdn.net/qq_38629044/article/details/95355859
https://blog.csdn.net/Bonaventure/article/details/122835996
https://blog.csdn.net/weixin_44986556/article/details/108962861
https://blog.csdn.net/qq_38364548/article/details/122055690
https://blog.csdn.net/rong11417/article/details/103905794
https://blog.csdn.net/CSSDCC/article/details/123442605

运行官方ORB-SLAM2代码可以安装0.5版本Pangolin,相关报错参考:https://zhuanlan.zhihu.com/p/411027681

系统版本:Ubuntu 20.04
参考书:slam十四讲 第二版

安装软件或者库时,建议加上 sudo 命令!!!
运行代码时注意检测代码中读取文件的路径!!!

1、安装 VScode 工具:

建议使用普通用户登陆系统,root用户可能无法正常打开 VScode :
可以在软件商店安装(速度较慢);
安装vscode
vscode界面

安装vscode完成后遇到无法打开软件的情况:推荐使用普通用户登录 Ubuntu,一般能够正常打开VScode

2、配置 SLAM 环境:

2.1 安装 C++、cmake、git :

sudo apt-get install -y g++		
sudo apt-get install -y cmake
sudo apt-get install -y git

2.2 安装 Eigen(第三讲中用到)
因为后续安装g2o的时候需要Eigen(线性代数)支持,所以先进行Eigen的配置:

sudo apt-get install libeigen3-dev 	 #安装Eigen	
pkg-config --cflags eigen3		#检查安装
sudo apt-get remove libeigen3-dev		#卸载

Eigen 安装完成后可以尝试运行“SLMA十四讲”第三讲48页代码“eigenMatrix.cpp”。
使用VScode运行时,可能会遇到报错,查看后文linux下运行Vscode代码的问题处理部分

2.3 安装可视化显示库:
Pangolin——可视化显示库 (第三讲中用到)

sudo apt-get install libglew-dev  libboost-dev libboost-thread-dev libboost-filesystem-dev 	
sudo apt install libgl1-mesa-dev
#安装依赖项
git clone https://github.com/stevenlovegrove/Pangolin.git  #自行指定文件夹下载pangolin
cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST= 1 ..
make -j12
sudo make install

Pangolin 安装完成后可以在pangolin路径下使用以下代码测试:

cd examples/HelloPangolin
./HelloPangolin

安装完成可以尝试运行“SLMA十四讲”第三讲65页代码“coordinateTransform.cpp”以及67页代码“plotTrajectory.cpp”

2.4安装 Sophus——李代数
Sophus的安装存在两个问题,一个是Sophus模板类和非模板类的区别,为了新手方便使用十四讲中推荐的是非模板类的Sophus,需要将git到的Sophus回滚到a621ff版本;另一个就是由于编译器版本的不同,出现非模板类Sophus编译不过。
报错1:报错c++: fatal error: 已杀死 signal terminated program cc1plus
建议安装Sophus前先建一个交换分区(swap分区):

# 创建分区路径
sudo mkdir -p /var/cache/swap/
# 设置分区的大小
# bs=64M是块大小,count=64是块数量,所以swap空间大小是bs*count=4096MB=4GB
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=64M count=64
# 设置该目录权限
sudo chmod 0600 /var/cache/swap/swap0
# 创建SWAP文件
sudo mkswap /var/cache/swap/swap0
# 激活SWAP文件
sudo swapon /var/cache/swap/swap0
# 查看SWAP信息是否正确
sudo swapon -s

分区创建并激活的效果图如下:
swap0文件的路径在/var/cache/swap/下,编译完后, 如果不想要交换分区了, 可以删除。
交换分区示例

#删除交换分区的命令
sudo swapoff /var/cache/swap/swap0
sudo rm /var/cache/swap/swap0
释放空间命令:
sudo swapoff -a
#详细的用法:swapoff --help
#查看当前内存使用情况:free -m

安装Sophus库

git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff 		**#运行第二版代码不需要回滚**
mkdir build
cd build
cmake ..
make -j12 	# 提高编程效率,表示以12线程运行,电脑会变卡建议使用交换分区
sudo make install 	#安装sophus库 

问题2:在 ubuntu18.04 下会出现“unit_complex_.real() = 1.; unit_complex_.imag() = 0. ;"的错误
解决方法:在sophus/so2.cpp文件中,将

unit_complex_.real() = 1. ;
unit_complex_.imag() = 0. ;

改为

unit_complex_.real(1.) ;
unit_complex_.imag(0.) ;

然后重新编译即可

2.5 安装fmt库

可以在fmt编译前将CMakeLists.txt中添加“add_compile_options(-fPIC)” 避免在ch13中出现错误
在这里插入图片描述

git clone https://github.com/fmtlib/fmt.git
cd fmt
git checkout b6f4ceae	//回退到 release 8.1.1 版本防止出现问题
mkdir build
cd build
cmake ..
make -j12
sudo make install

2.6 安装 OpenCV3
安装依赖项:

sudo apt install -y build-essential 
sudo apt install -y  libgtk2.0-dev 
sudo apt install -y libvtk5-dev		#可以安装新版本 sudo apt install -y libvtk6-dev
sudo apt install -y libjpeg-dev 
sudo apt install -y libtiff5-dev 
sudo apt install -y libjasper-dev 
sudo apt install -y  libopenexr-dev
sudo apt install -y libtbb-dev

从官网下载 OPenCV 3.4.15版本 linux安装包,进行编译安装:

cd opencv-3.4.15
mkdir build && cd build
cmake ..
make -j12
sudo make install

后续编译运行代码可能出错,详情见第3部分报错记录第 6 节。

2.7安装:Ceres——最小二乘优化 slam 十四讲 ch6 需要

先安装依赖:

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

下载Ceres:

git clone https://github.com/ceres-solver/ceres-solver

安装Ceres:

cd ceres-solver
mkdir build
cd build/
cmake ..
make -j4
sudo make install

2.8 安装 g2o 库
下载 g2o

git clone https://github.com/RainerKuemmerle/g2o

安装依赖环境,终端输入:

sudo apt-get install qt5-qmake qt5-default libqglviewer-dev-qt5 libsuitesparse-dev libcxsparse3 libcholmod3

在slambook2/3rdparty/g2o文件夹下打开终端并输入:

cd g2o
mkdir build
cd build/
cmake ..
make -j4
sudo make install

2.9 安装点云库:pcl——点云库

sudo apt-get install libpcl-dev pcl-tools

2.10 安装 DBoW3 库:
自行指定文件夹下下载并安装,终端并输入:

git clone https://github.com/rmsalinas/DBow3
cd DBow3
mkdir build
cd build/
cmake ..
make -j12
sudo make install

2.11 安装 octomap 终端输入:
sudo apt-get install liboctomap-dev octovis
在这里插入图片描述

3、运行代码时的报错问题记录:

注意多检查代码运行时需要的参数以及代码中的文件路径 !!!

3.1 vscode运行代码报错:
找不到“Egin/core”,修改源码中的“Egin/core”为:“eigen3/Egin/core”
或者添加软链接将 eigen3/Eigen 指向 Eigen :
sudo ln -sf eigen3/Eigen Eigen
sudo ln -sf eigen3/unsupported unsupported
在这里插入图片描述
3.2 Linux中 error while loading shared libraries错误解决办法

错误提示:

./plotTrajectory: error while loading shared libraries: libpango_windowing.so: cannot open shared object file: No such file or directory

错误原因:找不到共享库libpango_windowing.so
查看usr/local/lib 下有没有,看到已经有了。
在这里插入图片描述
终端使用命令刷新共享库:

sudo ldconfig

如果是build里编译的话可能或找不到trajectory.txt文件,会出现以下报错:

cannot find trajectory file at ../examples/trajectory.txt

改一下slam十四讲 3.7显示运动轨迹的程序 trajectory.txt文件路径,可以写绝对路径,建议改成相对路径。
string trajectory_file = “./examples/trajectory.txt”;
#改为自己的实际路径
string trajectory_file = “/home/dal/slambook2/ch3/examples/trajectory.txt”;在这里插入图片描述

3.3 遇到报错:error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’?
修改编译器标准即可解决问题。
将CmakeLists.txt中
set(CMAKE_CXX_FLAGS “-std=c++11”)
改为
set(CMAKE_CXX_STANDARD 14)
如图:
在这里插入图片描述
修改后可正常编译运行: 在这里插入图片描述

3.4 报错:

error: ‘slots_reference’ was not declared in this scope
 1180 |         cow_copy_type<list_type, Lockable> ref = slots_reference();

注意将CMakelists.txt中的C++版本切换到C++14。

3.5 运行ch4中的代码出现类似“fatal error: fmt/core.h: 没有那个文件或目录”
之所以出现该问题是因为原书使用Sophous库时,仅仅需要EIgen一个依赖,而如今版本的Sophous库还需要fmt依赖。
因此,要解决此问题按照本文2.5安装该库即可。

然而在安装好fmt之后,虽然解决了寻找不到fmt的问题,但编译时又出现了新的报错:

usr/bin/ld: CMakeFiles/trajectoryError.dir/trajectoryError.cpp.o: in function `std::make_unsigned<int>::type fmt::v8::detail::to_unsigned<int>(int)':
trajectoryError.cpp:(.text._ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_]+0x23): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: CMakeFiles/trajectoryError.dir/trajectoryError.cpp.o: in function `std::make_unsigned<long>::type fmt::v8::detail::to_unsigned<long>(long)':
trajectoryError.cpp:(.text._ZN3fmt2v86detail11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIlEENSt13make_unsignedIT_E4typeES4_]+0x25): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'

此时ch4中的 useSophus.cpp 可以正常编译,但是 example 中的 trajectoryError.cpp 无法编译成功,注意检查 cpp 文件中的内容和 CMakelists 的内容。

应遵循调用层次,从依赖到被依赖。所以在CMakeLists.txt中添加:
target_link_libraries(trajectoryError ${Sophus_LIBRARIES} fmt)
在这里插入图片描述

trajectoryError依赖于Sophus,Sophus依赖于fmt。
此时可以编译完成,运行文件提示找不到文件:
在这里插入图片描述

修改cpp文件中的代码,将文件路径修改为绝对路径或者相对路径。再次编译后运行成功。
在这里插入图片描述

3.6 进行编译 ch5 imageBasics.cpp 时报错:

/usr/bin/ld: CMakeFiles/undistortImage.dir/undistortImage.cpp.o: in function `main':
undistortImage.cpp:(.text+0xdc): undefined reference to `cv::imread(cv::String const&, int)'
/usr/bin/ld: undistortImage.cpp:(.text+0x120): undefined reference to `cv::Mat::Mat(int, int, int)'

原因:由于使用 OPenCV 版本的不同,需要在 CMakelists 前添加一段:

cmake_minimum_required(VERSION 2.8)
# 寻找OpenCV库
find_package(OpenCV REQUIRED)
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

#所有涉及到 OPenCV 的源代码,前面都可以添加。

编译成功后运行代码,遇到新问题:

./imageBasics: error while loading shared libraries: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
(1) 打开路径
			cd /etc/ld.so.conf.d
(2) 创建文件:
			touch OpenCV.conf
    或者不创建文件:直接下载OpenCV.conf,将该文件放在第1步的路径下,然后直接进行第四步(注意:OpenCV.conf中的路径一定要是自己opencv的install路径,具体参看步骤3)
		(3) 在OpenCV.conf中写入:
			/usr/local/lib
			注:该路径为opencv install之后的路径,一般默认的路径为/usr/local/lib,即lib*.so库文件所在的路径。
		(4) 在终端执行命令:
	sudo ldconfig
	完成后可以正常运行

3.7 运行ch5 中 undistorImage.cpp 时报错:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.15) /root/opencv-3.4.15/modules/imgproc/src/median_blur.dispatch.cpp:283: error: (-215:Assertion failed) !_src0.empty() in function 'medianBlur'
已放弃 (核心已转储)

解决方法:检查 cpp 文件中的文件路径是否正确。
如果确认文件位置正确后依然报错,尝试参考博客,对比报错代码进行修改:
https://blog.csdn.net/weixin_45617478/article/details/102648651
https://blog.csdn.net/BigDream123/article/details/89477248

3.8 运行ch5 中的 joinMap.cpp 文件报错:

/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `std::make_unsigned<int>::type fmt::v8::detail::to_unsigned<i    nt>(int)':
joinMap.cpp:(.text._ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIiEENSt13    make_unsignedIT_E4typeES4_]+0x23): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
 ... ...
joinMap.cpp:(.text._ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIjLi0EEEyT_[_ZN3fmt2v86detail13width_checkerINS1_    13error_handlerEEclIjLi0EEEyT_]+0x33): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o:joinMap.cpp:(.text._ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEc    lIxLi0EEEyT_[_ZN3fmt2v86detail13width_checkerINS1_13error_handlerEEclIxLi0EEEyT_]+0x36): more undefined references to `fmt::    v8::detail::error_handler::on_error(char const*)' follow
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/joinMap.dir/build.make:120:joinMap] 错误 1
make[1]: *** [CMakeFiles/Makefile2:76:CMakeFiles/joinMap.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

产生这个错误的原因是 CMakeLists文件没有写完整,
修改文件内容为:

project(rgbd)
cmake_minimum_required(VERSION 3.10)
find_package(Sophus REQUIRED)
add_executable(joinMap joinMap.cpp)
include_directories(${Sophus_INCLUDE_DIRS})
#链接OpenCV库
find_package(OpenCV REQUIRED)
#添加头文件
include_directories( ${OpenCV-INCLUDE_DIRS})
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
find_package(Pangolin REQUIRED) 
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES})
# Eigen
include_directories("/usr/local/include/eigen3")
target_link_libraries(joinMap ${Sophus_LIBRARIES} fmt)
#链接c++11
set(CMAKE_CXX_STANDARD 14)
按照以上内容修改 CMakeLists.txt 文件后,运行程序提示:

root@slam-virtual-machine:/home/slam/slambook2-master/ch5/rgbd/build# ./joinMap
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
点云共有0个点.
Point cloud is empty!
root@slam-virtual-machine:/home/slam/slambook2-master/ch5/rgbd/build#

检查 cpp 中文件路径是否正确,共有两处文件路径需要根据实际路径修改。
在这里插入图片描述

3.9 SLAM十四讲 ch7 代码报错:
在这里插入图片描述
此时将 CMakeLists.txt 中的C++11 改为C++14(之前也有过类似错误):
在这里插入图片描述
重新编译,报错:

/usr/bin/ld: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o: in function `unsigned long long fmt::v8::detail::width_checker<fmt::v8::detail::error_handler>::operator()<float, 0>(float) [clone .isra.0]':
pose_estimation_3d2d.cpp:(.text+0xe): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o: in function `unsigned long long fmt::v8::detail::precision_checker<fmt::v8::detail::error_handler>::operator()<float, 0>(float) [clone .isra.0]':
pose_estimation_3d2d.cpp:(.text+0x2e): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o: in function `Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize() [clone .part.0]':

原因是没有引用 fmt :
修改CMakeList.txt中所有的 target_link_libraries :

		target_link_libraries(orb_self ${OpenCV_LIBS}

改为:

	target_link_libraries(orb_self ${OpenCV_LIBS} fmt)

在这里插入图片描述
此时编译可能有一个缺少返回的语句,不影响程序运行,可以自行修改。
在这里插入图片描述

3.10 运行ch9中的代码报错。
在这里插入图片描述
CMakeLists.txt中的 C++ 版本问题,修改即可(下面还有一处需要修改,修改截图在最后)。
重新编译,有告警信息可以暂时不管。
在这里插入图片描述

报错,由于没有链接 fmt :
在这里插入图片描述

解决方法:
在这里插入图片描述

同时注意cpp文件中的目录部分是否和自己当前文件目录一直,确认无误后重新编译运行正常。

3.11 运行ch10时报错:
参考问题10,同样是C++版本的问题,后续fmt未链接的问题。(后续同样问题不再写)
在这里插入图片描述

解决方法: 在这里插入图片描述
编译时会产生一个告警:
在这里插入图片描述
可以在 pose_graph_g2o_lie_algebra.cpp 文件54行的部分,添加 return true语句,重新编译。
在这里插入图片描述
注意检查 CPP 文件中的部分文件路径(次数没有需要修改的路径)。

3.12 在ch11中需要安装 DBow3 库,未安装会报错:
在这里插入图片描述
安装完成后编译代码报错:
在这里插入图片描述 修改CMakeLists.txt 中的库文件后缀。则将cmakelist中的libDBoW3.a改为libDBoW3.so即可。
在这里插入图片描述

若cmakelist中原来是libDBoW3.so,则改为libDBoW3.a
在这里插入图片描述

重新编译运行,注意cpp文件中的路径。

在这里插入图片描述
注意检查gen_vocab_large.cpp 文件,此处应该带参数运行程序“gen_vocab”。
在这里插入图片描述
(此处存在部分疑问,尚未解决)

3.13 编译ch12中“dense_RGBD”的代码报错:

	By not providing "Findoctomap.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "octomap", but
  CMake did not find one.

此时需要安装:octomap
终端输入:

sudo apt-get install liboctomap-dev octovis

安装完成后编译,运行 pointcloud_mapping 后使用 pcl_viewer 对此章生成的点云图“map.pcd”进行查看。
在这里插入图片描述
3.14 编译ch13报错:注意修改CMakeLists.txt中的C++版本,改为C++ 14。

 error: ‘index_sequence’ is not a member of ‘std’
  199 |   struct HessianTupleType<std::index_sequence<Ints...>>

3.15 编译ch13报错:

/usr/bin/ld: 找不到 -lglut
collect2: error: ld returned 1 exit status

安装库文件:

sudo apt install freeglut3-dev

3.16 编译ch13报错:

/usr/bin/ld: ../../lib/libmyslam.so: undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
/usr/bin/ld: ../../lib/libmyslam.so: undefined reference to `std::locale fmt::v8::detail::locale_ref::get<std::locale>() const'
/usr/bin/ld: ../../lib/libmyslam.so: undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'
/usr/bin/ld: ../../lib/libmyslam.so: undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view<char>, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender, char> >)'
/usr/bin/ld: ../../lib/libmyslam.so: undefined reference to `fmt::v8::detail::th

需要链接fmt库。在ch13中src文件夹中加入以下代码:

target_link_libraries(myslam
        ${THIRD_PARTY_LIBS}
        fmt::fmt # 加入这一行
        )

3.17 编译ch13报错:

[ 75%] Linking CXX shared library ../../lib/libmyslam.so
/usr/bin/ld: /usr/local/lib/libfmt.a(format.cc.o): relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: 最后的链结失败: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/myslam.dir/build.make:273:../lib/libmyslam.so] 错误 1
make[1]: *** [CMakeFiles/Makefile2:136:src/CMakeFiles/myslam.dir/all] 错误 2
make: *** [Makefile:95:all] 错误 2

此处提供一种方法:
如果之前已经安装过fmt,删除fmt路径下的文件"libfmt.a"后重新安装fmt
在这里插入图片描述

下载fmt编译前在CMakeLists.txt中添加“add_compile_options(-fPIC)”
在这里插入图片描述

重新编译安装fmt。安装完fmt后重新编译ch13代码没有报错。编译fmt见上文2.5节。
在这里插入图片描述

  • 22
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值