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完成后遇到无法打开软件的情况:推荐使用普通用户登录 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)”
文章来源:https://www.toymoban.com/news/detail-413623.html
重新编译安装fmt。安装完fmt后重新编译ch13代码没有报错。编译fmt见上文2.5节。
文章来源地址https://www.toymoban.com/news/detail-413623.html
到了这里,关于slam十四讲~环境安装以及问题记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!