从零开始一块儿学习SLAM | 学习SLAM到底须要学什么?

 

 

SLAM涉及的知识面很广,我简单总结了 “SLAM知识树” 以下所示:php

 


(公众号菜单栏回复 “树” 可得到清晰版)python

能够看到涉及的知识面仍是比较广的。这里放出一张SLAM圈子里喜闻乐见的表达悲喜交加心情的漫画图,你们能够感觉一下: linux

 


每一个学SLAM的小伙伴能够说都是冒着“头顶凉凉”的巨大风险,勇气可嘉。下面结合SLAM知识树展开具体说说。git

编程环境
首先先说电脑环境和编程。github

一、电脑环境:Linux环境,推荐Ubuntu16.04。算法

有人问Windows行不行?这么说吧,若是你是一位SLAM领域的大牛,而且具备超强的解决bug能力,你能够用Windows,不然,很是不建议在Windows下编译,由于你迟早会被各类依赖库,各类bug搞崩溃的。并且大部分的SLAM开源代码都在Linux环境下编译,不少第三方依赖库在Linux下能够很是方便的安装。编程

若是以前没有接触过Ubuntu的,也不用担忧。刚开始用命令行界面可能不太习惯,慢慢习惯后就会发现Linux的内在美。因此要学SLAM就先装一个Ubuntu系统吧,若是电脑自己是Windows系统,建议装双系统,不要装虚拟机。学习Linux的话,就看那本经典的书:《鸟哥的Linux私房菜》吧,书的内容比较多,建议先学习一下基本的文档操做指令。能够快速浏览一遍,不须要死记,之后用到了再去查就行。这书的做者鸟哥有个网站也能够查命令,挺方便的:vim

http://cn.linux.vbird.org/linux_basic/1010index.php数据结构

二、编程相关框架

编程语言:

主要是C++。推荐红宝书《C++ Primer》。内容很是多而全。若是是初学者没那么多时间学一遍,就重点选择前几章基础看看,动手敲一敲代码。而后了解后面几章经常使用的数据结构和C++的一些特性(重载、多态、继承)等。有时候也须要会一些python,网上资料不少,很少说。

集成开发环境:

CLion(用edu结尾邮箱能够申请无偿使用一年)、kdevelop(免费),我的以为前者好用一点。

编译工具:

cmake。统一使用cmake编译,好处不少,好比代码能够很方便的跨平台使用等。使用起来也很方便。有个小册子《CMake practice》照着学一下。

文档编辑:

有不少,好比gedit、Nano、vim等。

第三方函数库:

使用到的第三方库主要包括:OpenCV(计算机视觉),OpenGL(计算机图形学),Eigen(几何变换),Sophus(李代数),Ceres(非线性优化),G2o(图优化)等。

数学

 


主要是大学里学的:线性代数、几率论和微积分。虽然不少人大学里学的早都还给老师了,不过也不用太担忧,SLAM里也不须要很是难的数学问题。主要包括:

矩阵的性质。好比矩阵乘法、求逆、矩阵分解(SVD,QR,Cholesky)、反对称矩阵等。

李群李代数。这个可能不少人之前没接触过,也是挺重要的,不太高翔的十四讲里也讲的比较详细了,仔细推一下公式。

非线性优化问题。好比梯度降低、牛顿法、高斯-牛顿法、LM算法、bundle adjustment等。

此外,还有泰勒展开,求(偏)导,积分等。

计算机视觉相关
SLAM里涉及不少图像处理、计算机视觉知识,总结一下主要有:

相机相关:单目、双目、RGB-D等相机的物理参数意义、相机成像模型、相机的标定、去畸变等。双目的话还涉及到视差计算,RGB-D的话涉及到RGB和depth图像的对齐等。

图像处理相关。好比和特征点相关的有:特征点描述子、特征点提取、特征点匹配。图像梯度计算、边缘检测、直线检测等。

多视角几何相关。好比对极约束、本质矩阵、单应矩阵、光流估计、三角化等。

 


英语
学习SLAM必须具有必定的英语阅读能力。由于SLAM相关的大部分资料(论文、书籍、技术文档等)都是英文的。不过即便英文很差也不用太担忧,利用好查单词软件,遇到不认识的 就去查,时间长了也就都混的“脸熟”了,英语阅读速度和理解能力也会逐渐提高。

开源代码
虽然SLAM比较难,可是使人欣慰的是,SLAM领域有不少优秀的开源代码能够学习。列举几个主流的以下:

稀疏法:

ORB-SLAM2:支持单目,双目,RGB-D相机

https://github.com/raulmur/ORB_SLAM2

半稠密法:

LSD-SLAM:支持单目,双目,RGB-D相机

https://vision.in.tum.de/research/vslam/lsdslam

DSO:单目

https://vision.in.tum.de/research/vslam/dso

稠密法

Elastic Fusion:RGB-D相机

https://github.com/mp3guy/ElasticFusion

BundleFusion:RGB-D相机

https://github.com/niessner/BundleFusion

RGB-D SLAM V2:RGB-D相机

https://github.com/felixendres/rgbdslam_v2

多传感器融合:

VINS:单目 + IMU(惯性测量单元)

https://github.com/HKUST-Aerial-Robotics/VINS-Mono

OKVIS:(单目、双目、四目)+ IMU

https://wp.doc.ic.ac.uk/sleutene/2016/02/04/release-of-okvis-open-keyframe-based-visual-inertial-slam/

数据集
主要列举几个主流的数据集

1、TUM RGB-D SLAM Dataset and Benchmark

 


德国慕尼黑理工大学计算机视觉组制做的数据集,使用Kinect相机采集的数据集,包括IMU数据,而且用高精度运动采集系统提供了groundtruth(真值)。提供测试脚本,能够方便的实现量化评估。

https://vision.in.tum.de/data/datasets/rgbd-dataset

2、KITTI Vision Benchmark Suite

 


德国卡尔斯鲁厄理工学院和丰田工业大学芝加哥分校一块儿合做制做的用于自动驾驶的数据集。

使用一辆改装的汽车采集,该车配备了两台高分辨率彩色和灰度摄像机,还有Velodyne激光扫描仪和GPS定位系统,用来提供精确的groundtruth。主要采集区域是卡尔斯鲁厄市区、农村地区和高速公路。提供测试脚本能够方便的实现量化评估。

http://www.cvlibs.net/datasets/kitti/

3、EuRoC MAV Dataset

 


苏黎世联邦理工大学制做的数据集,采用装备了双目相机和IMU的四旋翼无人机采集数据,使用高精度运动采集系统提供了groundtruth。提供测试脚本,能够方便的实现量化评估。

https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets

做业
题目1

咱们知道SLAM是处理序列图像的,有时候须要格式化的图像名字用做输入。前面提到的TUM的RGB-D数据集中图像是根据时间命名的,请从下面连接下载数据集fr1/desk

https://vision.in.tum.de/data/datasets/rgbd-dataset/download#

并解压。请编程实现将文件夹/rgb下以时间命名的序列图片从新命名为0000-9999的格式。

本程序学习目的:

熟悉cmake的使用、OpenCV读写操做、C++的string操做

题目2

已知相机的位姿用四元数表示为q=[0.35,0.2,0.3,0.1],顺序为x,y,z,w,请编程实现:

输出四元数对应的旋转矩阵、旋转矩阵的转置,旋转矩阵的逆矩阵,旋转矩阵乘以自身的转置,验证旋转矩阵的正交性。

本程序学习目的:

熟悉cmake的使用、学习eigen的基本操做;根据实践验证旋转矩阵的约束

下图是用于参考的代码框架:

 


参考输出以下,用于验证结果。

 


欢迎留言讨论,或者在公众号:计算机视觉life菜单栏进入知识星球「从零开始学习SLAM」一块儿学习交流(有参考答案)~

相关阅读
从零开始一块儿学习SLAM | 为何要学SLAM?

零基础小白,如何入门计算机视觉?

原文连接更精彩:从零开始一块儿学习SLAM | 学习SLAM到底须要学什么?--------------------- 做者:electech6 来源:CSDN 原文:https://blog.csdn.net/electech6/article/details/82597882 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索