文章目录
前言
这篇文章主要记录以下我是如何使用USB 摄像头实现ORB_SLAM2,以及在编译过程中出现的错误是如何解决,希望能够帮助别人在实现这个框架的时候避免踩雷
提示:本文章的实现基础是 Ubuntu 18.04 , ros-melodic, 其他的Eigen3, OpenCV,Pangolin 请根据ORB_SLAM2 要求进行安装
具体实现步骤:
1. 编译 usb_cam
1. 创建catkin 工作空间:
$ mkdir -p ~/catkin_ws/src
2.编译catkin 工作空间
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash
3.下载 usb_cam package
把usb_cam的code放到catkin_ws/src
$ cd ~/catkin_ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam
4. 修改 usb_cam-test.launch
$ cd usb_cam/launch/
把 usb_cam-test.launch 文件下 video device 修改成你自己的usb camera名称
<param name="video_device" value="usb_cam" />
以下是我修改成我的电脑usb camera 名称:
<param name="video_device" value="/dev/video4" />
如果你不确定你的usb camera 名称,可以打开一个新的terminal, 输入: ls -ltrh /dev/video* 进行查看.
5. 编译 usb_cam package
当前目录:~/catkin_ws/src/usb_cam
$ mkdir build
$ cd build
$ cmake ..
$ make
6. 测试 usb_cam 是否能正常运行
$ roslaunch usb_cam usb_cam-test.launch
2. 编译 ORB_SLAM2
1. 下载 ORB_SLAM2
把ORB_SLAM2 code下载下来放到catkin_ws/src/ 文件夹下面
$ cd ~/catkin_ws/src
$ git clone https://github.com/raulmur/ORB_SLAM2
2. 编译 ORB_SLAM2
$ cd ORB_SLAM2
$ chmod +x build.sh
$ ./build.sh
如果在此处编译出现 error: ‘usleep’ was not declared in this scope:
在ORB_SLAM2/include/ 下所有的头文件加入
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
然后再重新编译
3.编译ORB_SLAM2下面的ROS:
$ cd ..
$ cd Examples/ROS/ORB_SLAM2
$ mkdir build
$ cd build
$ cmake ..
$ make
如果在make 这一步出现问题: erro: undefined reference to symbol '_ZN5boost6system15system_categoryEv’
在~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeList.txt 文件找到以下部分:
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
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
)
然后再在Examples/ROS/ORB_SLAM2/build/重新编译
$ cmake ..
$ make
3.运行 usb_cam 和 ORB_SLAM2
1.运行 usb_cam
$ roslaunch usb_cam usb_cam-test.launch
2.查看usb camera 图片输出topic name
$ rostopic list
3.修改 ros_mono.cc 相机topic name
在/home/minnib/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_mono.cc 文件下修改相机订阅主题
ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabImage,&igb);
把 /camera/image_raw 改成 usb_cam 输出图片的topic,我的 usb 摄像头输出图片的 rostopic 就是 /usb_cam/image_raw
ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage,&igb);
4. 新建 usb cam 内参yaml文件
在~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/新建一个yaml文件 或者把 Monocular 文件夹下面的TUM1.yaml 复制过来,把里面的相机参数修改成为你usb_camera 内参
5.重新编译整个catkin 空间
6. 运行 usb_cam 和 ORB_SLAM2
$ roslaunch usb_cam usb_cam-test.launch
$ rosrun ORB_SLAM2 Mono /home/minnib/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/minnib/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/my_camera.yaml (usb_camera 内参文件)
Matlab相机标定可以参考我这篇文章
注意把 以上文件所有文件改称你自己的文件路径.
最后运行成功界面:
总结
提示:
1.编译过程中出错的两个地方在上面已经给出解决方法
2. 出现错误说没有发现ORM_SLAM 或者改参数没发生变化,检查是否修改后在各个package的build文件夹下是否已经重新编译了.
3. 注意修改成为自己的文件夹路径