自学视觉SLAM(1)

引言

自学视觉SLAM(1)_第1张图片

小编研究生的研究方向是视觉SLAM,目前在自学,已经学了Linux系统的基本操作,vim编辑器以及高翔老师的一些视屏。本篇文章为初学笔记。

文章目录

  • 引言
  • 1 熟悉 Linux
    • 1.1 如何在 Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅?
    • 1.2 linux 的环境变量是什么?我如何定义新的环境变量?
    • 1.3 linux 根⽬录下⾯的⽬录结构是什么样的?⾄少说出 3 个⽬录的⽤途。
    • 1.4 假设我要给 a.sh 加上可执⾏权限,该输⼊什么命令?
    • 1.5 假设我要将 a.sh ⽂件的所有者改成 xiang:xiang/root,该输⼊什么命令?
  • 2 SLAM 综述文献阅读
    • 2.1 SLAM 会在哪些场合中⽤到?⾄少列举三个⽅向。
    • 2.2 SLAM 中定位与建图是什么关系?为什么在定位的同时需要建图?
    • 2.3 SLAM 发展历史如何?我们可以将它划分成哪⼏个阶段?
    • 2.4 列举三篇在 SLAM 领域的经典⽂献。
  • 3 CMake 练习
    • 3.1书写⼀个由 cmake 组织的 C++ ⼯程,要求如下:
  • 4 理解 ORB-SLAM2 框架


1 熟悉 Linux

1.1 如何在 Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅?

可以使用 sudo apt install XXX
普通安装:sudo apt-get install XXX
修复安装:sudoapt-get -f install XXX
重新安装:sudo apt-get -f reinstall XXX

在linux中文件与软件一般都是安装在到/usr/share和/usr/local中了,如果我们需要查看软件安装路径linux为我们提供了查看命令,whereis就可以帮我查找文件安装路径在哪里了,which可以查询在哪里运行。

/usr/下系统自带的程序,/usr/local/是用户安装的程序

自学视觉SLAM(1)_第2张图片

1.2 linux 的环境变量是什么?我如何定义新的环境变量?

环境变量,就是存在当前环境中的变量,无论是Linux还是Windows,都有环境变量。比如,最常用的环境变量PATH,JAVA_HOME。Windows下的环境变量如图所示.

自学视觉SLAM(1)_第3张图片
按照序号①②③操纵即可

Linux下的环境变量可以用以下命令查看:

①定义环境变量: export OUTDIR=/opt export可以认为是导出的意思 OUTDIR是环境变量的名字,然后加上一个值,这个值是一个路径
②显示环境变量: echo $OUTDIR或者echo $OUTDIR/si ,可以用echo将它显示出来,或者用在一个字符串里也可以
③查看所有环境变量: printenv

环境变量可以在当前终端中使用,也可以在一个脚本里面执行的时候直接调用,但是环境变量的范围仅仅局限于当前这个终端环境中,将它关闭或是重开一个都是没有的。

环境变量更加细分如下:
①用户环境变量:就是对当前用户有效的那些环境变量。定义在~/.profile中(在有的Linux系统中定义在.bash_profile中),其在主目录下,是一个隐藏文件,直接使用ls命令无法查看,需要使用ls -la查看,a表示all,显示所有文件。在Linux下,以.开头的文件为隐藏文件。
我们可以用vim查看,输入命令行:vim .profile,进入后我们可以添加环境变量,比如我们添加一个,输入export JAVA_HOME=/opt/jdk1.8(路径不存在没有关系),然后保存关闭保存后我们需要注销一下才可以生效。

②系统环境变量:用户环境变量只对当前用户有效,如果想定义一个变量对所有用户都有效的话,需要系统环境变量。系统环境变量定义在/etc/profile中,想要执行必须以root超级用户来执行。同样的,输入命令vim /etc/profile进入,但是一般不直接修改/etc/profile,而是在/etc/profile.d/ 创建一个自定义的脚本。
以下命令为演示:
vim /etc/profile.d/myprofile.sh 用vim创建一个脚本
export TOMCAT=/opt/tomcat 定义环境变量,然后保存,注销并重新登陆

③PATH环境变量:最常见的一个环境变量,用于描述可执行程序的搜索路径
echo $PATH 查看当前的PATH环境变量(为一堆路径,多个路径之间以:分割)
1.编辑/etc/profile.d/myprofile.sh
设定PATH环境变量
export PATH=$PATH:/opt/tomcat/bin
最后保存注销重新登陆

这三种环境变量,①和②比较简单,这里便不在演示,这里着重演示以下③
自学视觉SLAM(1)_第4张图片

自学视觉SLAM(1)_第5张图片
用vim打开我们的PATH环境变量设置

自学视觉SLAM(1)_第6张图片
自学视觉SLAM(1)_第7张图片

1.3 linux 根⽬录下⾯的⽬录结构是什么样的?⾄少说出 3 个⽬录的⽤途。

/bin 二进制可执行命令。该目录下存放着普通用户的命令
/dev 系统的设备文件,即设备的驱动程序
/home 用户主目录的基点
/lost-found 这个目录平时是空的,当系统非正常关机而留下的“无家可归”的文件便会储存在这里
/misc 储存着一些特殊的字符的定义
/net 存放着和网络相关的一些文件
/proc 存放着用户与内核的交互信息
/sbin 系统的管理命令,这里存放的是系统管理员使用的程序
/srv 系统启动服务时可以访问的数据库目录
/tmp 临时文件,重启后自动清空
/var 某些大文件的溢出区,比如各种服务的日志文件
/boot 启动linux的核心文件
/etc 系统所有的配置文件都在这个目录中
/lib 存放着和系统运行相关的库文件
/media 存放着可移除的设备,比如软盘,光盘
/mnt 挂载目录,是系统管理员临时安装文件的系统安装点
/opt (option : 自由选择)主要给源码安装软件时选择的安装目录位置
/root 超级用户的目录
/selinux 主要用来加固操作系统,提高系统的安全性
/sys 管理设备文件
/usr 最大的目录,存放着应用程序和文件

1.4 假设我要给 a.sh 加上可执⾏权限,该输⼊什么命令?

chmod a+w a.sh 所有人all添加w权限
chmod a-w a.sh 所有人减去w权限
chmod u+w a.sh仅用户suer自己的权限 +w
chmod o-w a.sh 修改别人other的权限-w
chmod +w a.sh 同下
chmod -w a.sh 前面不写的话是默认修改自己和本组的权限

链接: link如果大家想看更具体的,可以看我之前写过的博客,此为连接

1.5 假设我要将 a.sh ⽂件的所有者改成 xiang:xiang/root,该输⼊什么命令?

自学视觉SLAM(1)_第8张图片
链接: link如果大家想看更具体的,可以看我之前写过的博客,此为连接

2 SLAM 综述文献阅读

2.1 SLAM 会在哪些场合中⽤到?⾄少列举三个⽅向。

1.手持设备定位
2.自动驾驶定位
3.AR(增强现实)

2.2 SLAM 中定位与建图是什么关系?为什么在定位的同时需要建图?

定位是为了精确地确定当前设备在某个环境中的姿态和位置;建图将周围环境的观测部分整合到一个单一的模型中。最初定位和建图是两个相互独立的关系,后来发现这两个步骤是相互依赖的。建图的准确性依赖于定位精度,而定位的实现又离不开精确的建图。

SLAM强调在未知环境下进行整个过程,如果在未知环境下进行定位,首先需要能够识别并理解周围的环境。再利用环境中的外部信息作为定位的基准,所以需要对所处的环境进行建图。

2.3 SLAM 发展历史如何?我们可以将它划分成哪⼏个阶段?

定位与建图(Simultaneous localization and mapping,SLAM)技术最早由 Randall C. Smith 和Peter Cheeseman 于 1986 年提出,后经 Leonard 等扩充.
Cadena 将 SLAM 的 发 展 分 为 两 个阶段:古 典 时 代 ( 1986—2004 年 ) 与 算 法 分 析 时 代( 2004—2015 年).

在 古 典 时 代,SLAM 算 法 处 于probabilistic SLAM 阶段,算 法 包 括 扩 展 卡 尔 曼 滤 波(
extended Kalman filter, EKF ) 、 Rao-Blackwellized 粒子滤 波、 以 及 最 大 似 然 估
计 等。
2007 年, Davison 等提 出 了 MonoSLAM, 这 是 第 一 个 实 时 的 视 觉SLAM系统,以一个单目相 机 作 为 输 入,实 现 对 相 机位置 的 定 位, 并 构 建 由 高 质 量 特 征 构 成 的 稀 疏 3D地图。同 年, Klein等提 出 了 PTAM, 将 位 置 估 计 ( tracking ) 与 建 图( mapping)并行运行,以提高运行效率。
2014 年,Forster 等提 出了 SVO,采用半直接法,具 有 极 高 的 运 行 速 度,但 该方法 只 实 现 了 视 觉 里 程 计 的 功 能。
2015 年, Mur-Artal 等提 出 了 ORB-SLAM, 使 用 了FAST 角 点以 及 ORB ( orientedbrief) 描述子[,使系统具有更高的运行速度。
2017 年,Mur-Artal等进一步提出了 ORB-SLAM2,支持了双目以及 RGB-D 摄像机模式,并加入全局优化、纯定位模式 等 改 进。
2020年,Zubizarreta 等提 出 了 基 于 直 接 法 的 完 整 单 目SLAM 系统 DSM,具 有 优 秀 的 速 度 与 精度。

参考文献:
[1]曾庆化,罗怡雪,孙克诚,等. 视觉及其融合惯性的SLAM技术发展综述[J]. 南京航空航天大学学报,2022,54(6):1007-1020. DOI:10.16356/j.1005-2615.2022.06.002.
[2]高翔,张涛,刘毅,等 . 视觉 SLAM 十四讲:从理论到实践[M]. 北京:电子工业出版社,2019.
[3]万泽宇,丁朝阳,王怡阳,等. 同步定位与建图技术的发展现状[J]. 微纳电子与智能造,2022,4(2):22-45. DOI:10.19816/j.cnki.10-1594/tn.2022.02.022.

2.4 列举三篇在 SLAM 领域的经典⽂献。

[1] 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.

[2] Davison A J, Reid I D, Molton N D, et al. MonoSLAM: Real-time single camera SLAM[J]. IEEE transactions on pattern analysis and machine intelligence, 2007, 29(6): 1052-1067.

[3] Durrant-Whyte H, Bailey T. Simultaneous localization and mapping: part I[J]. IEEE robotics & automation magazine, 2006, 13(2): 99-110.

3 CMake 练习

3.1书写⼀个由 cmake 组织的 C++ ⼯程,要求如下:

  1. include/hello.h 和 src/hello.c 构成了 libhello.so 库。 hello.c 中提供⼀个函数 sayHello(),调⽤此函数时往屏幕输出⼀⾏“Hello SLAM”。
  2. ⽂件 useHello.c 中含有⼀个 main 函数,它可以编译成⼀个可执⾏⽂件,名为“sayhello”。
  3. 默认⽤ Release 模式编译这个⼯程。
  4. 如果⽤户使⽤ sudo make install,那么将 hello.h 放⾄/usr/local/include/下,将 libhello.so 放
    ⾄/usr/local/lib/下。

首先我们理以下文件,清晰以下工程结构:
自学视觉SLAM(1)_第9张图片

include中放头文件,src中放源文件。

运行指令:

cd cmakebuild2
cmake ..
make
./sayHello

输入以下指令即可运行出Hello SLAM!

自学视觉SLAM(1)_第10张图片

这里只做简单的运行演示,如果需要是自学小白需要从头看演示的,可以看我写的一篇cmake的使用教程,包括两部分内容,一部分是简单的直接编译,另一种是稍微复杂的包含库的。
链接如下:
链接: cmake使用

4 理解 ORB-SLAM2 框架

  1. 从 github.com 下载 ORB-SLAM2 的代码。地址在: https://github.com/raulmur/ORB_SLAM2.
    提⽰:在安装 git 之后,可以⽤ git clone https://github.com/raulmur/ORB_SLAM2 命令下载
    ORB-SLAM2。下载完成后,请给出终端截图。

命令:

git clone https://ghproxy.com/https://github.com/raulmur/ORB_SLAM2

自学视觉SLAM(1)_第11张图片
2. 此时我们不着急直接运⾏ ORB-SLAM2,让我们⾸先来看它的代码结构。 ORB-SLAM2 是⼀个
cmake ⼯程,所以可以从 CMakeLists.txt 上⾯来了解它的组织⽅式。阅读 ORB-SLAM2 代码⽬录
下的 CMakeLists.txt,回答问题:
(a) ORB-SLAM2 将编译出什么结果?有⼏个库⽂件和可执⾏⽂件?
(b) ORB-SLAM2 中的 include, src, Examples 三个⽂件夹中都含有什么内容?
© ORB-SLAM2 中的可执⾏⽂件链接到了哪些库?它们的名字是什么?

(a) ORB-SLAM2 将编译出什么结果?有⼏个库⽂件和可执⾏⽂件?
使用cmeke …进行编译,编译结果如下:
自学视觉SLAM(1)_第12张图片
可以编译出5个可执行文件和1个库文件。

凡是有add_library的都是库文件
1.只有一个,在CMakeLists.txt的第51-71行

` 凡是有add_executable的都是可执行文件 阅读文件可知
1.add_executable(rgbd_tum Examples/RGB-D/rgbd_tum.cc)
2.add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc)
3.add_executable(stereo_euroc Examples/Stereo/stereo_euroc.cc)
4.add_executable(mono_tum Examples/Monocular/mono_tum.cc)
5.add_executable(mono_kitti Examples/Monocular/mono_kitti.cc)
6.add_executable(mono_euroc Examples/Monocular/mono_euroc.cc)

(b) ORB-SLAM2 中的 include, src, Examples 三个⽂件夹中都含有什么内容?

include下是20个头文件。src下是19个源文件。
include文件夹包含:对应src中程序的代码函数头文件
src文件夹包含:相应程序的代码函数的c++文件
Examples文件夹包含:对应不同类别的相机的主程序,包含单目,RGBD,双目以及ROS,编译通过之后可执行文件会存放在这些文件夹中;

© ORB-SLAM2 中的可执⾏⽂件链接到了哪些库?它们的名字是什么?
自学视觉SLAM(1)_第13张图片
(1)OPENCV_LIBS

(2)EIGEN3_LIBS

(3)Pangolin_LIBRARIES

(4)/ORB-SLAM2/Thirdparty/DBoW2/lib/libDBoW2.so

(5)/ORB-SLAM2/Thirdparty/g2o/lib/libg2o.so

你可能感兴趣的:(视觉SLAM,github,vim,ubuntu,c++)