视觉SLAM理论与实践1

视觉SLAM理论与实践1-概述与预备知识-附代码链接

    • 一、熟悉Linux
    • 二、SLAM综述文献阅读
    • 三、CMAKE练习
    • 四、理解ORB-SLAM2框架
    • 五、使用摄像头或视频运行 ORB-SLAM2

一、熟悉Linux

参考资料:《鸟哥的Linux私房菜》,Ubuntu wiki

1.1 如何在Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅?
答:安装软件常用的方式有如下两种:
1)apt-get 方式的安装;
普通安装:sudo apt-get install XXX (包名)
修复安装:sudo apt-get -f install XXX
重新安装:sudo apt-get -f reinstall XXX
(例如安装g++编译环境,可在终端中输入命令:sudo apt-get install g++,附加说明可
通过g++ -v命令查看g++版本)
2)dpkg方式安装
sudo dpkg -i package_name.deb
安装后软件默认位置 /usr/share
1.2 linux 的环境变量是什么?我如何定义新的环境变量?
环境变量:环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或多个应用程序将使用到的信息;它分为永久生效和shell临时生效两种。
1)对所有用户生效的永久性变量(系统级):
这类变量对系统内的所有用户都生效,所有用户都可以使用这类变量。作用范围是整个系统。
设置方式: 用vim 或者gedit 打开/etc/profile 文件,然后添加我们想要的环境变量,用export指令添加环境变量。这个文件只有在root(超级用户)下才能修改。我们可以在etc目录下使用ls -l查看这个文件的用户及权限。以gedit为例:
$ gedit /etc/profile
$ export 新增环境变量
:添加完成后新的环境变量不会立即生效,需要source /etc/profile 该文件才会生效。否则只能在下次重进此用户时才能生效。记住要在终端source一下。。。
2)对当前用户生效的永久性变量(用户级):
只针对当前用户,和上面的一样,只不过不需要在etc 下面进行添加,直接在.bash_profile文件最下面用export添加就好了。
这里 .bashrc和.bash_profile原则上来说设置此类环境变量时在这两个文件任意一个里面添加都是可以的。
~/.bash_profile是交互式login方式进入bash shell运行。
~/ .bashrc是交互式non-login方式进入bash shell运行。
二者设置大致相同。
.bash_profile文件只会在用户登录的时候读取一次;而.bashrc在每次打开终端进行一次新的会话时都会读取。
3)临时有效的环境变量(只对当前shell有效):
此类环境变量只对当前的shell有效。当我们退出登录或者关闭终端再重新打开时,这个环境变量就会消失,是临时的,可以直接使用export指令添加。
$ export 新增环境变量
1.3 linux 根⽬录下⾯的⽬录结构是什么样的?⾄少说出3 个⽬录的⽤途。
根目录一般结构如下:(以本人笔记本目前ubuntu16.04系统为例,截图如下)
以本人笔记本目前ubuntu16.04系统为例1)/bin 用户二进制文件
包含二进制可执行文件,系统所有用户可执行文件都在这个文件夹里,例如:ls,cp,ping等。
2)/sbin 系统二进制文件
包含二进制可执行文件,但只能由系统管理员运行,对系统进行维护。
3)/etc 配置文件
包含所有程序配置文件,也包含了用于启动/停止单个程序的启动和关闭shell脚本。
4)/dev 设备文件
包含终端所有设备,USB或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0
5)/proc 进程信息
包含系统进程的相关信息。
这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid}目录中包含的与特定pid相关的信息。
6)/var 变量文件
可以找到内容可能增长的文件。这包括 - 系统日志文件(/var/log);包和数据库文件(/var/lib);电子邮件(/var/mail);打印队列(/var/spool);锁文件(/var/lock);多次重新启动需要的临时文件(/var/tmp);
7)/tmp 临时文件
包含系统和用户创建的临时文件。当系统重新启动时,这个目录下的文件都将被删除。
8)/usr 用户程序
包含二进制文件、库文件、文档和二级程序的源代码。
/usr/bin 中包含用户程序的二进制文件。如果你在/bin 中找不到用户二进制文件,到/usr/bin目录看看。例如:at、awk、cc、less、scp。
/usr/sbin 中包含系统管理员的二进制文件。如果你在/sbin 中找不到系统二进制文件,
到/usr/sbin目录看看。例如:atd、cron、sshd、useradd、userdel。
/usr/lib中包含了/usr/bin和/usr/sbin用到的库。
/usr/local 中包含了从源安装的用户程序。例如,当你从源安装Apache,它会在/usr/local/apache2中。
9)/home HOME目录
所有用户用来存档他们的个人档案。
10)/boot 引导加载程序文件
包含引导加载程序相关的文件。内核的initrd、vmlinux、grub文件位于/boot下。
11)/lib 系统库
包含支持位于/bin和/sbin下的二进制文件的库文件,库文件名为 ld或lib.so.*
12)/opt 可选的附加应用程序
opt代表opitional;包含从个别厂商的附加应用程序。附加应用程序应该安装在/opt/或者/opt/的子目录下。
13)/mnt 挂载目录
临时安装目录,系统管理员可以挂载文件系统。
14)/media 可移动媒体设备
用于挂载可移动设备的临时目录。
举例来说,挂载CD-ROM的/media/cdrom,挂载软盘驱动器的/media/floppy;
15)/srv 服务数据
srv代表服务。包含服务器特定服务相关的数据。例如,/srv/cvs包含cvs相关的数据。
1.4 假设我要给a.sh 加上可执⾏权限,该输⼊什么命令?
chmod 777 +文件名: 将文件设置成对拥有者、组成员、其他人可读、可写、可执行。
chmod a+x +文件名 :将文件在原来的配置上增加可执行权限。
2.5假设我要将a.sh ⽂件的所有者改成xiang:xiang,该输⼊什么命令?
chown xiang:xiang a.sh

二、SLAM综述文献阅读

2.1 SLAM会在哪些场合中用到?至少列举三个方向。
增强现实、移动机器人的自主导航与定位、无人驾驶、多机器人协作
2.2 SLAM中定位与建图是什么关系?为什么在定位的同时需要建图?
定位:机器人必须知道自己在环境中的位置;
建图:机器人必须记录环境中特征(或路标点)的信息;(可根据自身定位信息建造地图)
机器人在位置环境中从一个位置环境开始移动,在移动过程中根据位置估计和地图构建进行自身定位,同时在自身定位的基础上建造增量式地图,实现机器人的自主定位和导航。准确的地图构建需要准确的位置信息,它们之间存在很强的耦合关系。
2.3 SLAM发展历史如何?我们可以将它划分成哪⼏个阶段?
1)第一阶段:定位和建图分开研究的阶段;
2)第二阶段:定位和建图在一起进行研究的阶段;
3)第三阶段:开始运用摄像头的阶段(之前由于计算机视觉的发展还不太到位,因此之前基本都是基于激光测距方法)
4)第四阶段:多元化的阶段(也就是目前阶段,考虑多传感器融合slam,视觉+激光+imu等等)
2.4 列举三篇在 SLAM 领域的经典文献。
Orb-SLAM2:
Mur-Artal R , Tardos J D . ORB-SLAM2: An Open-Source SLAM System for Monocular,Stereo, and RGB-D Cameras[J]. IEEE Transactions on Robotics, 2017:1-8.
dso:
Forster C , Pizzoli M , Davide Scaramuzza∗. SVO: Fast Semi-Direct Monocular Visual Odometry[C]// IEEE International Conference on Robotics and Automation (ICRA),Hong Kong, 2014. IEEE, 2014.
vins-mono:
Qin Tong, Li Peiliang, Shen Shaojie. VINS-Mono: A Robust and Versatile MonocularVisual-Inertial State Estimator[J]. IEEE Transactions on Robotics:1-17.
此外还有Okvis,msckf等为人熟知的开源框架。

三、CMAKE练习

1)在原有基础上添加lib和src以及build文件夹,其中cmake-build-debug文件是调试工具Clion产生的中间文件,不用管它。
在这里插入图片描述
2)再将hello.cpp和hello.h放置在lib文件夹中,注意我这里将hello.c改成了
hello.cpp,否则编译通不过。
在这里插入图片描述
在lib文件夹中新建CMakeLists.txt内容如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_LIBRARY(hello SHARED hello.cpp)#添加hello的动态库
INSTALL(FILES hello.h DESTINATION ~/catkin_ws/src/test0
/pa1/code/build/lib) #这里主要讲hello的头文件安装到build/lib
文件夹中,方便后续包含头文件

3)usehello.cpp放置到src文件夹中,并在src文件夹中新建CMakeLists.txt
在这里插入图片描述CMakeLists.txt内容如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
INCLUDE_DIRECTORIES(~/catkin_ws/src/test0/pa1/code/build/
lib)#包含头文件所在的目录
ADD_EXECUTABLE(sayhello useHello.cpp)#通过usehello.c生成
可执行程序
TARGET_LINK_LIBRARIES(sayhello hello)#链接hello库

返回上一层code目录,新建CMakeLists.txt内容如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_SUBDIRECTORY(lib)#添加子目录lib
ADD_SUBDIRECTORY(src bin)#添加子目录src,并设置目标二进制文件的生成位置

终端进入新建的build文件夹,并编译
mkdir build
cd build
cmake …
sudo make install

编译成功后终端截图如下:
视觉SLAM理论与实践1_第1张图片
build/bin中会生成可执行文件sayhello,终端输入命令执行它
./sayhello

打印结果如下:
视觉SLAM理论与实践1_第2张图片
运行代码详见 视觉SLAM理论与实践1-cmake练习

四、理解ORB-SLAM2框架

4.1 从github.com 下载ORB-SLAM2 的代码
终端输入命令git clone https://github.com/raulmur/ORB_SLAM2.git
下载下来后,截图如下:
在这里插入图片描述
4.2 阅读ORB-SLAM2 代码⽬录下的CMakeLists.txt
a) ORB-SLAM2 将编译出什么结果?有⼏个库⽂件和可执⾏⽂件?
将orb-slam2编译一下(由于我电脑之前跑通过orb-slam2所以中间的一些依赖项的安装过程就省略了,这里我新建了一个工作空间,将源码git下来之后直接在终端输入如下命令,linux环境下编译顺利通过了,ros环境下编译这一不还没涉及到。。。)
cd ORB_SLAM2
chmod +x build.sh
./build.sh

截图如下:
视觉SLAM理论与实践1_第3张图片
编译完成之后ORB-SLAM2文件夹下会生成的库文件3有:
1) lib/libORB_SLAM2.so
2) Thirdparty/g2o/lib /libg2o.so
3) Thirdparty/DBoW2/lib/libDBoW2.so

可执行文件有6个:
1) Examples/Monocular/mono_euroc
2)Examples/Monocular/mono_kitti
3)Examples/Monocular/mono_tum
4)Examples/RGB-D/rgbd_tum
5)Examples/Stereo/stereo_euroc
6)Examples/Stereo/stereo_kitti

b) ORB-SLAM2 中的 include, src, Examples 三个文件夹中都含有什么内容?
include文件夹中是.h头文件;
src文件夹中是.cc源文件;
Example文件夹中是输出的文件,包含单目,RGBD,双目以及ROS,编译通过之后可执行文件会存放在这些文件夹中;
c) ORB-SLAM2 中的可执行文件链接到了哪些库?它们的名字是什么?
会链接到如下这些库:

  1. lib/libORB_SLAM2.so
    注:上面这个库应该是CMakeLists.txt中的如下代码产生的动态(共享)库
    add_library(${PROJECT_NAME} SHARED
    src/System.cc

    src/Viewer.cc
    )
  2. Thirdparty/g2o/lib /libg2o.so
  3. Thirdparty/DBoW2/lib/libDBoW2.so

五、使用摄像头或视频运行 ORB-SLAM2

5.1 请编译orb-slam2,给出编译成功的截图
编译完成截图上题4.2小结已给出,这里不再赘述。
5.2 CMakeLists.txt 修改⽅案
在CmakeLists.txt尾部添加如下代码:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples
/myvideo)
add_executable(myvideo Examples/myvideo/myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})

注: 前提是在Examples 文件夹中新建myvideo 文件夹, 并将myvideo.cpp、myvideo.yaml、myvideo.mp4放到Examples/myvideo文件夹下。
5.3 请给出运⾏截图,并谈谈你在运⾏过程中的体会
运行ORB-SLAM2体会:
1)根据如上过程在编译并运行./myvideo可执行文件时,首先出现段错误的提示,后来摸索一番之后总结出可能是某个文件的路径不对,于是查看myvideo.cpp代码,并将myvideo.cpp文件将原先的
string vocFile = “./Vocabulary/ORBvoc.txt”;

改为如下:
string vocFile = “…/…/Vocabulary/ORBvoc.txt”;

因为 ORBvoc.txt在当前文件夹的上两级目录中,如果不改就会产生段错误的报告。
2)运行画面出来了但是画面不动,在网上找到答案,注释掉cv::waitKey(30)这一行代码,否则需要一直按住键盘的空格键才能运行下去。注释掉这一行代码之后直接可以流畅的运行啦!运行截图如下:
视觉SLAM理论与实践1_第4张图片运行代码详见 orb_slam2_for_myvideo+中文注释

友情提示:代码下载需要C币,请事先判断是否对您有帮助,谨慎下载哦!!!

你可能感兴趣的:(视觉SLAM理论与实践1)