Beginning of SLAM (SLAM 环境简单配置)
关于 SLAM 的环境配置简介,从 Ubuntu 系统的安装讲解至系统环境安装,最后介绍了两个开源项目的配置方案。
0. 简介和相关工作
SLAM 为 Simultaneous Localization And Mapping 的缩写,中文译为同步定位与建图,主要用于机器人(包括工程机器人、汽车、无人机、智能小车、仓储机器人等大量能装载 SLAM 相关传感器的机械)在未知环境下的定位问题和环境地图构建问题。
SLAM 主要对视觉数据(如单眼相机拍摄的图像、深度图、语义图等)、激光雷达数据(主要是点云)、运动传感器数据(从惯性测量单元 IMU 采集得到)、测距数据(点云包含的距离信息,UWB 测量得到的距离信息,GPS 数据等)等多种数据进行处理,完成对机器人的轨迹追踪、对未知环境的地图构建等。
SLAM 前景广阔,可以运用于军事侦察、工地探测、矿洞检测、商业开发、社会建设等诸多方面,在无人驾驶、AR(增强现实)、VR(虚拟现实)、智能仓储、无人机等应用领域 SLAM 都发挥着重要甚至是决定性的作用。经过数年的发展和探索,SLAM 已经取得很大进展,但是在实际应用上仍然存在大量有待深度开发的空间。
与传统的深度学习不同,SLAM 可以说是和深度学习一样是机器学习的子分支,但是却有着比深度学习更加明确的理论支撑。SLAM 涉及到包括几何算法、欧式空间、运动学方程等广为人知的基础理论知识,也会需要运用如因子图、优化算法、图算法等较为高深的学科理论,甚至还需要使用到深度学习得到的高效模型。SLAM 并不是一定需要所有的这些知识,但是不同理论的相互结合都能带给开发者或研究者意想不到的收获,这也是 SLAM 的一大魅力所在。
就经典的 SLAM 算法来讲,从输入的视觉数据上来看主要分为三类:
- LiDAR SLAM:以激光雷达的点云作为主要的视觉特征输入,经典的算法主要有 LOAM [1]、LeGO-LOAM [2]、LIO-SAM [3]、FAST-LIO [4]。
- Camera SLAM:以相机拍摄的照片作为视觉输入,相机则包含了单眼相机、双目相机、RGB-D 相机、鱼眼相机等,经典的算法主要有 ORB-SLAM [5]、ORB-SLAM2 [6]、ORB-SLAM3 [7]、VINS-Mono [8] 等。
- LiDAR + Camera SLAM:以激光雷达和相机照片作为输入,包括 R2LIVE [9]、R3LIVE [10] 等。
另外,近年来,研究者开始关注语义 SLAM,即在环境中存在动态物体(如车辆、人等)的前提下完成 SLAM 算法,包括 SuMa++ [11]、DS-SLAM [12]、DynaSLAM [13]、VDO-SLAM [14]、Kimera-Multi [15] 等。
1. Linux 环境安装
SLAM 的开发主要是在 Linux 环境下,当然也可以在 Windows、MacOS 环境下。但是,相比于后者,Linux 开源且对于大量的开发工具包都有着十分良好的支持,因此在程序开发方面,会常见到 Linux 的身影。本环境配置教程则以 Linux 为例进行说明,后续的所有配置都是基于 Linux 系统下。
Linux 有诸多的发行版,包括 CentOS、Ubuntu、Debian、Linux Mint、Fedora 等。本说明则主要讲解 Ubuntu 18.04,是目前来说使用较多的一个 Ubuntu 发行版,读者也可以使用 Ubuntu 16.04、Ubuntu 20.04 等,前者 2016 年发行相对较老,后者则发行于 2020 年,目前已经较为稳定,大多数的开发工具包已经对其进行了适配。目前 Ubuntu 最新的发行版是 22.10,但是新版本往往存在一些 bug,而且开发者工具可能无法适配新系统,因此一般不推荐使用最新的版本。
1.1. 双系统安装 Linux
如果你已经安装了 Windows,那么安装一个 Ubuntu 双系统并不困难,只需要将你的硬盘空间留出一部分即可。尽量选择在固态硬盘上安装系统,以保证系统的流畅运行;并预留至少 100GB 的空间给 Linux,以保证能给系统足够的工具安装空间。当然你可以直接在 Windows 下直接安装 Linux 子系统 WSL,尽管目前为其添加了 GUI,但是主要以命令行控制为主,不推荐新手或者需要进行图形界面操作的用户使用。
轻量级 U 盘启动盘制作工具 Rufus:https://zhuanlan.zhihu.com/p/454872391
Ubuntu 18.04 下载:https://releases.ubuntu.com/18.04/,下载 Desktop 镜像,对应 64-bit PC (AMD64)
Windows 10 安装 Ubuntu 18.04 双系统教程:https://blog.csdn.net/qq_43106321/article/details/105361644,Windows 11 的操作类似,使用 Windows 主要是为 Ubuntu 分配(腾出)空间。
Ubuntu 18.04 分区参考:https://blog.csdn.net/dally2/article/details/118032708
由于 Ubuntu 下载某些工具时往往需要使用如下命令:
1 | # 环境更新命令 |
使用默认下载源可能速度缓慢,因此可以更换国内源,如清华源、阿里源、中科大源等,如果下载速度相对正常可以不更换。更换源的方式可以参考:https://blog.csdn.net/Zander0/article/details/119698368
如果使用的是搭载 M 系列芯片的 MacOS,那么安装 Linux 双系统可能较为困难,请读者另行寻找相关资料。
1.2. 虚拟机安装 Linux*
双系统对于新手来说可能不太友好,尤其对于习惯了使用 Windows 的用户,因此可以选择在虚拟机上安装 Ubuntu。常用的虚拟机软件有 VMware Workstation、Oracle VirtualBox 等。
此处提供 VMware Workstation Pro 的一个 Windows 绿色版本(官网版需要收费),链接:https://pan.baidu.com/s/198hQace0Ha_nvjh4ALSXsA?pwd=99in(提取码:99in)
安装参考教程:https://blog.csdn.net/m0_47958289/article/details/117361027
Ubuntu 18.04 下载:参考前述 1.1 部分,或者上面的安装教程
如果使用搭载 M 系列芯片的 MacOS,则虚拟机安装 Ubuntu 较为麻烦(主要原因是 M 系列芯片采用的是 ARM 架构,多数搭载 Windows 系统的电脑的 CPU 为 x86 或 x64 架构),推荐参考如下的教程:
- https://blog.csdn.net/QQ670663/article/details/122988328
- https://blog.csdn.net/qq_24950043/article/details/123764210
- https://blog.csdn.net/qq_24950043/article/details/125774990
- https://www.bilibili.com/video/BV17r4y1A7wD/
2. CMake 安装*
2.1. gcc 和 g++ 的安装
C/C++ 是常用于 SLAM 开发的编程语言,因此需要为其配置基本的编译环境。
1 | sudo apt update |
若出现版本号,证明安装成功。
参考:https://www.cnblogs.com/gu-qiu/p/13735992.html
2.2. CMake 安装
CMake 是一个用于协助 C/C++ 进行编译的工具,使用过 Qt 的应该知道 QMake,其与 CMake 具有类似的功能,都是用于协调 C/C++ 工程进行编译,控制编译方式和编译顺序等。CMake 目前最新版为 3.26,但是同理不推荐安装最新版,推荐可以安装 3.24 版。SLAM 项目通常由多个 C/C++ 代码文件构成,使用 CMake 可以为程序编译提供良好的环境。
安装参考教程:https://blog.csdn.net/KIK9973/article/details/118796510
注意教程最后作者讲解了将 CMake 加入系统环境变量,一定要使用作者的推荐方法(软连接法),否则可能会影响到后续对 CMake 的使用(如果安装了 ROS,则会自动安装 CMake 3.10,对于使用 3.10 以上版本 CMake 进行编译的项目,低版本则无法完成编译,并且 ROS 安装的 CMake 通常会放在有较高优先级的环境变量中,如果不手动变更自主安装的 CMake 的环境优先级,系统在编译时就会优先使用 ROS 安装的 CMake)。
CMake 官网下载地址:https://cmake.org/download/
2.3. CMake 的常见使用方式
CMake 常用于编译项目级的 C/C++ 程序,常见的编译格式如下:
1 | cd PROJECT_DIR # 进入工程目录下 |
3. ROS 安装
ROS 全称为 Robot Operating System,顾名思义是用于机器人的操作系统。也可以把它理解为一个子系统或者开发工具,我们需要借助其提供的开发包进行数据发布/订阅、数据可视化等。ROS 常用于 SLAM 系统的开发,已经推出至 ROS2,但是目前使用较少,此处为第一版的 ROS。
安装参考教程:https://blog.csdn.net/KIK9973/article/details/118755045?spm=1001.2014.3001.5502
ROS 基础功能介绍和基础教程:http://wiki.ros.org/cn
ROS 和 Ubuntu 的版本对应关系:
Ubuntu | ROS |
---|---|
14.04 LTS | indigo Igloo |
16.04 LTS | Kinetic Kame |
18.04 LTS | Melodic Morenia |
20.04 LTS | Noetic Ninjemys |
从 22.04 LTS 以后,将停止 ROS1 的支持,之后将转为 ROS2 提供相关服务和支持:
Ubuntu | ROS2 |
---|---|
20.04 LTS | Foxy Fitzroy |
20.04 LTS | Galactic Geochelone |
20.04 LTS/22.04 LTS | Humble Hawksbill (Recommended) |
注意本说明主要围绕 Ubuntu 18.04 进行讲解,因此后续安装相关 ROS 环境配置库时,通常使用包含 melodic 字样的库名称,例如安装 qt 相关库:
1 | sudo apt-get install ros-melodic-qt |
ROS-Melodic 会为用户自动安装一些第三方库,包括 Eigen(一个矩阵处理库,一般为 3.3.4 版本)等,以便于 ROS 能正常运行。3.3.4 版本的 Eigen 基本已经能满足大多数项目的需求
4. OpenCV 安装*
OpenCV 是一个开源的视觉处理库,常用于图像、视频处理,目前官网已经更新至 4.7.0 版本。OpenCV 提供了 C++、Python、Java、Android、iOS 的 API 接口,可以运行在 Linux、Windows、MacOS 等主流操作系统上。
OpenCV 目前发行版众多,每一版会增加一些新功能并做一些优化,但是就开发上来说,一般使用较多的为 3.4.X 版本。考虑到视觉处理算法的多样性,推荐结合 OpenCV-contrib 安装,丰富 OpenCV 的功能,方便后期使用,但是并不代表一定需要安装。
OpenCV 3.4.3 + OpenCV-contrib 3.4.3 安装教程:https://blog.csdn.net/qq_25738937/article/details/122284073
OpenCV 3.4.3 安装教程:https://blog.csdn.net/hhz_999/article/details/120441809
OpenCV 3.4.X + OpenCV-contrib 3.4.X 安装教程:https://blog.csdn.net/bj233/article/details/113351023
5. Python 和 Anaconda
5.1. Python 安装
除 C/C++ 外,Python 也是常用于 SLAM 开发的编程语言。通常 Ubuntu 自带 Python 解释器,包括 Python 2.7 和 Python 3.6。但是考虑到开发者的诉求,新的 Ubuntu 发行版去除了 Python 解释器的捆绑安装,需要用户自行安装。如果已经安装了 ROS,那么在安装 ROS 的过程中将已经安装好 Python 2.7 和 Python 3.6。如果没有安装 ROS,则可以手动安装 Python 解释器。目前 Python 2 基本已经少有使用并已经停止更新维护;而 Python 3 版本更新迭代速度非常快,至少已经更新至 3.11 版本,推荐使用 3.6 和 3.7 版本,尽管是数年前的版本,但是目前两个版本在大多数 Python 项目中都能给予良好的支持。
安装教程:https://blog.csdn.net/Mantana/article/details/107893182
5.2. Anaconda 安装*
如果熟悉使用 Python,会发现,Python 大量依赖于第三方库进行科学分析,包括 numpy、opencv-python、pandas、matplotlib、requests、scipy、scikit-learn 等,以及用于深度学习的库 PyTorch、TensorFlow 等,这也成为 Python 的一大魅力所在。然而这些第三方库的版本之间往往存在依赖关系甚至冲突关系,例如一些库可能需要另外一个特定版本的第三方库甚至只支持特定版本的 Python,这就会导致需要卸载已安装的版本后重新安装,十分麻烦且容易造成之前的项目在版本变更后无法正常运行。因此,通常会使用到 Python 虚拟环境,通过虚拟环境管理便于我们在各个环境中自由配置想要的 Python 版本以及所需的某些特定版本的第三方库,而各个虚拟环境之间并不冲突,极大地为项目管理提供了友好的支持。
对于虚拟环境,尽管有相应的库(virtualenv)可以为我们提供相应功能的管理和支撑,然而其不便于管理 Python 版本,例如无法同时存在解释器为 Python 3.6 和 Python 3.7 的两个环境,此时我们就可以使用 Anaconda 或者 Miniconda 进行虚拟环境管理,此处主要围绕 Anaconda。
conda 的优势:https://zhuanlan.zhihu.com/p/379321816
**不管有没有安装 Python,安装 Anaconda 都不会对环境带来冲突。所以,建议在需要安装 Python 环境时,可以直接安装 Anaconda。**目前 Anaconda 自带 Python 3.9 的基本虚拟环境,我们可以使用 Anaconda 创建更多的不同版本的虚拟环境。
安装教程:https://blog.csdn.net/KIK9973/article/details/118772450
安装教程 + 常用命令:https://blog.csdn.net/m0_50181189/article/details/120005978
使用教程:https://blog.csdn.net/weixin_44657714/article/details/120036158,尽管里面提到的是 Windows,但是与 Anaconda 在 Linux 下的操作方法基本相同。
常用的 conda 指令:
1 | # 创建名为 env_name,解释器为 Python 3.x 的虚拟环境 |
所有在虚拟环境下运行的 Python 程序,其所调用的第三方库和解释器都只与当前虚拟环境有关。例如有 py36torch17(安装 Python 3.6 + PyTorch 1.7)和 py37torch110(安装 Python 3.7 + PyTorch 1.10)两个环境,如果激活 py36torch17,并运行调用 torch 相关库的代码时,其并不会使用任何 py37torch110 中的配置,即不会使用 Python 3.7 运行代码,也无法使用 PyTorch 1.10 提供的相关算法。
6. 常用的第三方库安装
安装环境或者下载代码时,常常需要使用 git 指令,如果发现找不到 git 指令,则可以通过以下命令安装:
1 | sudo apt-get install git |
6.1. boost 安装
boost 主要用于一些代码加速处理,大多数的项目都需要 boost 库的支持。
安装教程:https://blog.csdn.net/bin_bujiangjiu/article/details/120859240
6.2. Eigen 安装
Eigen 是一个矩阵计算库,主要用于矩阵的处理。如果安装 ROS-Melodic,会自带安装 Eigen 库,通常版本为 3.3.4,能适用于大多数开源项目。如果没有安装 ROS,则需要手动安装,参考教程如下,推荐安装版本尽量在 3.3.3 及以上。
安装教程-1:https://blog.csdn.net/weixin_45589062/article/details/112622023
安装教程-2:https://blog.csdn.net/reasonyuanrobot/article/details/114372363
6.3. ceres 安装
ceres-solver 用于 SLAM 中的图优化算法,推荐安装 1.14.0 版本。
官方 GitHub:https://github.com/ceres-solver/ceres-solver
安装教程-1:https://blog.csdn.net/qq_42257666/article/details/124600564
安装教程-2:https://blog.csdn.net/m0_49441146/article/details/124145156
6.4. pcl + vtk 安装
pcl 和 vtk 通常用于点云可视化等。一般使用 pcl 1.8 + vtk 7.1,pcl 较新版本存在一些问题,因此尽量安装低版本,较为稳定。pcl 可以支持与 ROS 的数据转换,具有较多的优势。
pcl 官方 GitHub:https://github.com/PointCloudLibrary/pcl
vtk 官方:https://vtk.org/
安装教程:https://blog.csdn.net/handily_1/article/details/122181399
6.5. 其他库
其他用于 SLAM 的库还有:
- 用于图优化算法的 g2o、GTSAM 等;
- 用于李代数处理的 Sophus 等;
- 用于地图存储的 octomap 等;
- 用于绘图的 Pangolin 等。
这些库的安装方式较为简单,网络上有较为丰富的安装教程。
7. 开源项目部署实战 —— ORB-SLAM2*
ORB-SLAM2 是一个十分经典的相机视觉 SLAM 算法,常作为 baseline 出现,并且被后续大量的研究者作为新算法的实验代码基础进行修改。开源地址:https://github.com/raulmur/ORB_SLAM2
7.1. 环境安装
ORB-SLAM2 依赖于 g2o、DBoW2、Pangolin、OpenCV、Eigen 等第三方库,其中 g2o 和 DBoW2 在作者给的源代码中已经包含,且在部署 ORB-SLAM2 时会自动编译调用(注意不会安装到本地,只是临时供于项目调用),因此不需要安装;OpenCV 可以使用 3.4.X 版本正常编译,不必重新安装其他版本;其他的库则需正常手动安装。
注意,ORB-SLAM2 也可以在 ROS 中运行,如果需要在 ROS 中使用,则需要安装 ROS,编译项目时使用对应的编译脚本即可。
其他相关依赖:
1 | sudo apt-get install libglew-dev |
7.2. 项目编译
1 | # 进入代码保存目录 |
7.3. 实验结果
从 TUM 或 EuRoC 或 KITTI 下载相关数据集,并运行如下指令启动 ORB-SLAM2(以 TUM 数据集为例):
1 | ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml |
PATH_TO_SEQUENCE_FOLDER
为保存了 TUM 数据的目录路径,并将 tumx.yaml
与下载的数据集对应,如 TUM1.yaml、TUM2.yaml 和 TUM3.yaml 分别对应 freiburg1、freiburg2 和 freiburg3。
TUM 数据集下载地址:https://vision.in.tum.de/data/datasets/rgbd-dataset/download
7.4. 项目部署参考
8. 开源项目部署实战 —— VINS-Mono*
VINS-Mono 也是一个经典的视觉 SLAM 项目,作为 baseline 被大量文献对比使用,其所使用的数据主要是单眼相机拍摄的图片和 IMU 惯性数据,因此得名 VINS-Mono。开发团队也开发了应用于 iOS 端的 VINS-Mobile,其他开发者则以此进行改变,开发了基于 Android 的 VINS-Mobile,感兴趣的可以搜索相关资料进行安装尝试。
8.1. 环境安装
VINS-Mono 运行在 ROS 下,因此需要提前安装好 ROS 环境。VINS-Mono 的作者实验系统为 Ubuntu 18.04,但是经过测试,其在 Ubuntu 18.04 上同样能够准确运行。
除 ROS 外,还有一些其他依赖库,例如 OpenCV 3.3.1、Eigen 3.3.3、Ceres、Pangolin 等,这些都是作者的实验环境,我们并不需要完全照搬这些环境,一般可以用版本略高一点的库进行实验。实际部署时,如果是在 Ubuntu 18.04 + ROS-Melodic 上,则可以使用 OpenCV 3.4.X(OpenCV 4.X.X 暂未测试)、Eigen 3.3.4、Ceres-Solver 1.14.0。在安装这些库时,如果遇到报错,我们可以根据报错信息安装相关缺失的内容;也可以在网络上搜索相关教程。
8.2. 项目编译
1 | # 创建 ROS 工作空间 |
8.3. 实验结果
下载 EuRoC MH_01_easy 数据包(.bag)文件:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
代码运行:
-
打开终端,运行如下指令启动 ROS:
1
roscore
-
打开第二个终端,进入项目工作空间,并运行主程序:
1
2
3cd YOUR_PROJECT_DIR/vins_mono_ws
source devel/setup.bash
roslaunch vins_estimator euroc.launch -
打开第三个终端,进入项目工作空间,运行可视化窗口的程序:
1
2
3cd YOUR_PROJECT_DIR/vins_mono_ws
source devel/setup.bash
roslaunch vins_estimator vins_rviz.launch -
打开第四个终端,进入项目工作空间,播放数据集:
1
2
3
4cd YOUR_PROJECT_DIR/vins_mono_ws
source devel/setup.bash
cd YOUR_DATASET_DIR
rosbag play MH_01_easy.bag
终端打开快捷键:Shift + Ctrl + T
8.4. 项目部署参考
8.5. 项目拓展
以上是 PC 版的 VINS-Mono 部署,感兴趣的可以深入尝试在 iOS 和 Android 上面的部署。
经过测试 iOS 在 iPhone 8P 上能正确运行,但在后续版本上由于缺乏相关参数,因此需要读者自行探索调整。iOS 版 VINS-Mobile:https://github.com/HKUST-Aerial-Robotics/VINS-Mobile(注意 iOS 开发目前只能使用 Xcode,因此需要使用 Mac 进行实验)
Android 版的 VINS-Mobile 原作者团队并没有开发,但是有开发者自行改造,推出了能运行于 Android 手机的 VINS-Mobile,此处给出一个配置参考教程:https://blog.csdn.net/baidu_31956557/article/details/127478374(注意 Android 的开发需要用到 Android Studio)
文献
- [1] Zhang J, Singh S. LOAM: Lidar odometry and mapping in real-time[C]//Robotics: Science and Systems. 2014, 2(9): 1-9.
- [2] Shan T, Englot B. Lego-loam: Lightweight and ground-optimized lidar odometry and mapping on variable terrain[C]//2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2018: 4758-4765.
- [3] Shan T, Englot B, Meyers D, et al. Lio-sam: Tightly-coupled lidar inertial odometry via smoothing and mapping[C]//2020 IEEE/RSJ international conference on intelligent robots and systems (IROS). IEEE, 2020: 5135-5142.
- [4] Xu W, Zhang F. Fast-lio: A fast, robust lidar-inertial odometry package by tightly-coupled iterated kalman filter[J]. IEEE Robotics and Automation Letters, 2021, 6(2): 3317-3324.
- [5] Mur-Artal R, Montiel J M M, Tardos J D. ORB-SLAM: a versatile and accurate monocular SLAM system[J]. IEEE transactions on robotics, 2015, 31(5): 1147-1163.
- [6] Mur-Artal R, Tardós J D. Orb-slam2: An open-source slam system for monocular, stereo, and rgb-d cameras[J]. IEEE transactions on robotics, 2017, 33(5): 1255-1262.
- [7] Campos C, Elvira R, Rodríguez J J G, et al. Orb-slam3: An accurate open-source library for visual, visual–inertial, and multimap slam[J]. IEEE Transactions on Robotics, 2021, 37(6): 1874-1890.
- [8] Qin T, Li P, Shen S. Vins-mono: A robust and versatile monocular visual-inertial state estimator[J]. IEEE Transactions on Robotics, 2018, 34(4): 1004-1020.
- [9] Lin J, Zheng C, Xu W, et al. RLIVE: A Robust, Real-Time, LiDAR-Inertial-Visual Tightly-Coupled State Estimator and Mapping[J]. IEEE Robotics and Automation Letters, 2021, 6(4): 7469-7476.
- [10] Lin J, Zhang F. RLIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package[C]//2022 International Conference on Robotics and Automation (ICRA). IEEE, 2022: 10672-10678.
- [11] Chen X, Milioto A, Palazzolo E, et al. Suma++: Efficient lidar-based semantic slam[C]//2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2019: 4530-4537.
- [12] Yu C, Liu Z, Liu X J, et al. DS-SLAM: A semantic visual SLAM towards dynamic environments[C]//2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2018: 1168-1174.
- [13] Bescos B, Fácil J M, Civera J, et al. DynaSLAM: Tracking, mapping, and inpainting in dynamic scenes[J]. IEEE Robotics and Automation Letters, 2018, 3(4): 4076-4083.
- [14] Zhang J, Henein M, Mahony R, et al. VDO-SLAM: a visual dynamic object-aware SLAM system[J]. arXiv preprint arXiv:2005.11052, 2020.
- [15] Tian Y, Chang Y, Arias F H, et al. Kimera-multi: Robust, distributed, dense metric-semantic slam for multi-robot systems[J]. IEEE Transactions on Robotics, 2022, 38(4).