本文主要参考https://blog.csdn.net/radiantjeral/article/details/82193370,对代码中的细节进行了一些修改,同时完善了实时单目SLAM的内容。本文主要针对的是通过usb摄像头实时运行单目ORB SLAM2的情况。
在安装ORB-SLAM2之前,首先安装必要的工具,vim、cmake、git、gcc、g++
sudo apt-get install vim git cmake gcc g++
根据github中的说明https://github.com/raulmur/ORB_SLAM2,ORB SLAM2通常运行于Ubuntu16.04,因此我们安装的是ROS Kinetic Kame。可以根据ROS官网的安装教程http://wiki.ros.org/kinetic/Installation进行安装。本文对官网教程进行了简化,如有需要,请自行查看官网。
配置Ubuntu存储库,以允许“restricted”,“ Universe”和“ Multiverse”。可以通过“系统设置”->“软件和更新”进行查看。
设置计算机以接受来自package.ros.org的软件。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
同时也可以使用镜像,ROS网站提供了三个国内的镜像:
1.清华大学(亲测可用)
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
2.中国科学技术大学
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
3.北京外国语大学
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.bfsu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
如果在连接到密钥服务器时遇到问题,可以尝试用在该命令中用hkp://pgp.mit.edu:80
或hkp://keyserver.ubuntu.com:80
替换。
首先,确保您的Debian软件包索引是最新的
sudo apt-get update
ROS中有许多不同的库和工具。官方提供了四种默认配置来帮助入门。我们也可以单独安装ROS软件包。这里只列出了桌面完整版(Desktop-Full)安装代码,如果需要安装其他版本,请参考官网或上述的参考博客。
sudo apt-get install ros-kinetic-desktop-full
为了方便,每次启动新的shell时,将ROS环境变量自动添加到bash会话中
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
到目前为止,您已经安装了运行核心ROS软件包所需的软件。为了创建和管理您自己的ROS工作区,有各种工具和要求分别分发。例如,rosinstall是一个常用的命令行工具,使您可以通过一个命令轻松下载ROS软件包的许多源代码树。要安装此工具和其他依赖关系以构建ROS软件包,请运行
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
在使用许多ROS工具之前,您需要初始化rosdep。rosdep使您可以轻松地为要编译的源安装系统依赖性,并且需要运行ROS中的某些核心组件。使用以下命令,可以初始化rosdep
sudo rosdep init
rosdep update
roscore
如果出现started core service [/rosout]
,说明ROS安装成功。
可按ctrl+c退出。
可以根据官网教程http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment创建catkin workspace。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
此时,会在“src”文件夹中创建一个CMakeLists.txt,同时,在“catkin_ws”文件夹中还有一个“build”文件夹和“devel”文件夹。随后执行
source devel/setup.bash
要确保安装脚本正确覆盖了您的工作区,请确保ROS_PACKAGE_PATH环境变量包含您所在的目录
echo $ROS_PACKAGE_PATH
当返回/home/youruser/catkin_ws/src:/opt/ros/kinetic/share
时,说明ROS_PACKAGE_PATH已经配置好了。注意,这里的youruser
指的是你的用户名。
根据github中的说明https://github.com/raulmur/ORB_SLAM2,ORB SLAM2需要Pangolin,OpenCV,Eigen3,DBoW2和g2o。本文将所有依赖项均安装在~catkin_ws/src中
cd ~/catkin_ws/src
Pangolin网址为https://github.com/stevenlovegrove/Pangolin,根据其上的安装教程进行安装。
sudo apt-get install libglew-dev libpython2.7-dev libboost-dev libboost-thread-dev libboost-filesystem-dev
下载Pangolin并配置环境
git clone https://github.com/stevenlovegrove/Pangolin
cd ..
catkin_make_isolated
source ~/catkin_ws/devel/setup.bash
参考博客中使用的是catkin_make
,不过我在使用的时候报错,改为catkin_make_isolated
。
下面编译并安装Pangolin
cd ~/catkin_ws/src/Pangolin
mkdir build
cd build
cmake ..
make -j4
sudo make install
OpenCV网址为 http://opencv.org,ORB SLAM2要求最低为2.4.3,测试过的为2.4.11和3.2。参考博客中安装的是2.4.13,因此本文也安装了2.4.13。
首先安装依赖项
cd ~/catkin_ws/src
sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
下载opencv
wget https://github.com/Itseez/opencv/archive/2.4.13.zip
unzip 2.4.13.zip
编译并安装opencv
cd opencv-2.4.13
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
配置环境,将opencv的库加入路径
sudo gedit /etc/ld.so.conf.d/opencv.conf
此时在打开的文件中加入/usr/loacl/lib
,保存退出
sudo ldconfig
sudo gedit /etc/bash.bashrc
此时在打开的文件末尾加入PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
,保存退出
cd ~/catkin_ws/src
sudo source /etc/bash.bashrc
如果失败,可以尝试
su
source /etc/bash.bashrc
Ctrl+d
sudo updatedb
如果su命令失败,可以再自行百度。参考博客中有opencv的测试,可以参考。这里给出我所用的程序和图片。
C++代码为
#include
#include
using namespace cv;
int main( ) {
Mat image;
//youruser按照自己的目录
image = imread("/home/youruser/catkin_ws/1.png", 1 );
if ( !image.data )
{ printf("No image data \n");
return -1; }
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}
CMakeList.txt为
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(1 1.cpp)
target_link_libraries(1 ${OpenCV_LIBS})
Eigen网址为http://eigen.tuxfamily.org,ORB SLAM2要求最低为3.1.0。参考博客中使用的是3.2.10,本文也使用3.2.10。下载并解压Eigen
cd ~/catkin_ws/src
wget https://bitbucket.org/eigen/eigen/get/3.2.10.tar.bz2
tar -xjf 3.2.10.tar.bz2
解压后的文件名称较长,将其重命名为eigen-3.2.10
mv eigen-eigen-b9cd8366d4e8/ eigen-3.2.10
编译并安装Eigen
cd eigen-3.2.10
mkdir build
cd build
cmake ..
make -j4
sudo make install
由于DBoW2和g2o包含在ORB SLAM2的Thirdparty中,因此不需要我们手动安装。
cd ~/catkin_ws/src
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
打开build.sh文件
cd ORB_SLAM2
gedit build.sh
将所有的make -j
改为make -j4
chmod +x build.sh
./build.sh
至此,已经可以在电脑上运行ORB SLAM2了。作者提供了TUM Dataset,KITTI Dataset,EuRoC Dataset上的数据集以供验证。您可以根据github上提供的信息https://github.com/raulmur/ORB_SLAM2运行ORB SLAM2,这里只说明单目数据TUM Dataset中freiburg1的运行情况。
首先,从http://vision.in.tum.de/data/datasets/rgbd-dataset/download下载序列freiburg1并解压缩,建议将其移动至~/catkin_ws/src
。
其次,执行下面的命令。针对freiburg1,freiburg2和freiburg3序列分别将TUMX.yaml更改为TUM1.yaml,TUM2.yaml或TUM3.yaml。将PATH_TO_SEQUENCE_FOLDER更改为未压缩的序列文件夹路径。
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
freiburg1对应的代码为
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ~/catkin_ws/src/rgbd_dataset_freiburg1_xyz
根据github网站上的说明https://github.com/raulmur/ORB_SLAM2,首先要将包括Examples / ROS / ORB_SLAM2的路径添加到ROS_PACKAGE_PATH环境变量。打开.bashrc文件,并在末尾添加以下行。用ORB_SLAM2的文件夹路径替换PATH
:
cd ~
gedit .bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
这里的路径PATH
建议是/home/youruser/catkin_ws...
而不是~/catkin_ws...
,不然会报错,现在也不知道是为什么,等搞懂了再补充原因
由于后续会使用usb_cam,该节点发布的话题为/usb_cam/image_raw,而ORB SLAM2默认订阅的话题是/camera/image_raw,因此我们首先对其进行修改
cd ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/orb_slam2/src
gedit ros_mono.cc
对第64行的/camera/image_raw
修改为/usb_cam/image_raw
然后执行build_ros.sh
,这里也可以将build_ros.sh
里的make -j
改为make -j4
cd ~/catkin_ws/src/ORB_SLAM2
gedit build_ros.sh
chmod +x build_ros.sh
./build_ros.sh
由于要使用usb摄像头作为输入,因此使用ROS的usb_cam,其网址为https://github.com/bosch-ros-pkg/usb_cam。下载usb_cam并配置环境
cd ~/catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make_isolated
source ~/catkin_ws/devel/setup.bash
编译usb_cam
cd src/usb_cam
mkdir build
cd build
cmake ..
make
下面测试一下usb摄像头
1.打开新的终端,运行roscore
roscore
2.打开launch文件,根据摄像头编号对文件进行修改。一般笔记本自身的摄像头是video0,usb摄像头是video1。
cd ~/catkin_ws/src/usb_cam/launch
gedit launch
3.运行测试。
cd ~/catkin_ws/src/usb_cam/launch
roslaunch usb_cam usb_cam-test.launch
若成功显示图像,说明运行正确。可以使用ctrl+c
中断程序。
在我测试时,出现了报错,因此需要多加一行代码
source /home/youruser/catkin_ws/devel/setup.bash
cd ~/catkin_ws/src/usb_cam/launch
roslaunch usb_cam usb_cam-test.launch
为了不必每次均输入source命令,将该行代码写入.bashrc
cd ~
gedit .bashrc
在最后一行添加source /home/youruser/catkin_ws/devel/setup.bash
,此后就不必每次输入该行代码了。
如果已知相机内参,可直接对Asus.yaml进行修改。如果不知道内参,可以通过matlab、opencv等多种方式计算内参。这里提供一种ROS提供的单目相机校准,http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration。
当完成内参计算后,进入/tmp,将标定的压缩包calibrationdata.tar.gz解压,打开ost.yaml,根据相机内参对~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml进行修改。
根据github网站上的说明https://github.com/raulmur/ORB_SLAM2,可以通过以下代码实时运行SLAM
rosrun ORB_SLAM2 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
根据我们所安装的路径,代码为
cd ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2
rosrun ORB_SLAM2 Mono ~/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml
本文主要针对的是实时单目ORB SLAM2的安装和运行。通过以上步骤,便可实时/离线运行ORB SLAM2。当您重新打开电脑时,使用已有数据集运行ORB SLAM2的代码是:
cd ~/catkin_ws/src/ORB_SLAM2
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /home/wangyifan/catkin_ws/src/rgbd_dataset_freiburg1_xyz
当您重新打开电脑时,实时运行单目ORB SLAM2的代码是:
#打开第一个终端,开启ROS
cd ~
roscore
#打开第二个终端,调用摄像头
cd ~/catkin_ws/src/usb_cam/launch
roslaunch usb_cam usb_cam-test.launch
#打开第三个终端,标定单目摄像头
#其中size是棋盘内角点的个数,square是棋盘单个小格的边长
rosrun camera_calibration cameracalibrator.py --size 7x5 --square 0.005 image:=/usb_cam/image_raw camera:=/usb_cam
#进入/tmp,将标定的压缩包解压,取出ost.yaml放入~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/,内有相机内参,并和原文件Asus.yaml合并
#打开第四个终端,运行实时SLAM
cd ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2
rosrun ORB_SLAM2 Mono ~/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt ~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml