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,可以参考:点击打开链接
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
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
rosmake lsd_slam
注:编译过程中会出现一些错误,请参考下面的问题2.2-2.4对源代码进行修改之后再进行编译;或者再编译过程中出现错误,根据错误提示修改源代码,并重新编译。
2. 问题和解决方法
2.1 运行lsd_slam_viewer出现下面的错误:
分析:在Ubuntu16.04中,安装libqglviewer-dev,默认依赖的是qt5,这是导致上述问题的直接原因,因为LSD-SLAM需要依赖qt4,而不是qt5。
解决方法:
1) 删除libqglviewer-dev
sudo apt remove libqglviewer-dev
sudo apt install libqglviewer-dev-qt4
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libQGLViewer-qt4.so libQGLViewer.so
分析:顾名思义,不应该在描述中出现引号(单引号或双引号),可以通过查看错误内容得知需要修改的文件的名称。
解决方法:
1) lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg
第20行scaledDepthVarTH:单词 point'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
2.3 编译过程中出现错误:invalid initialization of non-const reference of type 'qreal& {aka double&}' from an rvalue of type 'qreal {aka double}'
分析:qt中的qreal表示小数,在Ubuntu14.04中qreal就是float,但是Ubuntu16.04中qreal变为了double。错误中的变量x, y, z的类型是float,getPosition函数的形参类型是qreal,也就是double,所有x, y, z的值会自动转型为double,并存储在一个临时变量中,这会导致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
2.4 编译过程中出现错误:warning Detected X11 'Status' macro definition, it can cause build conflicts. Please, include this header before any X11 headers.
分析:这条错误信息可以在文件/opt/ros/kinetic/include/opencv-3.2.0-dev/opencv2/stitching.hpp的58行查看到,信息中已经告诉了如何解决这个问题,即:将这个头文件放到任何X11头文件之前,或者也可以直接将#include "opencv2/opencv.hpp"注释掉
解决方法:
将文件lsd_slam_viewer/src/KeyFrameDisplay.cpp的头文件修改为如下顺序:
#include "opencv2/opencv.hpp"
#include
#include
#include
或者
#include
#include
#include
// #include "opencv2/opencv.hpp"
3.1 下载数据集并解压:Room Example Sequence
3.2 打开Termial,输入以下命令:
roscore
rosrun lsd_slam_viewer viewer
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
3.5 打开新的Termial,输入以下命令,弹出DebugWindow DEPTH窗口并运行SLAM:
rosbag play ./LSD_room.bag
注:将上述命令中的./LSD_room.bag替换为你之前下载的数据集的所在的路径
分析:根据错误的提示,可以猜测这个错误也是Qt版本变化导致的,暂时还不知道如何解决,希望能有高人指教。也许将Ubuntu16.04的qt5卸载了,安装qt4就能解决这个问题。在程序中,这个错误是由于DebugWindow DEPTH窗口的出现导致的。
解决方法:
可以将文件lsd_slam_core/src/util/settings.cpp的第38行的变量displayDepthMap设为false,即不显示DebugWindow DEPTH窗口:
bool displayDepthMap = false;
重新编译,即步骤1.4。再次执行步骤3.2-3.5,此时程序可以正常运行,可以在PointCloud Viewer中查看环境的点云信息,但是不显示DebugWindow DEPTH窗口,如下所示(LSD-SLAM正常运行,可以参考:Ubuntu14.04安装LSD-SLAM):