1. 程式人生 > >(二)ubuntu 14.04+ORB_SLAM2+ROS indigo中實現攝像頭實時定位以及踩過的若干個坑&解決方案

(二)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

(2)在執行的時候發生錯誤,無法開啟攝像頭,顯示框一直是灰色,terminal部分顯示”Selected timeout”。這個實際上是由USB埠造成的,USB埠需要給攝像頭供電以及通訊,所以使用的是USB 3.0,需要設定一下,在USB介面卡選項中修改設定。

  目前為止就可以在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前輩。