Ubuntu16.04+ROS环境+Kinect V1复现ORB-SLAM2全流程

Ubuntu16.04+ROS环境+Kinect V1复现ORB-SLAM2全流程

前言


看过高翔博士的《SLAM十四讲》(第二版)后,一直想复现一下经典的视觉SLAM开源方案,这段时间正好开学的事情已经安定下来,并且听说ORB-SLAM3已经开源了,故选择经典的ORB-SLAM系列开源算法进行复现。这次的文章主要是记录一下复现的流程和一些参考文章中没有提到的小问题的解决方法,大部分都是参考其他文章进行的操作,如有疏漏,敬请指出。

首先是给出ORB-SLAM系列的Github源码地址

  • ORB-SLAM1源码地址:https://github.com/raulmur/ORB_SLAM1

  • ORB-SLAM2源码地址:https://github.com/raulmur/ORB_SLAM2

  • ORB-SLAM3源码地址:https://github.com/UZ-SLAMLab/ORB_SLAM3.

然后是论文链接

  • ORB-SLAM1原文传送门:https://arxiv.org/pdf/1502.00956.pdf

  • ORB-SLAM2原文传送门:https://arxiv.org/pdf/1610.06475.pdf

  • ORB-SLAM3原文传送门:https://arxiv.org/pdf/2007.11898.pdf

论文部分目前只粗略的读过一遍(指读过摘要和结论),待精读后,完整写一下ORB-SLAM系列论文的阅读笔记与对比。


环境配置

默认安装环境:Ubuntu 16.04+ROS Kinetic
ubuntu 16.04镜像下载地址
ubuntu16.04 双系统安装参考:https://www.cnblogs.com/Duane/p/6776302.html

ROS 安装参考:https://blog.csdn.net/zhang970187013/article/details/81014412

其中,国内访问ROS网站经常被墙,在ROS安装时经常会在**sudo rosdep initrosdep update**这两步出现问题,Linux下的翻墙软件又不是很好安装,推荐参考:https://blog.csdn.net/qq_30267617/article/details/115028689


ORB-SLAM2环境的安装主要参考博客https://blog.csdn.net/lixujie666/article/details/80475451的环境配置步骤,该文章给出了编译ORB-SLAM1和ORB-SLAM2的全部流程。

Step1 创建ROS工作空间

$ mkdir -p ~/SLAM/src
$ cd ~/SLAM/src
$ catkin_init_workspace
$ cd ..
$ catkin_make
$ echo "source ~/SLAM/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

Step2 下载源码

$ cd ~/SLAM/src
$ git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM1 
$ git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

Step3 修改部分文件内容

虽然我们前面按照README安装了ORB-SLAM所有的依赖库,但编译过程中难免还是会遇到各种各样的问题,接下来根据我在编译过程中遇到过的问题列出以下修改意见:

(1)在ORB_SLAM1文件夹下有个manifest.xml文件,将里面的这一行删掉或注释掉。
(2)打开ORB_SLAM1/src文件夹下的ORBextractor.cc文件,添加两个头文件:

#include <opencv2/features2d/features2d.hpp>
#include <opencv2/imgproc/imgproc.hpp>

修改以上两条的原因是ROS-kinetic版本自带OpenCV3 。

(3)打开ORB_SLAM1/Thirdparty/g2o/g2o/solvers文件夹下的linear_solver_eigen.h文件,

找到typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;

将其改为typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> PermutationMatrix;

原因是Ubuntu16.04安装的Eigen库与源码自带的g2o库产生了一些不兼容的问题。

(4)打开ORB_SLAM1文件夹下的CMakeLists.txt,在target_link_libraries()中添加两个库文件:

/usr/lib/x86_64-linux-gnu/libboost_system.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so

这里注意一下

(5)打开ORB_SLAM2/Examples/ROS/ORB_SLAM2文件夹下的CMakeLists.txt,在set(LIBS …)中同样添加上述的两个库文件。
修改以上两条的原因是编译过程中可能会遇到cmake找不到libboost_system.so和libboost_filesystem.so的情况,也许你不会遇到。当然,上面两个库的路径要根据自己的实际情况进行适当修改,可以通过$ locate libboost_system.so来进行定位。

Step4 开始编译

(1)编译 ORB-SLAM1

$ cd ~/SLAM/src/ORB_SLAM1/Thirdparty/DBoW2/
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make

$ cd ~/SLAM/src/ORB_SLAM1/Thirdparty/g2o/
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make

$ cd ~/SLAM/src/ORB_SLAM1/
$ mkdir build
$ cd build
$ cmake .. -DROS_BUILD_TYPE=Release
$ make

(2)编译 ORB-SLAM2

$ cd ~/SLAM/src/ORB_SLAM2/
$ chmod +x build.sh
$ ./build.sh

$ chmod +x build_ros.sh
$ ./build_ros.sh

编译ROS选项的时候均不需要设置ROS_PACKAGE_PATH,因为源码就在ROS的工作空间里。不出意外的话,编译可顺利通过!


利用TUM数据集运行ORB-SLAM2

如果手上没有单目摄像头及RGB-D摄像头的话,可以先利用现有的数据集来运行ORB-SLAM2。

主要参考博客https://www.cnblogs.com/MingruiYu/p/12286752.html
原作者个人主页https://www.cnblogs.com/MingruiYu/

官方文档Monocular ExamplesStereo ExamplesRGB-D Example提供了详细的在不同数据集上运行的教程。注意不同的相机类型对应着不同的数据集,也对应着不同的运行方法。

以TUM数据集中的fr1/desk视频序列为例。
该数据集下载链接为https://vision.in.tum.de/data/datasets/rgbd-dataset/download,找到其中fr1/desk序列,点击tgz下载压缩文件,之后进行解压。

RGB-D示例

$# ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE

对应不同的具体视频序列需要对该命令进行调整:

  • 调整TUMX.yaml:如果视频序列是freiburg1(fr1)目录下的,则改为TUM1.yaml;如果视频序列是freiburg2(fr2)目录下的,则改为TUM2.yaml;如果视频序列是freiburg3(fr3)目录下的,则改为TUM3.yaml;
  • 调整PATH_TO_SEQUENCE_FOLDER:将其改为刚才解压后视频序列文件夹的路径。
  • 调整PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE:将其改为该序列associations文件的路径。associations文件是用来将RGB图像和Depth图像一一对应起来的文件。ORB-SLAM2库Examples/RGB-D/associations/中提供了几个视频序列的associations文件,其中包含fr1/desk序列。所以此处就不需要自己生成了。

所以,在我的机器上,TUM数据集fr1/desk序列对应的RGB-D SLAM运行命令就是:在ORB_SLAM2文件夹下的终端中输入

$./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ../rgbd_dataset_freiburg1_desk ./Examples/RGB-D/associations/fr1_desk.txt

运行效果如下:
在这里插入图片描述

该博主的该系列博文ORB-SLAM2 系列博文


Kinect实时运行测试

Kinect V1彩色相机和深度相机的内参标定

参考链接:https://blog.csdn.net/puqian13/article/details/103163585

标定板

下载链接:
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf
说明:标定板为8x6,可以用A4纸打印出来,square边长为24.5mm,即0.0245m,作为标定输入参数。黑板棋盘版的点从里面的点开始数。

安装Kinect V1的驱动

参考链接1:https://blog.csdn.net/puqian13/article/details/100521968

Kinect V1驱动一般有两个,freenect和openni。这里给出freenect的驱动安装步骤,如果安装不成功,可以安装openni的驱动。

驱动下载

$sudo apt-get install ros-kinetic-freenect-*   

$rospack profile   

相机运行

$roslaunch freenect_launch freenect.launch

可能出现的错误

在这里插入图片描述

由于没有点云的话题所以会报错,不影响正常使用。

打开相机和标定程序

$roslaunch freenect_launch freenect.launch

$rostopic list

标定彩色相机

$rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/camera/rgb/image_raw camera:=/camera/rgb

注意:camera:=/camera/rgb一定要输入,不然后面保存不了,当然要改成自己的话题
注意:8x6中间的乘是字母x
注意:
x:表示标定板在视野中的左右位置,左右移动使绿色条变满
y:表示标定板在视野中的前后的位置,前后移动使绿色条变满
size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近,上下移动使绿色条变满
skew:标定板在视野中的倾斜位置,不断旋转标定板使绿色条变满
注意:
CALIBRATE被激活后,点击CALIBRATE按钮,稍等1-2分钟,SAVE按钮和COMMIT按钮被激活,点击save校准数据会被保存到/temp文件夹下;点击COMMIT将结果保存到/home/.ros/camera_info/head_camera.yaml。
标定结果如图
请添加图片描述

标记深度相机

$rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera/ir --size 8x6 --square 0.024

注意:深度相机标定的时候尽量在暗处,遮光最好,用不透光的物品把红外发射装置遮住。

标定结果如图

请添加图片描述

查找结果文件

点击标定程序中的commit按钮后退出标定程序

终端返回类似信息:

img

我运行到这里的时候打开图形界面是找不到这个文件夹的

这时我们可以打开终端移动到该文件夹,再手动复制到常用的文件夹中。

cd /home/kevin/.ros/camera_info/head_camera.yaml

cp head_camera.yaml /***

其中***为目标文件夹。

至此相机标定结束。

运行ORB-SLAM2!!!

复制一份ORB_SLAM2/Examples/RGB-D文件夹下的TUM1.yaml,重命名为kinect1.yaml,将里面的相机参数改为刚才标定的RGB相机的参数。然后在ORB_SLAM2/文件夹下新建一个kinect_orbslam2.launch文件,复制粘贴以下代码:

<launch> 
  <node pkg="ORB_SLAM2" type="RGBD" name="ORB_SLAM2" output="screen"
        args="/home/lbx/SLAM/src/ORB_SLAM2/Vocabulary/ORBvoc.txt 
         /home/lbx/SLAM/src/ORB_SLAM2/Examples/RGB-D/kinect1.yaml" /> 

  <include file="$(find openni_launch)/launch/openni.launch"> 
    <!-- use device registration --> 
    <arg name="depth_registration" value="true" /> 
    <arg name="rgb_processing" value="false" /> 
    <arg name="ir_processing" value="false" /> 
    <arg name="depth_processing" value="false" /> 
    <arg name="depth_registered_processing" value="false" /> 
    <arg name="disparity_processing" value="false" /> 
    <arg name="disparity_registered_processing" value="false" /> 
    <arg name="hw_registered_processing" value="false" /> 
    <arg name="sw_registered_processing" value="false" /> 
  </include> 
</launch>

打开终端,运行以下命令。

cd ORB-SLAM2

./build.sh

roslaunch kinect_orbslam2.launch

应该会出现下图所示的效果:
这里写图片描述

ORB-SLAM2的复现到此结束。

如果想深挖代码,推荐https://www.cnblogs.com/MingruiYu/p/12347171.html

最后附上作者为了理清思路做的程序思维导图,给作者点个大大的赞!

img

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值