从零开始一起学习SLAM | 学习SLAM到底需要学什么?
可以看到涉及的知识面还是比较广的。这里放出一张SLAM圈子里喜闻乐见的表达悲喜交加心情的漫画图,大家可以感受一下:
每个学SLAM的小伙伴可以说都是冒着“头顶凉凉”的巨大风险,勇气可嘉。下面结合SLAM知识树展开具体说说。
编程环境
首先先说电脑环境和编程。
1、电脑环境:Linux环境,推荐Ubuntu16.04。
有人问Windows行不行?这么说吧,如果你是一位SLAM领域的大牛,并且具有超强的解决bug能力,你可以用Windows,否则,非常不建议在Windows下编译,因为你早晚会被各种依赖库,各种bug搞崩溃的。而且大部分的SLAM开源代码都在Linux环境下编译,很多第三方依赖库在Linux下可以非常方便的安装。
如果之前没有接触过Ubuntu的,也不用担心。刚开始用命令行界面可能不太习惯,慢慢习惯后就会发现Linux的内在美。所以要学SLAM就先装一个Ubuntu系统吧,如果电脑本身是Windows系统,建议装双系统,不要装虚拟机。学习Linux的话,就看那本经典的书:《鸟哥的Linux私房菜》吧,书的内容比较多,建议先学习一下基本的文档操作指令。可以快速浏览一遍,不需要死记,以后用到了再去查就行。这书的作者鸟哥有个网站也可以查命令,挺方便的:
http://cn.linux.vbird.org/linux_basic/1010index.php
2、编程相关
编程语言:
主要是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的基本操作;根据实践验证旋转矩阵的约束
下图是用于参考的代码框架:
参考输出如下,用于验证结果。
原文发布时间为:2018-09-10
本文作者:electech6

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
推荐 :2018最流行的编程语言Top 3
由于现在的编程语言种类繁多,决定用哪种语言来完成任务成了一项艰巨的任务。在决定「最佳」语言之前,你应该对包括个人喜好和备选语言在内的多个因素进行评估。 Bautista 有超过四年的 web 开发经验,目前正在向人们传授开发技巧。他说,「在 2018 年,为待处理的项目选择合适编程语言的最好方法是研究一下科技行业的动态。」 科技行业会提供一些重要的趋势和信号,你可以根据它们做决定。例如,如果你知道 2018 年最赚钱或最流行的编程语言,你就可以做出适当的调整,多关注一下这些编程语言。 我们在本文中根据一些资源进行了评估,提出了 2018 年最热的三种编程语言。 1. JavaScript JavaScript 是一种动态编程语言,常用于增加网站的交互性。 人们一般认为这是一种「初学者友好」的语言,这种特性增加了 JavaScript 在开发者社区中的使用量。 Stack Overflow 是一个很流行的网站,开发人员使用该网站分享技术方面的内容。该网站会进行年度调查,从开发者社区中得到一些有用的统计数据,数据从开发者的工资到他们最喜欢的技术都有涉及。 2018 年 1 月,该网站调查了...
- 下一篇
C语言初学者必须掌握的关键字!
其实小伙伴在写代码的时候,关键字还是用的比较多的,老九主要就平常中用到的常用关键字进行总结,便于小伙伴们更全面的理解其在代码中的意图。 C语言关键字总结 static关键字C语言 const关键字C语言 register关键字用法 auto关键字 inline内联函数 static关键字 static可以用来修饰局部变量、全局变量、函数 1、局部变量: 生命周期:原先存在栈中,生命周期语句执行完毕便结束了。现在存放到静态数据区,生命周期持续到整个程序执行结束。 作用域:并没有改变作用域,还是仅限于该语句块。并且只在初次运行的时候进行初始化,下次调用时它的值是上一次函数调用结束之后的值。每次调用后值会被保存。 例如: 输出结果: 2、全局变量: 对于一个全部变量,既可以在本源文件中被访问到,也可以在同一个工程的其它源文件中被访问(只需用extern进行声明即可)。 如果加上static,限制该全局变量的作用域范围,由原来的整个工程可见变为本源文件可见。 3、函数: 与修饰全局变量大同小异,就是改变了函数的作用域。 修饰函数时还有一处不同,就是调用静态函数时,函数指针指向的地址始终是固定的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7设置SWAP分区,小内存服务器的救世主