Advertisement

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。

解决方法:

  1. 删除libqglviewer-dev
复制代码
    sudo apt remove libqglviewer-dev
  1. 安装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

全部评论 (0)

还没有任何评论哟~