Ubuntu/视觉SLAM十四讲踩坑记录
Ubuntu(20)/视觉SLAM十四讲踩坑记录:
共性问题:
可参考:《视觉SLAM十四讲》 编译报错问题汇总 Ubuntu20.04
视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)
1.安装OpenCV后,例程仍无法找到OpenCV文件
原因:原CMakeLists.txt文件中未添加OpenCV库等三方库,需要自行在各文件中添加(书中有写),
如:
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS} )
target_link_libraries(xxxxx ${OpenCV_LIBS})
ch3 visualizeGeometry:
- pangolin安装 ,安装需要cmake版本>=3.17;通过apt安装最新只能到3.16(2021.09.24);可能卸载后通过snap install cmake --classic安装。直接到最新版本(方便、快速)。或者通过源码自行安装(容易出错)。
- cmake编译,在完成所有安装后,build/cmake 可能通过。但make时会出现如下错误:
原因:其中引用的sigslot/signal.hpp是基于C++14标准的,而原CMakeLists.txt中的设置的标准为C++11。
方案:改为c++14再次执行即可运行
ch4:Sophus安装问题:
1:fatal error: sophus/se3.h: 没有那个文件或目录
2:安装模板库(视觉SLAM十四讲第二版中使用)时,需要先安装fmt库(依赖问题):
ch5:OpenCV安装及例程运行问题
1:OpenCV3安装问题:
主要是依赖问题,安装可参考:Ubuntu安装Opencv3
可参考:视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)
1:链接fmt出问题(仍没找到fmt头文件)(rgbd-joinmap例程)
需要在CMakeLists.txt中添加fmt链接:
find_package(fmt REQUIRED)
set(FMT_LIBRARIES fmt::fmt)
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} ${FMT_LIBRARIES})
ch6:g2o使用:
Q1:
在编译时一直找不到cs.h头文件。
在第一版源代码文件中的g2o/EXTERNAL 中有一个csparse文件夹,将其移动到/usr/local/include/g2o/EXTERNAL下,cmake、make install即可。
Q2:
关于关于高博3d2d程序报错的改动
《视觉SLAM十四讲》第六讲g2o实践代码报错解决方法
g2o初始化一些
code0 为原始代码,在新装的g2o等库中出现错误,原因参考上述文献(链接)。
code1和code2为改动实现的两种方法。两个位置的code1或code2要对应
//DirectBlock* solver_ptr = new DirectBlock ( linearSolver ); //code0
std::unique_ptr<DirectBlock> solver_ptr ( new DirectBlock ( std::unique_ptr<DirectBlock::LinearSolverType>(linearSolver))); code1
// g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr ); // G-N code0
g2o::OptimizationAlgorithmLevenberg* solver (new g2o::OptimizationAlgorithmLevenberg(std::move(solver_ptr))); // code 1
//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr ); // L-M //code0
//DirectBlock* solver_ptr = new DirectBlock ( linearSolver ); //code0
DirectBlock* solver_ptr = new DirectBlock ( std::unique_ptr<DirectBlock::LinearSolverType>(linearSolver) ); //code 2
// g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr ); // G-N code 0
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg (std::unique_ptr<DirectBlock>(solver_ptr)); //code2
//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr ); // L-M //code0
ch7:段错误 (核心已转储)
执行书中的以下代码时:
build/pose_estimation_3d2d 1.png 2.png d1.png d2.png
出现错误:
-- Max dist : 94.000000
-- Min dist : 4.000000
一共找到了79组匹配点
段错误 (核心已转储)
参考文献:
BUG(跑slam14-ch7-2d3d时)
视觉SLAM十四讲,OpenCV库使用时出现已放弃(核心已转储)
后,回到文件,发现,是图片名字有误(采用第一版的源码库)。将原来的1_deepth.png 2_deepth.png 与执行代码对应即可。
其他:
c++: fatal error: 已杀死 signal terminated program cc1plus
原因:运行内存不足
[https://blog.youkuaiyun.com/baidu_26954729/article/details/92428426](https://blog.youkuaiyun.com/baidu_26954729/article/details/92428426)
https://www.jianshu.com/p/c4ef42f6b2ec
解决方法:
增加运行内存
方法1:减少运行线程。
方法2:直接增加运行内存(如加内存条,虚拟机多分配内存等)。