【ROS实践入门(九)ROS编译ORB-SLAM2运行】

【ROS实践入门(九)ROS编译ORB-SLAM2运行】

本内容经官网实例以及一些参考书总结而成,欢迎留言评论交流~

联系方式:ziyuanw#foxmail.com(#换成@)

本文只探讨ROS工作空间内ORB—SLAM2实时摄像头的编译及运行效果,至于在TUM等数据集上效果可参见ORB-SLAM2的github 项目说明中给出的详细教程:

https://github.com/raulmur/ORB_SLAM2

一、ORB-SLAM2项目准备:

1.准备工作:

创建一个catkin_ws工作空间:

mkdir -p ~/catkin_ws/src
cd  ~/catkin_ws
catkin_make

进入~/catkin_ws/src:

cd ~/catkin_ws/src

下载GitHub 项目:

git clone https://github.com/raulmur/ORB_SLAM2
  • PS:如果电脑装的是Opencv4的请用下面这条(由于原版CMakeLists.txt中OpenCV只支持opencv3版本及以下,因此网上有个好心人特意把项目中所有的Opencv都替换为了4版本,再也不用担心编译报错找不到Opencv了:):
  • 一般报错为:CMake Error at CMakeLists.txt:35 (message):OpenCV > 2.4.3 not found.-- Configuring incomplete, errors occurred!
git clone https://github.com/Windfisch/ORB_SLAM2.git

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第1张图片

2.下载并编译必要的第三方依赖库

如果之前用过编译完成过的就不用管了。

  • OpenCV
  • Eigen3
  • g2o
  • DBoW2 and g2o (Included in Thirdparty folder)
  • ROS

若没有编译好环境的我这里给一个简要方法:

安装几个依赖项和库
Boost:

sudo apt-get install libboost-all-dev 

1.编译General Graph Optimization:g2o:(编译g2o需要先安装下面三个内容)

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

然后进入刚刚第一步下载完成的ORB-SLAM2/Thirdparty目录下:

cd ~/catkin_ws/ORB_SLAM2/Thirdparty/g2o/
mkdir build
cmake ..
make

2.编译DBoW2:

cd ~/catkin_ws/ORB_SLAM2/Thridparty/DBoW2
mkdir build 
cmake ..
make

后面的opencv网上也有很多方法,ROS本机已经编译好了。

3.编译ROS版本ORB-SLAM2

首先查看一下文件结构:

可以发现有两个build的命令:build.sh和build_ros.sh,要编译ROS版本就只需执行build_ros.sh。

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第2张图片

①注意要编译的ROS版本的ORB-SLAM2在Examples文件夹的ROS目录下,因此需要将其加入ROS可执行的环境变量中:

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
  • 上面的PATH对于我的电脑来说是(根据自己的工作空间进行修改):
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/ziyuan/catkin_ws/src/ORB_SLAM2/Examples/ROS
  • echo $ROS_PACKAGE_PATH查看ROS环境变量:

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第3张图片

②修改相机节点设备号:

修改~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/下的ros_mono.cc文件:

(PS:如果想后面实验一下AR文件下的效果建议一块也修改了,方法一样)

  • 因为默认节点名称为camera/image_raw但是根据上一篇博客我的usb_cam节点为usb_cam/image_raw,设备号为2,如果不修改可能在ORB-SLAM2编译完成后是黑屏的。
    ros::NodeHandle nodeHandler;
    ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 2, &ImageGrabber::GrabImage,&igb);

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第4张图片

③编译:

直接用作者已经给写好的编译命令即可。

为了能够使编译命令可执行,首先需要修改一下其权限:

chmod +x build.sh
chmod +x build_ros.sh

首先编译ORB-SLAM:

./build.sh

然后在编译ROS版本的ORB-SLAM:

./build_ros.sh

编译过程错误:

  • 错误1:

/home/ziyuan/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/AR/ViewerAR.cc:233:9: error: ‘usleep’ was not declared in this scope
         usleep(mT*1000);

vim 打开对应的文件,头文件加上一个:  #include   执行成功。

  • 错误2(github上解决方法):https://github.com/raulmur/ORB_SLAM2/issues/494

CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/RGBD.dir/all' failed
make[1]: *** [CMakeFiles/RGBD.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so: 无法添加符号: DSO missing from command line
collect2: error: ld returned 1 exit status

解决方法:

vim 打开/home/ziyuan/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt文件找到下面部分,并加入:-lboost_system

set(LIBS 
${OpenCV_LIBS} 
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)

至此,ORB-SLAM两个版本均已编译完成,下面开始使用单目相机实时执行。

二、实时相机执行

1.usb_cam驱动和节点配置

首先需要安装usb_cam的ROS版本驱动(参考上一篇博客),完成之后开始实验效果命令:

由作者给出的说明可知道,执行单目相机节点之前需要做两项准备工作:

rosrun ORB_SLAM2 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE

①. PATH_TO_VOCABULARY

ORBvoc.txt特征词典文件路径:

/home/ziyuan/Documents/ORB_SLAM2/Vocabulary/ORBvoc.txt 

②. PATH_TO_SETTINGS_FILE

即相机设置文件,默认名为Asus.yaml,可以将里面的相机参数修改为自己标定过的参数:

/home/ziyuan/Documents/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第5张图片

2.执行:

  • 记得更新一下catkin_ws的环境配置source devel/setup.bash

①CTRL+ALT+T打开第一个终端roscore

roscore

②CTRL+Shift+T打开第二个终端,打开usb_cam相机节点:

source devel/setup.bash
roslaunch usb_cam usb_cam-test.launch

③CTRL+Shift+T打开第三个终端的,执行单目ORB_SLAM2实时usb_cam效果

rosrun ORB_SLAM2 Mono /home/ziyuan/Documents/ORB_SLAM2/Vocabulary/ORBvoc.txt  /home/ziyuan/Documents/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml

效果如下:(场景再识别能力很不错,但是场景突变时运行实时容易卡顿)

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第6张图片

CTRL+C退出,完成之后可以在~/catkin_ws/src/ORB_SLAM2自动将关键帧保存为KeyFrameTrajectory.txt

格式为:时间戳+平移+旋转(四元数形式)

【ROS实践入门(九)ROS编译ORB-SLAM2运行】_第7张图片

 

  • PS:(本案例完成之后不要忘记ROS的环境变量发生了变化可参考:
export ROS_PACKAGE_PATH=/home/ziyuan/catkin_ws:$ROS_PACKAGE_PATH
  • https://wiki.ros.org/ROS/EnvironmentVariables#ROS_PACKAGE_PATH)
  • https://answers.ros.org/question/62520/ros_package_path-environment/

 

上一篇:【ROS实践入门(八)ROS使用USB视觉传感器相机】

下一篇:待续

 

参考资料:

【1】ROS官网

【2 】ROS上基于usb_cam相机使用: https://blog.csdn.net/pengrui18/article/details/88958487

【3】ROS机器人高效编程。

【4】ORB-SLAM2作者github网站https://github.com/raulmur/ORB_SLAM2。

【5】https://vision.in.tum.de/data/datasets/rgbd-dataset/file_formats

你可能感兴趣的:(ROS实践入门)