Ubuntu16.04安装LSD-SLAM
Ubuntu16.04安装LSD-SLAM的过程、注意事项以及可能出现的错误:
LSD-SLAM官网:https://vision.in.tum.de/research/vslam/lsdslam
LSD-SLAM Github:https://github.com/tum-vision/lsd_slam
在使用LSD-SLAM之前需要先确保已正确配置ROS kinetic环境,并参考以下链接获取详细指导:点击打开链接
在使用LSD-SLAM之前需要先确保已正确配置ROS kinetic环境,并参考以下链接获取详细指导:点击打开链接
1. 安装LSD-SLAM
1.1 创建rosbuild工作空间:
sudo apt-get install python-rosinstall
mkdir ~/rosbuild_ws
cd ~/rosbuild_ws
rosws init . /opt/ros/kinetic
mkdir package_dir
rosws set ~/rosbuild_ws/package_dir -t .
echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
bash
cd package_dir
1.2 安装依赖
sudo apt-get install ros-kinetic-libg2o ros-kinetic-cv-bridge liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
请避免安装这些依赖项中的libqglviewer-dev文件包,在运行LSD-SLAM软件时可能会因realloc(): invalid pointer而导致程序崩溃
请参考下面的问题2.1 安装libqglviewer-dev-qt4,并创建相关链接。
1.3 获取LSD-SLAM
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
1.4 编译
rosmake lsd_slam
在编译过程中可能会遇到一些问题,请查阅相关问题分析并根据提示修改源代码后再进行编译;如果仍出现错误,则需根据错误提示进一步调整并重新运行编译程序。
2. 问题和解决方法
2.1 运行lsd_slam_viewer出现下面的错误:

分析表明,在Ubuntu 16.04系统中,当安装libqglviewer-dev时,默认会依赖Qt 5模块。这直接成为引发该问题的原因。因为LSD-SLAM specifically requires the Qt 4 framework作为其开发基础而无需依赖Qt 5。
解决方法:
- 删除libqglviewer-dev
sudo apt remove libqglviewer-dev
- 安装libqglviewer-dev-qt4,并创建相关链接
sudo apt install libqglviewer-dev-qt4
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libQGLViewer-qt4.so libQGLViewer.so
在编译过程中遇到异常情况:调用Exception异常,并提供以下信息:描述字符串中不允许包含引号

分析:根据名称可以推断出不应在描述部分使用引号符号(单个'或者双个''),通过查看错误信息可以直接确定需要修改的文件名。
解决方法:
1) lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg
在第20行scaledDepthVarTH处发现点's 和 keyframe's 存在单引号问题
第21行absDepthVarTH:单词 point's
第24行cutFirstNKf:单词 keyframe's
2) lsd_slam_core/cfg/LSDDebugParams.cfg
第11行plotStereoImages:单词 what's
第12行plotTracking:单词 what's
第48行continuousPCOutput:单词 Keyfram's
编译过程遇到无效的引用初始化报错信息:无法从rvalue类型'qreal'(相当于double)中初始化非const引用类型'qreal&'(相当于double&)

在 Qt 框架中定义为 qreal 的数据类型,在 Ubuntu 14.04 系统环境中等同于 float 类型;然而到了 Ubuntu 16.04 系统环境中,则被修改为 double 类型。错误信息指出:变量 x、y、z 的数据类型为 float 类型;而 getPosition 函数的形式参数却被指定为其形参数据类型为 qreal(相当于 double),因此这些 x、y、z 的数值会被自动转换并暂存在一个临时变量里;这样就会导致 getPosition 函数接收的是一个右值而非常数引用对象;但由于该右值无法初始化非const引用对象而产生错误。
解决方法:
1) lsd_slam_viewer/src/PointCloudViewer.h
第135行:将float x, y, z修改为qreal x, y, z或者double x, y, z
2) lsd_slam_viewer/src/PointCloudViewer.cpp
第325行:将float x, y, z修改为qreal x, y, z或者double x, y, z
在编译过程中会遇到警告信息:X11 'Status' 宏定义被检测到,这可能导致编译冲突。建议在任何X11相关头文件之前包含此头文件。

分析:该错误信息位于./include/opencv-3.2.0-dev/opencv2/stitching.hpp第58行中。该文档提供了处理方法:将该头文件置于所有X11包含的头文件之前,并可直接注释掉#include "opencv2/opencv.hpp"。
解决方法:
为该cpp文件lsd_slam_viewer/src/KeyFrameDisplay.cpp ,其包含的头文件块应重新排列其顺序。
#include "opencv2/opencv.hpp"
#include <GL/glx.h>
#include <GL/gl.h>
#include <GL/glu.h>
或者
#include <GL/glx.h>
#include <GL/gl.h>
#include <GL/glu.h>
// #include "opencv2/opencv.hpp"
3. 运行LSD-SLAM
3.1 操作包括获取并解包该数据集:[Room Example Sequence](http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip)
3.2 打开Termial,输入以下命令:
roscore
3.3 打开新的Termial,输入以下命令,弹出PointCloud Viewer窗口:
rosrun lsd_slam_viewer viewer
3.4 打开新的Termial,输入以下命令:
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
3.5 启动一个新的Terminal窗口, 键入以下指令, 并打开... DebugWindow DEPTH窗口并运行SLAM程序
rosbag play ./LSD_room.bag
注释:用于将上述命令中的./LSD_room.bag替换成你之前下载的数据集所在的路径
注

从错误信息来看,推测可能是Qt版本更新引起的,目前尚未找到有效的解决方案,期待得到各位的帮助和指导。或许应该先卸载安装的Qt 5版本,重新安装 Qt 4版本可能会解决问题。在程序中,这个错误是由于DebugWindow DEPTH窗口的出现导致的
解决方法:
在文件lsd_slam slam_core/src/util/settings.cpp 中的第38行变量displayDepthMap被置为false;则该调试窗口不会显示DEPTH信息;
bool displayDepthMap = false;
在步骤1.4中进行重新编译操作后,在完成步骤3.2至3.5的依次执行过程中(如上文所述),系统会顺利运行并启动Point Cloud Viewer应用程序以查看环境中的点云数据。然而,在该过程中系统不会展示DebugWindow中的DEPTH信息(参考:Ubuntu14.04安装LSD-SLAM)

