怎么在ubuntu下装ORB-SLAM2,并用单目摄像头实时跑起来

  • Post author:
  • Post category:其他


最新的是ORB-SLAM3,

https://github.com/raulmur/ORB_SLAM2(

支持单目、双目和RGB-D接口,最好参照官网安装)

安装必备软件:为了方便.最好先把要下载的库先在windows下下载好(注意下载的版

本).不装在系统盘

(1)更新


apt库,安装Git, Cmake

sudo apt-get update
sudo apt-get install git
sudo apt-get install cmake

(2)安装


Pangolin



(


for visualization and user interface:可视化与用户界面)


Pangolin代码:https://github.com/stevenlovegrove/Pangolin

① 安装依赖

a、opengl  b、GLEW c、Boost  d、Python2/Python3  e、编译基础库

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

② 编译Pangolin

cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make -j 
(建议不要使用make -j,使用make。如果用make -j是使用多处理器编译,可能造成死机)

(3)安装

OpenCV

(操纵图像和特征点)

安装依赖:

a、编译器相关:

sudo apt-get install build-essential

b、必须依赖:

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev
libavformat-dev libswscale-dev

c、可选安装:

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

编译OpenCV:

a、官网下载OpenCV 2.4.11 for

Linux


下载地址

,解压到Ubuntu中

b、进入OpenCV文件夹,配置工程

mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

c、编译

make
sudo make install

(6)安装


Eigen (



DBoW2

–进行位置识

g2o

–进行非线性优化.






Eigen

下载地址

,进入到在解压后的Eigen文件夹(例如eigen-eigen-07105f7124f9)下

mkdir build
cd build
cmake ..
make
sudo make install

(7)安装


BLAS and LAPACK库



sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev

ROS (optional)

3.安装


ORB_SLAM




(1)下载代码

git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

(2)编译:我们提供一个脚本build.sh建立第三方库和orb-slam2。请确保您已安装所有所需的依赖项

cd ORB_SLAM2
chmod +x build.sh
./build.sh



  • ORB-


    其实build.sh就是前面第三方库的编译+ORB_SLAM2的编译,以后可以自己写一个 类似的终端命令脚本,就不需要每次编译都手敲一遍。如果发现编译出错,尽量从github或者官网上面git clone源码,里面有很多issus可供参考


    SLAM2最后编译遇到的问题

1)强制类型转换问题



错误信息:

/home/melanie/tools/eigen/Eigen/src/Core/AssignEvaluator.h:817:3: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar); ^CMakeFiles/ORB_SLAM2.dir/build.make:350: recipe for target ‘CMakeFiles/ORB_SLAM2.dir/src/Optimizer.cc.o’ failedmake[2]: *** [CMakeFiles/ORB_SLAM2.dir/src/Optimizer.cc.o] Error 1CMakeFiles/Makefile2:178: recipe for target ‘CMakeFiles/ORB_SLAM2.dir/all’ failedmake[1]: *** [CMakeFiles/ORB_SLAM2.dir/all] Error 2Makefile:83: recipe for target ‘all’ failedmake: *** [all] Error 2



解决方案:

打开Thirdparty/g2o/g2o/solvers/linear_solver_eigen.h,将以下代码

template <typename MatrixType>

class LinearSolverEigen: public LinearSolver<MatrixType>

{ public: typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet<double> Triplet;

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




修改为:


template <typename MatrixType>

class LinearSolverEigen: public LinearSolver<MatrixType>

{ public:

typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet<double> Triplet;

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;

2)usleep未定义:



错误信息:

/home/melanie/source/SmartCar/ORM_SLAM2/ORB_SLAM2/src/Viewer.cc:159:28:

error: ‘usleep’ was not declared in this scope usleep(3000);

^CMakeFiles/ORB_SLAM2.dir/build.make:494: recipe for target

‘CMakeFiles/ORB_SLAM2.dir/src/Viewer.cc.o’ failedmake[2]:

*** [CMakeFiles/ORB_SLAM2.dir/src/Viewer.cc.o]

Error 1CMakeFiles/Makefile2:178: recipe for target ‘CMakeFiles/ORB_SLAM2.dir/all’ failedmake[1]: *** [CMakeFiles/ORB_SLAM2.dir/all]

Error 2Makefile:83: recipe for target ‘all’ failed

make: *** [all] Error 2



解决方案:

在source文件的开头增加include#include <unistd.h>



需要增加unistd.h的文件有:

Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc


4.

测试

ORB_SLAM2

(1)


官网


下载测试数据集

下载内存较大,最好用硬盘下好

Monocular 实例

TUM 数据集

  1. 下载并解压

    Computer Vision Group – Dataset Download
  2. 把 TUMX.yaml 分别改名为 TUM1.yaml,TUM2.yaml or TUM3.yaml 只考虑freiburg1, freiburg2 and freiburg3个系列. 然后把路径PATH_TO_SEQUENCE_FOLDER换成解压路径。

    ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER

KITTI 数据

  1. 下载数据集

    The KITTI Vision Benchmark Suite
  2. 对于sequence 0 to 2, 3, and 4 to 12 分别把 KITTIX.yaml 改成KITTI00-02.yaml, KITTI03.yaml or KITTI04-12.yaml ,然后把路径改成解压路径,然后把 SEQUENCE_NUMBER 改成 00, 01, 02,.., 11.

    ./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER

Stereo 实例

KITTI 数据集

  1. 下载数据集

    The KITTI Vision Benchmark Suite
  2. 对于sequence 0 to 2, 3, and 4 to 12 分别把 KITTIX.yaml 改成KITTI00-02.yaml, KITTI03.yaml or KITTI04-12.yaml ,然后把路径改成解压路径,然后把 SEQUENCE_NUMBER 改成 00, 01, 02,.., 11.

    ./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER

RGB-D 实例

TUM 数据集



  1. Computer Vision Group – Dataset Download

    下载一个系列,并解压。
  2. 通过执行python associate.py生成自己的associations 文件,然后把路径加上 PATH_TO_SEQUENCE/rgb.txt PATH_TO_SEQUENCE/depth.txt > associations.txt
  3. 分别把reiburg1, freiburg2 ,freiburg3的TUMX.yaml 改成 TUM1.yaml,TUM2.yaml or TUM3.yaml,把路径 PATH_TO_SEQUENCE_FOLDER改成解压的sequence目录. 把 ASSOCIATIONS_FILE改成对应的associations文件目录

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

ROS 实例

处理你自己的实例

你需要创建一个配置文件来校正你的摄像机。可以参照我们为TUM 和 KITTI 数据集提供的例子在monocular, stereo and RGB-D cameras情况下. 我们使用OpenCV的摄像机校正模型。 .

SLAM 和 Localization 模式

你可以使用GUI在SLAM 和 Localization 模式下自由切换

SLAM 模式

这是默认模式. 此模式下,系统有三个线程并行工作: Tracking, Local Mapping and Loop Closing. 系统不断定位相机,构建新的地图然后试图闭合环形路径。

Localization 模式

当你有一个比较好的地图的时候,你可以使用此模式。在这种模式下,局部地图构建以及环路闭合将不起作用。 系统在你提供的地图上定位相机


参考博客:http://blog.csdn.net/zhjm07054115/article/details/51706706




https://github.com/raulmur/ORB_SLAM2


5.实时用摄像头(可笔记本自带或者外加摄像头)跑数据

(1)安装

usb_cam package

$ cd ~/catkin_ws/src  
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git  
$ cd ~/catkin_ws  
$ catkin_make  

笔记本自带的摄像头的设备号一般为

/dev/video0

外接摄像头一般是

<param name="video_device"value="/dev/video1"/><br><br>

(2)把ORB-SLAM2,和 usb_cam放到

catkin下src

目录下

 $ cd ~/catkin_ws/src  
 $ roscore    #初始化
 $ roslaunch usb_cam usb_cam-test.launch     #启动usb_cam包下的.launch文件启动摄像头。

此时证明摄像头可以正常使用


~~~使用自定义 launch 文件设置摄像头:


usb_cam 给了我们一个默认的 launch 文件在如下目录

~/catkin-ws/usb_cam/src/usb_cam/launch/usb_cam-test.launch

如果想要自定义一个我们自己的launch文件,我们可以复制这个文件为一个 usb_cam.launch,然后打开这个文件:

<launch> <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" > <param name="video_device" value="/dev/video0" /> <param name="image_width" value="640" /> <param name="image_height" value="480" /> <param name="pixel_format" value="yuyv" /> <param name="camera_frame_id" value="usb_cam" /> <param name="io_method" value="mmap"/> </node> <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen"> <remap from="image" to="/usb_cam/image_raw"/> <param name="autosize" value="true" /> </node></launch>

其中 /div/video0 表示是第一个摄像头,如果你有多个摄像头,可以将此改为 /div/video1 等等。想要查看当前连接设备,使用如下命令即可:

ls /dev/video*

修改好后运行这个文件:

roslaunch usb_cam usb_cam.launch



Error



1



:


[rospack] Error: package ‘image_view’ not found

表明你的 image_view 没有安装,可以执行以下命令安装即可:

sudo apt-get install ros-indigo-image-view

(3)用ORB-SLAM2实时跑数据(

记住:若是用外加摄像头,需要在usb_cam-test.launch和usb_cam_node.cpp把摄像头的设备号改为/dev/video1


  $ cd ~/catkin_ws/src  
  $ rosrun ORB_SLAM2 Mono /home/ubantu/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt 
       /home/ubantu/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml    
       (即 rosrun ORB-SLAN2 Mono    ORBvoc.txt路径    Asus.yaml路径)


6.标定摄像头(为了防止镜头下的图片发生畸变)

1)摄像头标定时所处的平面位置一旦改变,一般会影响相机内参,需重新标定

2)将标定后的


参数替换


相机原有的内参,重新跑一遍即可。



版权声明:本文为panxiying1993原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。