锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

视觉SLAM理论与实践1

时间:2023-09-04 12:07:00 cvs系列视觉传感器

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

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

一、熟悉Linux

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

1.1 如何在Ubuntu 在哪里安装软件(命令界)?
A:安装软件有两种常用方法:
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 根记录的记录结构是什么? 个?录的?途。
根目录的一般结构如下:(根据我目前的笔记本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. VIN-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

编译成功后终端截图如下:

build/bin中会生成可执行文件sayhello,终端输入命令执行它
./sayhello

打印结果如下:

运行代码详见 视觉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

截图如下:

编译完成之后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)这一行代码,否则需要一直按住
键盘的空格键才能运行下去。注释掉这一行代码之后直接可以流畅的运行啦!运行截图如下:
运行代码详见 orb_slam2_for_myvideo+中文注释

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章