视觉SLAM十四讲(第一章作业)

熟悉Linux

1、如何在 Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅?
答:第一个问题有两种安装方式(1)apt-get install (2)dpkg,详情如下所示
1.1 apt-get install安装方式
1.1.1 sudo apt-get install普通安装
1.1.2 sudo apt-get -f install修复安装
1.1.3 sudo apt-get -f reinstall重新安装
1.2dpkg安装方式
只有一种形式sudo dpkg -i package.deb其中deb是Linux的安装包格式。dpkgDebian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装、更新及移除。
第二个问题根据上述安装方式分为两种情况
1 apt-get install安装位置取决于包的维护者确定的,不是用户
2 dpkg -L +软件包的名字,可以知道这个软件包包含了哪些文件
系统安装软件一般在/usr/share,可执行的文件在/usr/bin,配置文件可能安装到了/etc下等。文档一般在 /usr/share,可执行文件 /usr/bin,配置文件 /etc,lib文件 /usr/lib。

2、linux 的环境变量是什么?我如何定义新的环境变量?
答:环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息(包含相关的路径信息)。下面以举一个例子作为说明:

当我们运行ls -l这个指令时,系统除了在当前目录下面寻找此指令程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
ls 指令的可执行文件所在位置如下所示:

exbot@ubuntu:~$ which ls//搜寻ls可执行文件所在位置
/bin/ls//输出结果

这里用which来搜寻ls的位置,得到结果/bin/ls
而在我的Ubuntu系统中环境变量(以隔开)如下所示:

exbot@ubuntu:~$ echo $PATH
/opt/ros/indigo/bin:/opt/jdk/java/bin:
/home/exbot/ardupilot/Tools/autotest:
/opt/gcc-arm-none-eabi-4_9-2015q3/bin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games

因此当我们在任意文件目录下执行ls指令,他会在该文件目录搜寻ls指令,如果未搜寻到,则相应到环境变量中的路径中去搜寻ls的执行文件。
定义新的环境变量可以通过如下方式:

exbot@ubuntu:~$ export PATH =$PATH:/usr/local/bin

3、linux 根⽬录下⾯的⽬录结构是什么样的?⾄少说出 3 个⽬录的⽤途。
视觉SLAM十四讲(第一章作业)_第1张图片
(1)/bin 用户二进制文件
包含二进制可执行文件,系统所有用户可执行文件都在这个文件夹里,例如:ls,cp,ping等。
(2)/sbin 系统二进制文件
包含二进制可执行文件,但只能由系统管理员运行,对系统进行维护。
(3)/etc 配置文件
包含所有程序配置文件,也包含了用于启动/停止单个程序的启动和关闭shell脚本。
(4)/dev 设备文件
包含终端所有设备,USB或连接到系统的任何设备。例如:/dev/tty1、/dev/usbmon0
(5)/proc 进程信息
包含系统进程的相关信息。
这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid}目录中包含的与特定pid相关的信息。
这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime
(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相关的数据。

4、假设我要给 a.sh 加上可执⾏权限,该输⼊什么命令?
答:chmod 777 文件名 无脑将文件设置成对拥有者、组成员、其他人可读、可写、可执行。
chmod a+x 文件名将文件在原来的配置上增加可执行权限。
具体为什么这么做可以百度,这里不多说。
5、假设我要将 a.sh ⽂件的所有者改成 xiang:xiang,该输⼊什么命令?
答:chown xiang:xiang 文件名将文件的所有者改成xiang:xiang。
具体为什么这么做可以百度,这里不多说。

SLAM论文综述

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

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

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

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

CMake 练习

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

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

具体步骤:
1、先在工程目录下创建lib文件夹,lib文件夹包含hello.hhello.c,并创建一个CMakeLists.txt文件,CMakeLists.txt内容如下所示:

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
ADD_LIBRARY(hello SHARED hello.c)//添加hello的动态库
INSTALL(FILES hello.h DESTINATION ~/backup/cmake/code/build/lib) //这里主要讲hello的头文件安装到build/lib文件夹中,方便后续包含头文件

2、然后在工程目录下创建src文件夹,src文件夹包含useHello.c,并创建一个CMakeLists.txt文件,CMakeLists.txt内容如下所示:

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
INCLUDE_DIRECTORIES(~/backup/cmake/code/build/lib)//包含头文件所在的目录
ADD_EXECUTABLE(sayhello useHello.c)//通过usehello.c生成可执行程序
TARGET_LINK_LIBRARIES(sayhello hello)//链接hello库

3、接着在工程目录下创建一个CMakeLists.txt文件,CMakeLists.txt内容如下所示:

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
ADD_SUBDIRECTORY(lib)//添加子目录lib
ADD_SUBDIRECTORY(src bin)//添加子目录src,并设置目标二进制文件的生成位置

4、最后在工程目录下创建一个build文件夹,在build文件夹中输入cmake ..sudo make install,然后在/build/bin文件中找到sayhello的可执行文件,运行结果如下所示:
视觉SLAM十四讲(第一章作业)_第2张图片

理解ORB-SLAM2框架

1、从 github.com 下载 ORB-SLAM2 的代码。
答:不多说,直接在terminal输入git clone https://github.com/raulmur/ORB_SLAM2

2、阅读 ORB-SLAM2 代码⽬录下的 CMakeLists.txt,回答问题
(a)ORB-SLAM2 将编译出什么结果?有⼏个库⽂件和可执⾏⽂件?
答:编译结果:输出多个可执行文件程序和多个库文件。
库文件:通过/src文件夹中的.cc文件生成动态库文件ORB_SLAM2
可执行文件:rgbd_tum、stereo_kitti、stereo_euroc、mono_tum、mono_kitti、mono_euroc
(b)ORB-SLAM2 中的 include, src, Examples 三个⽂件夹中都含有什么内容?
答:include文件夹包含:对应src中程序的代码函数头文件
src文件夹包含:相应程序的代码函数的c++文件
Examples文件夹包含:对应不同类别的相机的主程序(具体内容没仔细看,学完再回来补)。
(c)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

1、编译ORB-SLAM2
效果图如下所示:
视觉SLAM十四讲(第一章作业)_第3张图片
2、如何将 myslam.cpp或 myvideo.cpp 加⼊到 ORB-SLAM2 ⼯程中?请给出你的 CMakeLists.txt 修改⽅案。
答:两种解决方案,如下所示
(1)如果要编译myvideo.cpp,在原有的CMakeLists.txt文件最后添加

add_executable(myvideo Examples/Monocular/myvideo.cpp)//这里生产的可执行程序在Examples/Monocular/里面
target_link_libraries(myvideo ${PROJECT_NAME})

根据myvideo.cpp的程序可知,可执行文件myvideo需要myslam.yaml、myvideo.mp4、ORBvoc.txt文件。因此修改myvideo.cpp程序,并将需要的文件复制到可执行myvideo所在的文件夹里。

// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "./ORBvoc.txt";

// 视频文件
string videoFile = "./myvideo.mp4";

(2)如果要编译myslam.cpp,同理上个步骤,不多说啦。
3、ORB-SLAM2的运⾏截图
(1)myvideo运行效果图,虚拟机卡得一匹
视觉SLAM十四讲(第一章作业)_第4张图片
(2)myslam运行效果图,usb视频显示出来是黑的,一脸懵逼,回头学完再看看什么原因。
视觉SLAM十四讲(第一章作业)_第5张图片

你可能感兴趣的:(视觉SLAM)