準備工作及軟件版本說明
注意:如果要使用USB攝像頭運行ORB-SLAM2,不能使用虛擬機,否則會出現攝像頭打開一片綠屏或者黑屏的現象。
- 操作系統 :Ubuntu 16.04
- ROS版本 :kinetic
- eigen庫版本 :3.2.10
注意: eigen庫如果用3.3.4的話 編譯ORB-SLAM2時候會出現錯誤或者警告。
- OpenCV版本:opencv3.4.1
- USB攝像頭:640*480,30幀
安裝ROS
-
打開”Ubuntu Software Center“,把鼠標移到左上角的“Ubuntu Software Center”名字上,點擊出現的“Edit ”,在下拉菜單里點擊”Software Sources“。確保你的”restricted”, “universe,” 和 “multiverse.”前是打上勾的。就像這樣:
設置ROS軟件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
- 設置密鑰
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116
- 安裝ROS kinetic
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install ros-kinetic-desktop-full
- 安裝完成后,可以用下面的命令來查看可使用的包:
apt-cache search ros-kinetic
- 初始化ROS
sudo rosdep init
rosdep update
- 然后初始化環境變量(非常重要):
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 安裝ROS Python插件
sudo apt-get install python-rosinstall
- 測試ROS(如果顯示 started core service [/rosout] 則說明ROS安裝成功)
roscore
安裝ORB-SLAM2
創建ROS工程
- 使用ROS創建workspace
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
mkdir ORB-SLAM2
- 添加環境變量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
安裝必備軟件
- 安裝git cmake
sudo apt-get install git cmake
- 安裝一些庫
sudo apt-get install libblas-dev liblapack-dev
- 安裝Pangolin
sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libpython2.7-dev
sudo apt-get install build-essential
cd ~/catkin_ws/ORB-SLAM2
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
- 編譯安裝Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make
- 安裝OpenCV依賴
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
- 下載OpenCV并解壓到Ubuntu,然后進入OpenCV文件夾進行編譯安裝
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install
- 安裝eigen庫(注意 請下載3.2.10版本,如果用3.3.x版本可能會造成ORB-SLAM2編譯失敗,因為eigen3.3.4版本修改了文件目錄結構)
- 下載Eigen,進入到在解壓后的Eigen文件夾(例如eigen-eigen-07105f7124f9)下
mkdir build
cd build
cmake ..
make
sudo make install
- 下載ORB_SLAM2:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
- 編譯安裝
cd ORB_SLAM2
chmod +x build.sh
vim build.sh
把build.sh的make -j改成make(這是為了防止多線程編譯出錯,對于build_ros.sh文件也是同理,下面就不說了)
- 運行build.sh
./build.sh
- 注意坑1:如果在編譯構建的過程中出現error:usleep()函數未定義的錯誤,要到報錯誤的代碼文件里面加上(或者在頭文件加也行):
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
- 修改環境變量(user就是用戶的名字)
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/(user)/catkin_ws/ORB-SLAM2/Examples/ROS
這個時候 打開~/.bashrc文件 最末端的時候應該是這個樣子:
- 編譯安裝ROS版本的ORB-SLAM2
cd ORB_SLAM2
chmod +x build_ros.sh
./build_ros.sh
- 注意坑2:如果在編譯構建的過程中出現關于boost庫的錯誤,要到/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-SLAM2測試數據集
(1)下載測試數據集
Download a sequence from http://vision.in.tum.de/data/datasets/rgbd-dataset/download and uncompress it.
(2)執行命令:
Execute the following command. Change TUMX.yaml to TUM1.yaml,TUM2.yaml or TUM3.yaml for freiburg1, freiburg2 and freiburg3 sequences respectively. Change PATH_TO_SEQUENCE_FOLDERto the uncompressed sequence folder.
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
在ROS中使用usb攝像頭跑ORB SLAM2
由于使用USB攝像頭作為圖像輸入,需要將圖像信息作為topic發送出去,ROS官網提供了usb_cam的package代碼,從github上下usb_cam的代碼,下載鏈接:https://github.com/bosch-ros-pkg/usb_cam
安裝ROS usb_cam源碼
cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make
- 編譯usb_cam
mkdir build
cd build
cmake ..
make
- 測試一下usb攝像頭
首先開個新的終端,運行roscore(如果顯示命令沒有找到就說明的你沒有source source /opt/ros/indigo/setup.bash)
在運行該節點之前,需要先配置一下節點參數,打開src/usb_cam-develop/launch文件中的的launch文件,我這里只需要該設備號即可,筆記本電腦的video0一般是網絡攝像頭,插入usb攝像頭一般是video1,若想看usb攝像頭是哪個端口號,可cd到根目錄中的dev文件夾下查看。
ls /dev/video*
cd /home/pan/catkin_ws/src/usb_cam
cd launch
gedit usb_cam-test.launch
將其中的內容替換成(其中/dev/videoX要對應為usb攝像頭)
<launch>
<node name="camera" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="camera" />
<param name="io_method" value="mmap"/>
<remap from="/usb_cam/image_raw" to="/camera/image_raw" />
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/camera/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
- 開三個終端,依次分別運行
roscore
roslaunch usb_cam usb_cam-test.launch
rosrun ORB_SLAM2 Mono /home/(user)/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/(user)/catkin_ws/src/ORB_SLAM2/Examples/Monocular/MyCam.yaml
-
運行時,首先是建圖
為了圖像清晰,設置只選前兩項。建圖時盡量獲得更多的特征點。
初始化
建圖
建圖
-
覺得生成地圖OK之后,可以開啟定位模式(把localization勾上)
定位
定位
大功告成。