自学视觉SLAM(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/是用户安装的程序

在这里插入图片描述

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

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

在这里插入图片描述
按照序号①②③操纵即可

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
最后保存注销重新登陆

这三种环境变量,①和②比较简单,这里便不在演示,这里着重演示以下③
在这里插入图片描述

在这里插入图片描述
用vim打开我们的PATH环境变量设置

在这里插入图片描述
在这里插入图片描述

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,该输⼊什么命令?

在这里插入图片描述
链接: 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/下。

首先我们理以下文件,清晰以下工程结构:
在这里插入图片描述

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

运行指令:

cd cmakebuild2
cmake ..
make
./sayHello

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

在这里插入图片描述

这里只做简单的运行演示,如果需要是自学小白需要从头看演示的
可以看此篇博客:

链接: link

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

在这里插入图片描述
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 …进行编译,编译结果如下:
在这里插入图片描述
可以编译出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 中的可执⾏⽂件链接到了哪些库?它们的名字是什么?
在这里插入图片描述
(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142386.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

(Mysql高级语句(进阶查询语句+数据库函数+连接查询))

Mysql高级语句(进阶查询语句MySQL数据库函数连接查询) 一、mysql查询语句1.1、 select ----显示表格中一个或数个字段的所有数据记录1.2、 distinct ----不显示重复的数据记录1.3、where ----有条件查询1.4、 and or ----且 或1.5 、in----显示已知的值的…

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…

Ipa Guard软件介绍:启动界面和功能模块全解析,保护你的iOS应用源码

ipaguard界面概览 ipaguard界面分左右2块:左边菜单导航栏,右边的功能区 左侧菜单:按模块分成启动界面,代码模块,文件模块,重签名与测试模块 右侧主功能区会随着功能变化,但是整体分3块&#xf…

防止员工拷贝公司终端电脑文件数据(如何防止企业数据文件被任意拷贝?)

在当前的信息时代,数据被誉为“新型石油”,而公司内部的文件往往是企业核心数据和竞争优势的重要载体。然而,近年来,员工私自拷贝公司内部文件的事件屡见不鲜,这不仅威胁到企业的信息安全,也可能导致公司的…

Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin

一、前言 异步编程在构建高性能 Web 应用中起着关键作用,而 FastAPI、Sanic、Tornado 都声称具有卓越的性能。本文将通过性能压测对这些框架与Go的Gin框架进行全面对比,揭示它们之间的差异。 原文:Python异步框架大战:FastAPI、Sa…

第77步 时间序列建模实战:多因素预测 vol-2(以ARIMA为例)

基于WIN10的64位系统演示 一、写在前面 上一期,我们构建了多变量的ARIMA时间序列预测模型,其实人家有名字的,叫做ARIMAX模型(X就代表解释变量)。 这一期,我们介绍其他机器学习回归模型如何建立多变量的时…

Windows10/11显示文件扩展名 修改文件后缀名教程

前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的,下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹,在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…

Lyapunov optimization 李雅普诺夫优化

文章目录 正文引言Lyapunov drift for queueing networks 排队网络的Lyapunov漂移Quadratic Lyapunov functions 二次李雅普诺夫函数Bounding the Lyapunov drift 李亚普诺夫漂移的边界A basic Lyapunov drift theorem 一个基本的李雅普诺夫漂移定理 Lyapunov optimization for…

全球与中国数字万用表市场:增长趋势、竞争格局与前景展望

数字万用表是一种标准诊断工具,用于测试电气设备中的电压、电流和电阻等电气值。它由带按钮的显示屏、刻度盘或旋转开关以及各种输入插孔(用于插入测试导线)组成。此外,与传统的指针式模拟仪表相比,数字式仪表具有更高…

C#程序中很多ntdll.dll、clr.dll的线程

VS中调试缓慢,如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。

算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

文章目录 83. 删除排序链表中的重复元素:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 83. 删除排序链表中的重复元素: 给…

Zookeeper-集群介绍与核心理论

Zookeeper集群 4.Zookeeper集群4.1) 介绍4.2) 核心理论 4.Zookeeper集群 4.1) 介绍 Leader选举: Serverid:服务器ID。比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大。Zxid:数据ID。服务器中存放的最大数据…

【1】ElementUI 组件实际应用===》按钮的使用

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。个人B站主页热爱技术的小郑 ,视频内容主要是对应文章的视频讲解形式。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘…

MySQL数据库入门到精通6--进阶篇(锁)

5. 锁 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

M1/M2芯片Parallels Desktop 19安装使用教程(超详细)

引言 在Window上VMware最强,在Mac上毫无疑问Parallels Desktop为最强! 今天带来的是最新版Parallels Desktop 19的安装使用教程。 1. 下载安装包 Parallels Desktop 19安装包:https://www.aliyundrive.com/s/ThB8Fs6D3AD Parallels Deskto…

羧基荧光素-氨基.盐酸盐,FAM-NH2.HCl,138589-19-2

产品简介:5-FAM-NH2.HCl(羧基荧光素-氨基.盐酸盐)其中异硫氰酸荧光素(FITC)具有比较高的活性,通常来说,在固相合成过程中引 入该种荧光基团相对于其他荧光素要更容易,并且反应过程中不需要加入活化试剂。可以用来修饰蛋白质、多肽以及其他活性基团材料或者小分子。 …

ASCII码-对照表

ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统,文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 3> 常用ASCII码 3.1> 【CR】‘\r’ 回车符 CR Carriage Re…

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…

液氮超低温保存法的原理

细菌保存是有效保存活体微生物群体,使细菌不死、不衰、不变,便于研究和应用。保存细菌的方法有很多。保存原理是利用干燥、低温、隔离空气的方法,降低微生物菌株的代谢速度,使菌株的生命活动处于半永久性休眠状态,从而…

【C++】手撕string(string的模拟实现)

手撕string目录: 一、 Member functions 1.1 constructor 1.2 Copy constructor(代码重构:传统写法和现代写法) 1.3 operator(代码重构:现代写法超级牛逼) 1.4 destructor 二、Other mem…