【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
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版本的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环境变量:
②修改相机节点设备号:
修改~/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);
③编译:
直接用作者已经给写好的编译命令即可。
为了能够使编译命令可执行,首先需要修改一下其权限:
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 <unistd.h> 执行成功。
- 错误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
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
效果如下:(场景再识别能力很不错,但是场景突变时运行实时容易卡顿)
CTRL+C退出,完成之后可以在~/catkin_ws/src/ORB_SLAM2自动将关键帧保存为KeyFrameTrajectory.txt
格式为:时间戳+平移+旋转(四元数形式)
- 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