高博大神《一起做RGB-D SLAM (6)》问题总结
作为一名刚开始接触的小白,在刚开始学习SLAM技术时(虽然有点笨拙),我在尝试运行《一起做RGB-D SLAM》系列第六集时遇到了一些问题,并找到了相应的解决方案。以下是我对实践过程中的问题及解决方法的总结:如有不足之处,请批评指正!
1g2o 安装
本人的平台为ubuntu14.04
删除之前编译过安装过的版本
(1)sudo rm -rf /usr/local/include/g2o
(2)cd /usr/local/lib
(3)sudo rm -rf libg2o_*
安装依赖项
sudo apt-get mount cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev
下载并安装g2o
https://codeload.github.com/RainerKuemmerle/g2o/zip/dbfea7aade1b808b4a7625175aa0dec54931a949
qt4版本的(良心推荐使用)
https://github.com/RainerKuemmerle/g2o
qt5版本, 即使通过编译成功, 在实际应用中可能会遇到g2o viewer无法正确渲染result_after.g2o的情况, 因此, 不建议直接将该版本用于正式项目开发
cd g2o
mkdir build&&cd build
cmake ..
make
sudo make install
g2o_viewer 无法链接到 libqglviewer.so解决办法
(1)/etc/ld.so.conf.d/目录下添加一个g2o.config文件,把/usr/local/lib复制进去
(2)sudo ldconfig更新动态链接库
2g2o版本导致编译有问题
(1)出现C++有关的编译问题,请在CMakeLists.txt添加
SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")
遇到无frameID的问题时建议在include/slamBase.h文件的FRAME帧结构中补充相关的参数描述
int frameID;
(3)采用最新版本的g2o(链接2)进行求解器初始化时遇到了找不到所需函数的问题,并且这些函数的参数与预期值存在不匹配的情况。
在函数 'int main(int, char**)' 的文件 slamEnd.cpp 的第 68 行至第 70 行处出现错误信息:"找不到匹配的函数调用 'g2O库中的块求解器[g2O库中块求解器特性的维度<6,3>]' 被被调用时的参数类型不匹配"。代码尝试动态分配一个 Slam 块求解器对象并将其赋值给变量 block Solver:
Slam Block Solver* block Solver = new Slam Block Solver(线性求解器);
^
其中包含一条注释:"candidate is":候选者是:"g2O库中的块求解器[g2O库中块求解器特性的维度<6,3>]的标准唯一指针版本的标准线性求解器对象"。
我发现salmEnd.cpp中的初始化解算器与g2o库中的block_solver.hpp定义有所不同(哈哈,我不太清楚这个细节哦,请参考<>)。
于是乎,模仿这改呗,将salmEnd.cpp中的代码
blockSolver = new instance of SlamBlockSolver(linearSolver);
solver = new instance of g2o::OptimizationAlgorithmLevenberg(block Solver);
改为
An instance of SlamBlockSolver* named BlockSolver is created using new instance of SlamBlockSolver, initialized with a unique pointer to a SlamLinearSolver holding the linearSolver.
A pointer to an OptimizationAlgorithmLevenberg object named solver is created using new instance of g2o::OptimizationAlgorithmLevenberg, initialized with a unique pointer to a SlamBlock Solver object named Block Solver.
再次编译,咦,居然通过了,嘿嘿
贴出最后的结果图

参考链接:<>
<>
