【SLAM十四讲】CH1&CH2

熟悉linux

1.如何在Ubuntu 中安装软件(命令行界面)?它们通常被安装在什么地方?

1.1在终端直接下载安装

sudo apt-get install <packagename>

安装在
/usr/bin
/etc
/usr/share

1.2 下载XXX.deb包安装

dpkg -i <packagename.deb>

1.下载的软件存放位置
/var/cache/apt/archives

2.安装后软件默认位置
/usr/share

3.可执行文件位置
/usr/bin

4.配置文件位置
/etc

5.lib文件位置
/usr/lib

2.Linux 的环境变量是什么?我如何定义新的环境变量?

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

2.1针对所有用户

sudo vim /etc/profile

在最后插入要配置的内容 ,按Esc键 ,输入( :wq 保存并退出)

export PATH=$JAVA_HOME/bin:$PATH

执行立即生效语句

source /etc/profile

2.2针对特定用户

vim ~/.bashrc
export PATH="$PATH:/opt/au1200_rm/build_tools/bin

执行立即生效语句

source ~/.bashrc

3.Linux 根目录下面的目录结构是什么样的?至少说出3 个目录的用途。

在这里插入图片描述
1)/bin 用户二进制文件
包含二进制可执行文件,系统全部用户可执行文件都在这个文件夹里,例如:ls,cp,ping等。
2)/sbin 系统二进制文件
包含二进制可执行文件,但只能由系统管理员运行,对系统进行维护。
3)/etc 配置文件
包含全部程序配置文件,也包含了用于启动/中止单个程序的启动和关闭shell脚本。
4)/dev 设备文件
包含终端全部设备,USB或链接到系统的任何设备。
例如:
/dev/tty
/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 服务数据

4.假设我要给a.sh 加上可执行权限,该输入什么命令?

chmod 777 <文件名>

将文件设置成对拥有者、组成员、其他人可读、可写、可执行。

chmod a+x <文件名>

将文件在原来的配置上增加可执行权限。

5.假设我要将a.sh ⽂件的所有者改成xiang:xiang,该输⼊什么命令?

chown xiang:xiang a.sh

SLAM 综述文献阅读

1. SLAM 会在哪些场合中用到?至少列举三个方向。

1)自动驾驶
2)增强现实
3)AGV
4)三维重建
5)水下机器人
6)扫地机器人
7)太空机器人
8)无人机

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

2.1关系

SLAM全称是simultaneous localization and mapping(即时定位与建图)。假设机器人从未知环境中的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。整个SLAM过程中,移动机器人一方面要明白自身的状态(即定位),另一方面又需要了解外在的环境(即建图)。两者紧密相关。建图的准确性依赖于定位精度,而定位的实现又离不开精确的建图。

2.2定位的同时需要建图

SLAM强调在未知环境下进行整个过程,如果在未知环境下进行定位,首先需要能够识别并理解周围的环境。再利用环境中的外部信息作为定位的基准,所以需要对所处的环境进行建图。有了地图,可以进行后续的路径规划和运动控制。

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

SLAM最早由Smith、Self和Cheeseman于1988年提出。 由于其重要的理论与应用价值,被很多学者认为是实现真正全自主移动机器人的关键。SLAM的发展可以大致分为三个阶段:

朴素时期:classical age(1986-2004)。classical age出现了SLAM最基本的概率公式,包括基于扩展卡尔曼滤波器(EKF),Rao-Blackwellised粒子滤波器和最大似然估计的方法。此外,它还剔除了与效率以及鲁棒数据等相关的基本问题,这也是日后的发展方向。

算法分析时期:algorithmic-analysis age(2004-2015),这一时期研究了SLAM的基本特性,包括可观察性,收敛性,一致性以及稀疏性对SLAM高效求解的关键作用,主要的开源SLAM库在这个时期得到了开发。

**鲁棒性-预测性时代: ** robust-perception(2015-至今):这一时期主要探索SLAM在位置环境中对鲁棒性、高级别的场景理解,计算资源优化,任务驱动的环境感知等。

视觉SLAM是在传统SLAM的基础上发展起来的,早期的视觉SLAM多采用扩展卡尔曼滤波等手段来优化相机位姿的估计和地图构建的准确性,后期随着计算能力的提升及算法的改进,BA优化、位姿优化等手段逐渐成为主流。随着人工智能技术的普及,基于深度学习的SLAM越来越受到研究者的关注。

4.列举三篇在SLAM 领域的经典文献。

  1. On the Representation and Estimation of Spatial Uncertainty[0]: 公认的SLAM开山之作

  2. MonoSLAM[1]: real-time single camera SLAM[1]:第一个实时的单目视觉SLAM系统

  3. ORB-SLAM2[2]: 当前应用最多基于优化的视觉SLAM方法,系统框架非常完善

  4. MSCKF[3]: 基于滤波的视觉SLAM方法,由于优秀的计算量和精度得到了实际应用(AR Kit)

[0] Randall, C, Smith,等. On the Representation and Estimation of Spatial Uncertainty[J]. The International Journal of Robotics Research, 1986.

[1] 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.

[2] 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, 2016, 33(5):1255-1262.

[3]Mourikis, Anastasios /I, Roumeliotis, Stergios /I. A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation[C]// IEEE International Conference on Robotics & Automation. IEEE, 2007.

CMake 练习

1. include/hello.h 和src/hello.c 构成了libhello.so 库。hello.c 中提供⼀个函数sayHello(),调用此函数时往屏幕输出⼀⾏“Hello SLAM”。我们已经为你准备了hello.h 和hello.c 这两个⽂件,见“code/”目录下。

1.1文件夹结构

在这里插入图片描述

1.2 test工程目录下CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
PROJECT(HELLO)
set(CMAKE_BUILD_TYPE "Release")
ADD_SUBDIRECTORY(src)
INSTALL(DIRECTORY include/ DESTINATION include)

1.3 src目录下CMakeLists.txt

SET(LIBHELLO_SRC hello.c)
INCLUDE_DIRECTORIES(~/test/include/)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_EXECUTABLE(sayhello useHello.c)
TARGET_LINK_LIBRARIES(sayhello hello)
INSTALL(TARGETS hello LIBRARY DESTINATION /usr/local/lib/)

1.4进入build目录进行编译

cmake ..
make
sudo make install

1.5编译安装结果

在这里插入图片描述

理解ORB-SLAM2 框架

1.下载源码

在这里插入图片描述

2.代码组织方式

a)

project(ORB_SLAM2)
add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/FrameDrawer.cc
src/Converter.cc
src/MapPoint.cc
src/KeyFrame.cc
src/Map.cc
src/MapDrawer.cc
src/Optimizer.cc
src/PnPsolver.cc
src/Frame.cc
src/KeyFrameDatabase.cc
src/Sim3Solver.cc
src/Initializer.cc
src/Viewer.cc
)

根据上面CMakeLists.txt代码可知编译将生成一个名为“libORB_SLAM2.so”的动态链接库,并且库文件有19个。

# Build examples

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D)

add_executable(rgbd_tum
Examples/RGB-D/rgbd_tum.cc)
target_link_libraries(rgbd_tum ${PROJECT_NAME})

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Stereo)

add_executable(stereo_kitti
Examples/Stereo/stereo_kitti.cc)
target_link_libraries(stereo_kitti ${PROJECT_NAME})

add_executable(stereo_euroc
Examples/Stereo/stereo_euroc.cc)
target_link_libraries(stereo_euroc ${PROJECT_NAME})


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Monocular)

add_executable(mono_tum
Examples/Monocular/mono_tum.cc)
target_link_libraries(mono_tum ${PROJECT_NAME})

add_executable(mono_kitti
Examples/Monocular/mono_kitti.cc)
target_link_libraries(mono_kitti ${PROJECT_NAME})

add_executable(mono_euroc
Examples/Monocular/mono_euroc.cc)
target_link_libraries(mono_euroc ${PROJECT_NAME})

可执行文件有6个分别为

rgbd_tum
stereo_kitti
stereo_euroc
mono_tum
mono_kitti
mono_euroc

b)

include
用于存放头文件

src
存放源代码

Examples:
存放运行例子的可执行文件,包含了针对不同数据集的运行文件:

  • 基于TUM数据集的深度相机运行文件
  • 基于TUM数据集的单目相机运行例程
  • 基于EuRoc数据集的单目相机运行例程
  • 基于EuRoc数据集的双目相机运行例程
  • 基于KITTI数据集的单目相机运行例程
  • 基于KITTI数据集的双目相机运行例程

c)

ORBSLAM2中的可执行文件链接了五个第三方库:

OpenCV
EIGEN3
Pangolin
DBoW2
g2o
libORB_SLAM2.so

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

1.安装依赖

版本环境

  • Opencv 3.4.1
  • Eigen 3.2.10 注意:不能使用最新版本,否则会报错
  • Pangolin
  • ORB-SLAM2 源码

安装Pangolin

sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libpython2.7-dev
sudo apt-get install build-essential

在Home下建立文件夹Pangolin

mkdir Pangolin
cd Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git

解压到Pangolin文件夹并进入

mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make

安装Eigen
下载地址
解压并进入文件夹

mkdir build
cd build
cmake ..
make
sudo make install

安装ORB-SLAM2

git clone https://github.com/raulmur/ORB_SLAM2.git 
cd ORB_SLAM2
chmod +x build.sh
vim build.sh

把build.sh和build_ros.sh的make -j改成make(这是为了防止多线程编译出错)这一步很重要吧,本来一直出错看了别人的博客改了之后就成功了。

运行build.sh

./build.sh

2.将文件放入指定目录中并修改CMakeLists.txt,和源文件代码。

注意事项
我按照参考博主把作业资料里的core文件夹的文件和视频放到ORB-SLAM2的Examples的Monocular的文件夹下
根据自己的文件路径修改 myvideo.cpp和myslam.cpp
修改路径很重要其中涉及一个“ORBvoc.txt”困扰了我很久,到最后才发现在工程目录下(ORB_SLAM2目录下)的Vocabulary文件夹里就有!

我的修改后代码部分:
myvideo.cpp

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

// 视频文件
string videoFile = "/home/rockwang/ORB_SLAM2/Examples/Monocular/myvideo.mp4";

myslam.cpp

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

在原有的工程目录下(ORB_SLAM2目录下)的CMakeLists.txt文件最后添加

add_executable(myvideo Examples/Monocular/myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})

3.编译运行

重新在工程目录运行

./build.sh

进入Example中Monocular目录下
运行可执行程序

./myvideo

在这里插入图片描述

有那个味了!!!

[参考资料]

  1. https://www.cnblogs.com/guoben/archive/2004/01/13/12941273.html
  2. https://blog.csdn.net/weixin_39308232/article/details/94870624

特别感谢上面两位博主写出质量好的博文,解决了我的困难。
本文只是作者学习笔记,资料大多是整合和百度,仅供本人查阅参考用谢谢。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值