本博客是根据参考网站翻译而来的,但原网站有些地方似乎存在少量瑕疵,本人针对具体的实施环境对于某些步骤略有修改。此外,鉴于个人英语水平有限,翻译有不足的地方望各位指正。
需要使用 Boost
库启动 SLAM
系统的各种线程。
sudo apt-get install libboost-all-dev
提示:安装时可能会有以下信息显示,表明已经安装了 Boost
库,
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
libboost-all-dev 已经是最新的版本了。
需要使用 ROS
来接收来自相机或者记录序列(ros包,说白了就是一系列拍摄的图片)的图像,以及用于可视化(rviz
,image_view
查看地图和图片帧)。原作者已经测试了 ORB_SLAM
在 Ubuntu 12.04+ROS Fuerte(Groovy、Hydro)
以及 Ubuntu14.04+ROS Indigo
环境下的可用性。使用 ROS Indigo
版本需要移除 manifest.xml
文件(ORB_SLAM
目录下的一个文件)中的 opencv2
依赖项。
需要使用 OpenCV
来处理图像特征。ROS Indigo
或者之前的版本已经预装在了 ROS
的发行版本上,如果是更新的版本,需要自行安装。ROS Indigo
自带的 OpenCV
版本为2.4.8,可通过以下命令来查看,
pkg-config --modversion opencv
使用修改过的 g2o
版本(原始版本参看:https://github.com/RainerKuemmerle/g2o)来实现最优化。在编译 g2o
之前,必须预装 BLAS
, LAPACK
以及 Eigen3
(至少3.1.0版本)。
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
sudo apt-get install libeigen3-dev
提示:安装这3个库的时候也可能出现和安装 Boost
库类似的提示。
ORB_SLAM
包使用了 DBow2
和 DLib
库中(参看:https://github.com/dorian3d/DBoW2)的部分内容来实现位置识别和特征匹配,不过并不需要额外的依赖项来编译 DBow2
.
1 明确已经安装了 ROS
以及所有的库依赖项(boost
, eigen3
, opencv
, blas
, lapack
).
2 克隆下面的库,
git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM
3 将 ORB_SLAM
软件包克隆所在的路径添加到 ROS_PACKAGE_PATH
环境变量中去。可在 .bashrc
文件的最后添加下面内容来实现,
export PATH_TO_PARENT_OF_ORB_SLAM=~
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:$PATH_TO_PARENT_OF_ORB_SLAM
说明:对于上述命令,本人是将 ORB_SLAM
克隆在了主目录下。原文中并没有这条命令,但缺少应该会出现问题。
4 编译 g2o
. 进入到 Thirdparty/g2o
目录下,执行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
5 编译 DBoW2
. 进入 Thirdparty/DBoW2/
目录下,执行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
6 编译 ORB_SLAM
.进入 ORB_SLAM
根目录下,执行以下命令
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make
1 从终端启动 ORB_SLAM
.(得预先将 roscore
启动)
先将 ORB_SLAM/Data/ORBvoc.txt.tar.gz
解压,以便更快地加载 ORBvoc.txt
文件。进入到 ORB_SLAM/Data/
目录下,执行以下命令:
tar -xzvf ORBvoc.txt.tar.gz
进入到 ORB_SLAM
目录下,运行以下命令:
rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml
说明:原文中提供的指令格式为:
rosrun ORB_SLAM ORB_SLAM PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
并强调说必须提供 ORB
词汇表文件(包中的ORB_SLAM/Data/ORBvoc.txt.tar.gz
)和设置文件(包中的ORB_SLAMData/Settings.yaml
)的绝对路径或者相对路径。所以,如果你并非在 ORB_SLAM
目录下的话,指令的格式会有所不同。
2 被 ORB_SLALM
节点处理后的图像帧被发布到话题 ORB_SLAM/Frame
中,可以通过使用 image_view
功能包来查看:
rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true
3 ORB_SLAM
节点处理得到的地图被发布到话题 /ORB_SLAM/Map
中,摄像机当前位姿(指的是相机拍照时所处的空间位置)和地图全局坐标原点通过 /tf
功能包分别发布到话题 /ORB_SLAM/Camera
和话题 /ORB_SLAM/World
中,通过运行 rviz
功能包来查看地图:
rosrun rviz rviz -d Data/rviz.rviz
4 ORB_SLAM
节点会订阅话题 /camera/image_raw
(需要将rosbag记录的图像序列或者摄像头捕获的原始图像发布到此话题上,以供 ORB_SLAM
节点进行处理),现在可以运行 rosbag(由一个图像序列生成) 或者摄像头节点(可以是自己写好的(可参考此人博客:http://blog.csdn.net/github_30605157/article/details/50990493 以及 http://blog.csdn.net/github_30605157/article/details/51020375)或者是安装别人写好的软件包(本人使用的是 ROS Indigo
发行版本自带的 usb_cam
软件包(这个需要根据自己的摄像头类型来决定))来驱动电脑的摄像头。如果已经有一个图像序列文件,可将它生成一个包,可使用下面这个工具来生成:https://github.com/raulmur/BagFromImages.
另一种使用方式:可以通过使用 roslaunch
(注意要先将 ORB_SLAM/Data/ORBvoc.txt.tar.gz
解压)来启动 ORB_SLAM
, image_view
, rviz
,效果完全等同于上面的一系列命令的执行。进入到 ORB_SLAM
目录下,运行以下命令:
roslaunch ExampleGroovyOrNewer.launch
或者直接执行(对目录没有要求)以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
说明:ROS Groovy
以及更新的版本(包含Indigo
)都可以用以上方法进行,ROS Fuerte
运行的是 ExampleFuerte.launch
文件
原作者提供了一个完整的设置文件(Data/Settings.yaml
后文将会进行说明)和由他们实验室获取到的一个rosbag(由一个图像记录序列例样生成).在这个测试序列中可以看见一个闭环检测和两次因视角改变而带来的重定位。
1 下载 rosbag 文件:
http://webdiis.unizar.es/~raulmur/orbslam/downloads/Example.bag.tar.gz.
可选的其他链接:
https://drive.google.com/file/d/0B8Qa2__-sGYgRmozQ21oRHhUZWM/view?usp=sharing
解压文件。
2 给例样序列启动 ORB_SLAM
节点,需要先解压词汇表文件(启动 ORB_SLAM
节点时需加载的一个文件:/Data/ORBvoc.txt.tar.gz
),然后进入到 ORB_SLAM
目录下,执行以下命令:
roslaunch ExampleGroovyOrNewer.launch
或者直执行以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
3 当 ORB_SLAM
词汇表被加载之后,进入到解压后的 Example.bag
所在的父目录下,运行 rosbag 功能包:
rosbag play --pause Example.bag
说明:rosbag play
命令的使用请自行查找。
ORB_SLAM
软件包已经提供了相机标定的功能,它运行的时候会自动从一个 YAML
文件(ORB_SLAM
中为Data/Settings.yaml
)中读取相机标定的设置参数。在这个文件中我们可以找出相机标定所需的参数以及相关的描述信息。我们在使用 ORB_SLAM
软件包的时候需要将此文件中对应的参数设置成自己摄像头的的参数值。相机标定所需要的文件可由ROS wiki
上软件包集提供的 camera_calibration
软件包产生(或者其它什么方式),详细过程此处就不进行细说了,需要的朋友可自行了解。这个相机标定模型来自于 OpenCV
.
由上述提供的测试样例在绝大部分情况下在相机运动(指的应该是相机拍摄时的实时位姿)和纹理方面都可以期望达到和原作者提供的论文中提到的效果(参看:http://webdiis.unizar.es/~raulmur/MurMontielTardosTRO15.pdf)。但是这个单目 SLAM
解决方案在下面一些情况可能不奏效:
系统能够在平面化或者非平面化的场景中进行初始化。但在平面化场景中,将取决于相机运动和平面的关系,也存在系统不进行初始化的情况,详细描述参看原作者论文:http://webdiis.unizar.es/~raulmur/MurMontielTardosTRO15.pdf
说明:对于上述所说的失效情况本人并没有遇到过,也没有进行验证,仅进行了简单的翻译。
网址连接:https://github.com/raulmur/ORB_SLAM.git