• 自学视觉SLAM(1)


    引言

    在这里插入图片描述

    小编研究生的研究方向是视觉SLAM,目前在自学,本篇文章为初学高翔老师课的第一次作业。


    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

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4

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

    在这里插入图片描述

    这里只做简单的运行演示,如果需要是自学小白需要从头看演示的,可以看我写的一篇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
    
    • 1

    在这里插入图片描述
    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

    最后一道题运行ORB_SLAM2,因为内容过多,我分别以两篇博客单独写了
    链接: 保姆教程教你如何使用自己的视频运行ORB-SLAM2
    链接: 保姆教程教你如何使用摄像头运行ORB-SLAM2

  • 相关阅读:
    idea docker插件安装及使用
    .NET混合开发解决方案16 管理WebView2的用户数据
    链动2+1模式简单,奖励结构丰厚,自主裂变?
    2023上海应用技术大学计算机考研信息汇总
    Springboot 就这样读配置,全部都整理好了
    【Hack The Box】linux练习-- Valentine
    Web3 新手攻略:9 个不可或缺的 APP 助力你踏入加密领域
    基于图搜索的规划算法之A*家族(三):Anytime A*算法
    MySQL导入/导出数据
    云计算就业方向及前景怎么样
  • 原文地址:https://blog.csdn.net/qq_57425280/article/details/133166141