
1. 项目概述在Ubuntu 18.04上部署LSD-SLAM如果你正在研究机器人视觉或者三维重建大概率听说过ORB-SLAM、VINS-Mono这些大名鼎鼎的算法。但今天我想聊的是一个在SLAM即时定位与地图构建发展史上有着独特地位的开源项目——LSD-SLAM。它全称是Large-Scale Direct monocular SLAM由德国慕尼黑工业大学计算机视觉组在2014年提出。与当时主流的基于特征点的方法不同LSD-SLAM采用了直接法直接利用图像像素的灰度信息进行位姿估计和稠密地图构建这为单目相机实现大尺度、半稠密的环境重建提供了可能。然而这个经典项目在较新的系统上编译运行常常会遇到各种依赖和兼容性问题。特别是对于很多实验室和开发者来说Ubuntu 18.04 LTSBionic Beaver依然是一个稳定且广泛使用的开发平台许多机器人中间件如ROS Melodic也基于此版本。因此在Ubuntu 18.04上成功搭建并运行LSD-SLAM就成了一道必须跨过的门槛。这不仅仅是“跑通一个Demo”更是理解直接法SLAM原理、掌握复杂开源项目环境配置、以及为后续算法研究和二次开发打下基础的关键一步。本文将基于我多次在Ubuntu 18.04上部署LSD-SLAM的经验为你拆解整个过程从环境准备、源码编译、到运行调试和问题排查提供一份可直接“抄作业”的详细指南。2. 环境准备与核心依赖解析在Ubuntu 18.04上编译一个像LSD-SLAM这样有一定历史的C项目第一步也是最关键的一步就是搭建一个正确且完整的依赖环境。很多编译失败的问题根源都在于此。2.1 系统基础环境确认首先确保你的Ubuntu 18.04系统是最新的。打开终端执行以下命令更新软件源和已安装的包sudo apt update sudo apt upgrade -y接下来安装编译所需的通用工具链包括构建工具、版本控制工具和必要的开发库sudo apt install -y build-essential cmake git pkg-configbuild-essential包含了GCC/G编译器、make等核心编译工具。cmakeLSD-SLAM使用CMake作为构建系统这是必须的。git用于从GitHub克隆源码。pkg-config帮助查找库文件和头文件路径的工具。2.2 核心依赖库的安装与版本选择LSD-SLAM的核心依赖包括OpenCV、Eigen、SuiteSparse、Pangolin等。在Ubuntu 18.04的官方仓库中这些库的版本可能不完全匹配LSD-SLAM原始代码的要求需要特别注意。1. OpenCVLSD-SLAM对OpenCV的版本有一定要求通常需要OpenCV 2.x或3.x。Ubuntu 18.04默认仓库提供的是OpenCV 3.2。这个版本基本兼容但为了减少潜在问题我建议安装一个更通用的OpenCV 3.4.x。我们可以通过源码编译安装但为了快速部署使用官方仓库版本也是可行的。sudo apt install -y libopencv-dev安装后可以通过pkg-config --modversion opencv检查版本确认是3.2.0。2. Eigen3Eigen是一个高性能的C模板库用于线性代数运算。LSD-SLAM大量使用了它。Ubuntu 18.04仓库中的Eigen3版本通常是3.3.4是合适的。sudo apt install -y libeigen3-dev3. SuiteSparseSuiteSparse是一套用于稀疏矩阵计算的库LSD-SLAM用它来求解大规模线性系统。这是必须的依赖。sudo apt install -y libsuitesparse-dev4. Pangolin这是一个轻量级的OpenGL显示/交互库LSD-SLAM用它来可视化相机轨迹和重建的地图。这是最容易出问题的依赖之一。Ubuntu仓库中的版本可能太旧或缺失。最可靠的方式是从源码编译安装。# 安装Pangolin的依赖 sudo apt install -y libglew-dev libwayland-dev libxkbcommon-dev wayland-protocols sudo apt install -y ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev sudo apt install -y libpng-dev libjpeg-dev # 克隆并编译Pangolin cd ~ git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j$(nproc) sudo make install注意编译Pangolin时如果遇到关于Wayland的错误可以尝试在CMake时加上-DBUILD_WAYLANDOFF来禁用Wayland支持因为很多问题源于Wayland与X11的兼容性。命令改为cmake -DBUILD_WAYLANDOFF ..。5. 其他可选但推荐的库libboost-all-devBoost库一些工具可能用到。libtbb-devIntel线程构建块用于并行计算可能提升性能。2.3 创建工作空间与获取源码不建议在系统目录直接编译。创建一个独立的工作目录是个好习惯。mkdir -p ~/lsd_slam_ws/src cd ~/lsd_slam_ws/src接下来获取源码。原始的LSD-SLAM仓库tum-vision/lsd_slam可能对最新系统支持不佳。我们可以使用一个针对Ubuntu 18.04适配过的分支或复刻版本。根据网络信息Rick0514/Ubuntu18.04-LSD-SLAM是一个可行的选择。git clone https://github.com/Rick0514/Ubuntu18.04-LSD-SLAM.git lsd_slam cd lsd_slam这个仓库通常已经包含了lsd_slam_core核心算法库、lsd_slam_viewer可视化工具等子模块或目录结构。3. 源码编译与关键配置修改环境就绪后就进入了核心的编译环节。LSD-SLAM的CMakeLists.txt可能需要进行一些调整才能适应Ubuntu 18.04的环境。3.1 编译lsd_slam_core核心库首先编译最核心的部分。进入lsd_slam_core目录如果仓库结构如此cd ~/lsd_slam_ws/src/lsd_slam/lsd_slam_core mkdir build cd build现在运行CMake生成Makefile。这里有几个关键点指定Eigen3路径虽然我们安装了libeigen3-dev但有时CMake找不到。可以显式指定。处理OpenCV版本确保CMake找到的是我们安装的OpenCV 3.2。一个相对稳健的CMake命令如下cmake .. -DCMAKE_BUILD_TYPERelease -DEIGEN3_INCLUDE_DIR/usr/include/eigen3-DCMAKE_BUILD_TYPERelease指定为发布模式编译器会进行优化程序运行更快。-DEIGEN3_INCLUDE_DIR明确告诉CMake Eigen3头文件的位置。执行后仔细观察CMake的输出。重点关注以下几行Found OpenCV: ... (found version 3.2.0)确认OpenCV版本。Found Eigen3: ...确认Eigen3找到。Found Pangolin: ...确认Pangolin找到。如果Pangolin找不到可能需要设置Pangolin_DIR变量指向Pangolin安装后的CMake配置文件路径通常是/usr/local/lib/cmake/Pangolin。CMake成功后开始编译make -j$(nproc)-j$(nproc)表示使用你电脑所有可用的CPU核心并行编译能显著加快速度。3.2 编译lsd_slam_viewer可视化工具核心库编译成功后再编译可视化部分。回到源码根目录进入lsd_slam_viewercd ~/lsd_slam_ws/src/lsd_slam/lsd_slam_viewer mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc)可视化工具依赖于核心库和Pangolin。如果CMake报错找不到lsd_slam_core可能需要检查上一步核心库是否成功编译并生成了liblsd_slam_core.so之类的库文件。有时需要在CMake时通过-Dlsd_slam_core_DIR指定其路径。3.3 常见编译错误与修复方案在Ubuntu 18.04上你很可能会遇到以下几个经典错误错误1fatal error: Eigen/Core: No such file or directory原因CMake没有正确找到Eigen3的头文件路径。解决确保已安装libeigen3-dev。在CMake命令中显式指定路径-DEIGEN3_INCLUDE_DIR/usr/include/eigen3。如果Eigen安装在非标准路径需要相应修改。错误2error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope原因这是OpenCV版本兼容性问题。CV_LOAD_IMAGE_GRAYSCALE是OpenCV 2.x的宏在OpenCV 3.x和4.x中已被cv::IMREAD_GRAYSCALE取代。解决需要修改源代码。在报错的文件中通常是ImageSource.cpp或IOWrapper/OpenCV/ImageSource_OpenCV.cpp找到使用CV_LOAD_IMAGE_GRAYSCALE的地方将其替换为cv::IMREAD_GRAYSCALE。同时需要包含正确的头文件#include opencv2/imgcodecs.hpp。这是一个典型的针对新系统适配老代码的修改。错误3Pangolin相关链接错误如undefined reference to ‘pangolin::’原因链接器找不到Pangolin库。可能因为Pangolin没有正确安装或者CMake没有找到。解决确认Pangolin已通过sudo make install安装到系统目录/usr/local。尝试在CMake时清除缓存重新配置删除build目录重新执行cmake。可以尝试手动指定Pangolin路径cmake .. -DPangolin_DIR/usr/local/lib/cmake/Pangolin。错误4error: ‘usleep’ was not declared in this scope原因usleep函数在较新的C标准或特定系统上需要特定的头文件。解决在报错的源文件开头添加头文件#include unistd.h。4. 运行测试与数据准备编译成功后我们终于可以运行LSD-SLAM了。它需要一个图像序列作为输入。4.1 获取测试数据集LSD-SLAM官方提供了一些测试数据集。一个常用的室内场景是desk序列。我们可以从TUM的服务器下载cd ~/lsd_slam_ws wget https://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_desk.tgz tar -xzvf rgbd_dataset_freiburg1_desk.tgz解压后会得到一个包含rgb/彩色图像和depth/深度图LSD-SLAM单目版本不需要的文件夹以及一个rgb.txt文件里面记录了图像的时间戳和文件名。4.2 运行LSD-SLAM运行LSD-SLAM通常需要启动两个程序一个是核心的SLAM节点lsd_slam_core另一个是可视化界面lsd_slam_viewer。它们之间通过ROS或简单的网络接口通信。由于我们可能没有安装ROSLSD-SLAM自带了一个基于TCP的通信方式。第一步启动可视化器在一个终端中进入lsd_slam_viewer的编译目录并运行cd ~/lsd_slam_ws/src/lsd_slam/lsd_slam_viewer/build ./bin/lsd_slam_viewer如果一切正常会弹出一个黑色的Pangolin窗口。这表明可视化部分启动成功正在等待SLAM核心发送数据。第二步运行SLAM核心并指定数据集打开另一个终端进入lsd_slam_core的编译目录运行主程序并指定数据集路径和关联文件cd ~/lsd_slam_ws/src/lsd_slam/lsd_slam_core/build ./bin/lsd_slam_dataset ~/lsd_slam_ws/rgbd_dataset_freiburg1_desk/rgb/ ~/lsd_slam_ws/rgbd_dataset_freiburg1_desk/rgb.txt第一个参数是图像目录的路径。第二个参数是图像关联文件rgb.txt的路径。程序开始运行后你会在终端看到它读取图像、初始化、跟踪位姿的输出信息。同时在可视化器窗口中你应该能看到左侧当前相机拍摄的图像。右侧重建出的半稠密点云地图和估计的相机轨迹通常是一条逐渐增长的线。4.3 运行参数解析与调整lsd_slam_dataset程序可以接受一些命令行参数来调整行为-calib [文件]指定相机标定文件。如果数据集文件夹内有camera.txt程序会自动读取。如果没有你需要准备一个。对于TUM数据集标定参数通常是固定的。你可以创建一个camera.txt文件内容类似Pinhole 525.0 525.0 319.5 239.5 in_width 640 in_height 480这表示焦距(fx, fy)525光学中心(cx, cy)在(319.5, 239.5)图像分辨率640x480。-speed [浮点数]播放速度因子。1.0表示实时0.5表示慢速播放2.0表示快速播放。对于调试可以从0.5开始。-mode [0/1/2]运行模式。0仅从数据集读取1处理数据集并输出结果2使用外部图像源。运行命令可以整合为./bin/lsd_slam_dataset -calib ~/lsd_slam_ws/rgbd_dataset_freiburg1_desk/camera.txt -speed 0.5 ~/lsd_slam_ws/rgbd_dataset_freiburg1_desk/rgb/ ~/lsd_slam_ws/rgbd_dataset_freiburg1_desk/rgb.txt5. 深度问题排查与性能优化即使程序成功运行你可能还会遇到跟踪丢失、地图漂移、重建效果差等问题。这部分分享一些进阶的排查和优化经验。5.1 运行时常见问题与诊断问题1可视化器黑屏或闪退核心程序报错Failed to connect to viewer诊断两个进程之间的网络通信失败。LSD-SLAM默认使用本地回环地址127.0.0.1和特定端口通信。解决确保先启动lsd_slam_viewer再启动lsd_slam_core。检查是否有防火墙规则阻止了本地进程间通信在Ubuntu上通常不会。可以尝试在运行核心程序时指定主机和端口但需要查看源码是否支持该参数通常不支持修改。最根本的解决方法是检查lsd_slam_core中IOWrapper/目录下的网络通信代码确认端口号默认可能是5000是否被占用。问题2跟踪很快丢失终端大量输出TRACKING LOST诊断这是直接法SLAM的常见问题。原因可能是相机运动过快图像间变化太大直接法基于灰度不变假设无法找到正确的像素对应关系。光照变化剧烈数据集中有光照突变违反了灰度不变假设。图像模糊相机对焦不准或运动导致模糊。相机标定参数错误内参不准确会严重影响位姿估计。解决使用-speed 0.2更慢地播放数据集给算法更多处理时间。检查camera.txt标定文件确保参数与数据集匹配。TUM RGB-D数据集的标定参数可以在其官网找到。尝试其他运动更缓慢、光照更稳定的数据集序列。问题3重建的地图点云非常稀疏或扭曲诊断深度滤波器收敛不佳或深度值传播有问题。直接法SLAM的地图是“半稠密”的只在梯度明显的区域计算深度。如果图像纹理较弱地图就会稀疏。解决这是算法本身的特性。可以尝试调整源码中DepthEstimation.cpp或SlamSystem.cpp中的参数如深度滤波器的初始化方差、收敛阈值等。但修改这些参数需要你对算法有较深理解。确保输入图像是灰度图。虽然程序通常会自动转换但最好确认一下。5.2 关键源码参数调整进阶如果你想深入优化或适应自己的场景可能需要修改源码。这里列举几个关键文件和作用lsd_slam_core/SlamSystem.h/.cpp整个SLAM系统的总控可以调整跟踪、建图、回环检测的开关和主要参数。lsd_slam_core/DepthEstimation.cpp深度估计的核心修改深度滤波器参数如MIN_GOODPERGOODBAD_PIXEL会影响深度点的生成和收敛速度。lsd_slam_core/Tracking/TrackingReference.cpp跟踪参考帧的管理影响跟踪的鲁棒性。CMakeLists.txt可以修改编译优化等级如-O3、添加调试信息-g或启用SSE等指令集加速。修改示例提高跟踪鲁棒性在Tracking/TrackingReference.cpp中有一个函数负责选择用于跟踪的关键点。你可以尝试降低梯度阈值让算法在纹理稍弱的区域也能提取到点但这可能会增加计算量和噪声。修改需谨慎每次只改一个参数并观察效果。5.3 使用ROS运行LSD-SLAM可选扩展原始的LSD-SLAM也提供了ROS功能包。如果你在Ubuntu 18.04上安装了ROS Melodic可以尝试用ROS来运行这样能更方便地连接真实的相机如USB摄像头或RGB-D相机如Kinect。安装ROS Melodic按照ROS官网指引安装完整版或基础版。创建ROS工作空间并编译mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src # 假设你把lsd_slam源码放在这里 cp -r ~/lsd_slam_ws/src/lsd_slam ./ cd ~/catkin_ws catkin_make -j$(nproc)注意ROS版本的代码可能需要额外的依赖如ros-melodic-libg2o。编译时可能会遇到更多兼容性问题需要根据错误信息逐一解决。运行使用roslaunch lsd_slam_core live.launch等命令启动。ROS方式集成度更高但环境配置更复杂更适合与真实的机器人系统对接。对于初次接触建议先从非ROS的数据集版本入手。6. 项目总结与延伸思考在Ubuntu 18.04上成功部署LSD-SLAM就像完成了一次经典的软件考古与工程实践。这个过程里你不仅是在安装一个程序更是在梳理一个复杂C项目的依赖脉络学习如何解决跨版本的编译兼容性问题并直观感受直接法SLAM的优缺点。从我多次部署的经验来看耐心和系统化排查是关键。不要被一长串的错误信息吓倒按照“检查依赖-修正源码-调整编译选项”的流程大部分问题都能解决。那个CV_LOAD_IMAGE_GRAYSCALE错误几乎是所有在老系统上编译OpenCV 2时代项目的“必修课”。而Pangolin的编译则是对你系统图形开发库是否完整的一次检验。运行起来之后观察LSD-SLAM的重建结果你会发现它和ORB-SLAM这类特征点法有很大不同。它的地图是半稠密的带有梯度信息的像素点才有深度值这导致地图看起来像一幅“素描”。它的优势在于能够直接利用所有像素信息在纹理丰富的区域理论上更稠密且对模糊、快速运动有一定容忍度。但劣势也很明显严重依赖灰度不变假设对光照变化极其敏感计算量大回环检测和全局优化模块相对简单。因此把LSD-SLAM在Ubuntu 18.04上跑通只是一个起点。你可以以此为基地做很多有趣的事情代码走读结合原论文深入阅读SlamSystem、SE3Tracker、DepthEstimation等核心模块的代码理解直接法跟踪、深度滤波器的实现细节。性能分析使用gprof或perf工具分析程序热点看看时间主要消耗在哪个函数很可能是图像金字塔构建或雅可比矩阵计算。算法对比在同一个数据集上运行LSD-SLAM和ORB-SLAM2也需要在Ubuntu 18.04上部署对比它们的轨迹精度、地图效果和运行速度。尝试改进例如尝试将原始的梯度点选取策略改为基于FAST或Shi-Tomasi角点看看能否在保持直接法优势的同时提升跟踪鲁棒性。最后一个小技巧建议你将整个成功编译的环境包括修改后的源码、安装的依赖通过Dockerfile或虚拟机快照保存下来。LSD-SLAM这样的研究工具我们可能不会频繁使用但当下次需要复现实验或进行对比时一个现成的、可工作的环境能节省大量时间。毕竟在软件世界里“它能工作”本身就是一种宝贵的状态。