(二)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前輩。