(二)ubuntu 14.04+ORB_SLAM2+ROS indigo中实现摄像头实时定位以及踩过的若干个坑&解决方案

  • 前言
  • 实现方案

前言

  上一篇博客主要讲述如何安装ROS indigo,这篇主要集中在安装usb_cam以及如何在ORB_SLAM2上实现实时定位。

实现方案

安装usb_cam
创建一个工作空间,make一下

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

下面是安装usb_cam

cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam usb_cam
cd usb_cam
mkdir build 
cd build 
cmake ..
make 

到这个步骤已经安装好usb_cam了,下面可以测试下是否安装成功。
打开一个新的terminal

roscore

重新打开一个新的terminal,输入下面指令打开摄像头

roslaunch usb_cam usb_cam-test.launch 

  在这个地方有几个坑,我应该都踩过,还是实践出真知我最终找到了解决方案。
(1)按照网上的教程,我在笔记本电脑上插入外置摄像头,然后再查看设备,我新插的设备应该是video1,但是我使用如下命名查看我的设备号,却是video0。输入如下命令查询设备号:

ls /dev/video*

  输入上述指令之后就会发现你的摄像头设备对应的设备号,如果不是video0,需要在launch文件中修改,将launch文件中的设备号换成自己查询到的设备号。

cd ~/catkin_ws/src/usb_cam/launch
gedit usb_cam-test.launch

(二)ubuntu 14.04+ORB_SLAM2+ROS indigo中实现摄像头实时定位以及踩过的若干个坑&解决方案_第1张图片

(2)在运行的时候发生错误,无法打开摄像头,显示框一直是灰色,terminal部分显示”Selected timeout”。这个实际上是由USB端口造成的,USB端口需要给摄像头供电以及通信,所以使用的是USB 3.0,需要设置一下,在USB适配器选项中修改设置。
(二)ubuntu 14.04+ORB_SLAM2+ROS indigo中实现摄像头实时定位以及踩过的若干个坑&解决方案_第2张图片

  目前为止就可以在Ubuntu 14.04+ROS indigo中打开摄像头,并且实时显示了。接下来就是基于ORB_SLAM2开源代码实现实时定位,实际上在实现实时定位之前,我先期实现了基于TUM和KITTI数据集的SLAM,此处直接实现实时SLAM。
安装Pangolin

sudo apt-get install libglew-dev  
sudo apt-get install cmake  
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-de
git clone https://github.com/stevenlovegrove/Pangolin.git  
cd Pangolin  
mkdir build  
cd build  
cmake -DCPP11_NO_BOOST=1 ..  
make 

安装Eigen3

sudo apt-get install libeigen3-dev

下载orb_slam2

cd catkin_ws/src
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
sudo apt-get install libqt4-dev qt4-qmake libqglviewer-dev libsuitesparse-dev libcxsparse3.1.2 
libcholmod-dev
(注:最后一个依赖项需要使用table键来填充名称)

安装orb_slam提供的图优化工具g2o

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

编译DBoW2

cd catkin_ws/src/ORB_SLAM2/Thirdparty/DBoW2
mkdir build
cd build
cmake ..
make

修改ros_mono.cc文件

cd catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src
gedit ros_mono.cc
将ros::Subscriber sub = nodeHandler.subscribe("**camera**/image_raw", 1, &ImageGrabber::GrabImage,&igb);换成ros::Subscriber sub = nodeHandler.subscribe("**/usb_cam**/image_raw", 1, &ImageGrabber::GrabImage,&igb);

编译orb_slam2

cd catkin_ws/src/ORB_SLAM2
mkdir build 
cd build 
cmake ..
make 

  在之前的步骤中需要标定摄像头,标定的话无论使用Matlab还是Opencv,网上很容易找到各种教程。但是由于种种原因,我暂时没有标定摄像头,也就是我使用的是ORB_SLAM2中设置的摄像头参数。如果标定好摄像头,可以打开Examples/ROS/ORB_SLAM2下的Asus.yaml文件,将文件中的摄像头参数替换成自己的。接下来就是激动人心的时刻了!
打开一个新terminal

roscore

然后开第二个terminal,输入如下指令打开摄像头

roslaunch usb_cam usb_cam-test.launch

打开第三个terminal,输入如下指令实现你的ROB_SLAM

cd ~/catkin_ws/src/ORB_SLAM2
rosrun ORB_SLAM2 Mono ./Vocabulary/ORBvoc.txt ./Examples/ROS/ORB_SLAM2/Asus.yaml

  在这个过程中我还遇到两个问题,一个是ORBvoc.txt文件,可能需要自己解压一下,才可以访问到;第二个问题是,在输入如下指令实现ORB_SLAM2的时候,始终无法运行,索性修改了路径,如上面的指令。

rosrun ORB_SLAM2 Mono /home/albert/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/albert/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml
(注:albert是我的电脑名,这种方法我试了很多次就是不行,最终还是屈服了,先cd到一个目录再运行吧)


  希望每个正在和ORB_SLAM2“搏斗”的人看完我的这篇博文都可以解决自己的问题,在这里感谢我看过的所有博客的作者们(太多了,就不一一致谢),感谢ORB_SLAM2的作者Raul Mur-Artal博士,感谢在我尝试使用TUM数据集跑ORB_SLAM2时给了我很多帮助的FCX前辈,还有我成功前夕给了我很多帮助和建议的FY前辈。

你可能感兴趣的:(解决方案)