基於Ubuntu的ORB-SLAM2項目環境搭建過程


關於ORB-SLAM2

  • 機器人所研究SLAM的學長介紹,ORB-SLAM2是雙目SLAM的很成熟的一個算法
  • 由於項目需要雙目攝像頭測的距離來調節攝像頭焦距,以及后期的實景AR加入,所以從雙目視頻流,得到每一幀圖像上每一點,對應實際的攝像頭到實際物體間的空間距離,和攝像頭所在實景的三維空間數據,是項目采用ORB-SLAM2算法的原因
  • 相關博客會記錄,ORB-SLAM2環境搭建ORB-SLAM2代碼原理和實際測試雙目SLAM測出距離對應焦距調節(后兩個,之后完成補上鏈接)

環境搭建

  • 環境搭建總體參考上節中GitHub鏈接,以及ORB-SLAM2搭建詳細過程
  • 記錄如下原因,
    • 一是為針對本項目需要(雙目視頻流實時測距)的環境搭建提供提醒和參考
    • 二是第一次接觸CV工程化代碼,希望自己除了乖乖的聽話的搭建環境之外,了解工程化代碼的依賴、鏈接...等關系,也為之后項目系統搭建、降低時延優化,夯實基礎。
    • 三是雖然環境搭建已經有前車之鑒,但是在計算機學院的諸多環境配置中,博客總結終究紙上得來,無法應對復雜的環境變化;而且博客上的方法,很多還是不如官方庫、GitHub - Readme中的方法,下文完全遵循各GitHub - Readme,加之自己bug的補充,或許能提供更舒適的用戶體驗~

已有環境

  • 沒有如下軟件或環境,最好先行安裝;檢查是否有該環境的最好方式應該是查看--version了~
    • Ubuntu16.04
    • apt 1.2.29 (amd64)
    • git 2.7.4
    • gcc 5.4.0
    • python 2.7.12

創建環境

新建項目目錄

  • 目錄SLAM (我取的項目名,隨意即可~)

安裝Pangolin

  • GitHub for Pangolin,在Readme中已經有一個安裝說明,補充一個參考ubuntu Pangolin 從源碼安裝
  • What is pangolin? 穿山甲hhh~從CV角度,閱讀過上小段中GitHub - Readme中的簡介,概述可以說是加快3D可視化和UI交互的OpenGL庫
  • Pangolingit clone之后,安裝Pangolin必須的依賴
    1. OpenGL sudo apt install libgl1-mesa-dev
    2. Glew sudo apt install libglew-dev ,也是OpenGL的庫
    3. CMake sudo apt install cmake ,CMake就要好好介紹介紹了~在openCV下載與MacOS系統下的cLion配置一文中,我已經粗淺的接觸到C與C++編譯環境的配置,此處又涉及而且剛剛結束的一學期OS課程中粗淺地學習了鏈接等知識,故而在CMake & Make——鏈接初探一文中看看CMake & Make~
  • Pangolin推薦的和選擇性的依賴,下面我會逐一將探索得到的相關軟件信息記錄,並判斷是否有利於項目,決定是否安裝
    1. Wayland sudo apt install pkg-config & sudo apt install pkg-config
      按照wiki上的說明,"Wayland是一個通信協議,規定了顯示服務器與其客戶機之間的通信方式。窗口管理器簡化成顯示管理服務,專門負責渲染那些屏幕上的程序。這比X Window System中的窗口管理器要更簡單、高效。"考慮項目可能涉及階段性的窗口視頻顯示來代替VR HMD顯示,所以下載
    2. FFMPEG (For video decoding and image rescaling) sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev項目涉及硬件及軟件編解碼,FFMPEG也是編解碼常用的平台,故下載
    3. DC1394 (For firewire input) sudo apt install libdc1394-22-dev libraw1394-dev 適用於firewire camera,項目僅涉及視頻流層面,但為未涉及攝像頭層面,故未下載
    4. libuvc (For cross-platform webcam video input via libusb) git://github.com/ktossell/libuvc.git 項目確實采用的是UVC camera,相關介紹可見libuvc與webcam的開發(一) - UVC協議,但是我么購買的是商家集成封裝好的直接USB3.0接口導出視頻流的攝像機,故此處不需。
    5. libjpeg, libpng, libtiff, libopenexr (For reading still-image sequences) sudo apt install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev
      ...GitHub上還有一些,但沒有仔細介紹,而且和項目無關,故不寫
  • 搭環境(以下關於cmake指令在“CMake & Make——鏈接初探“一文中也有介紹)
    • 在搭環境之前,對pangolin源碼做一點修改,避免之后出現bug
    • vim打開Pangolin/src/display/device/display_x11.cpp,改變第110行的GLX_DOUBLEBUFFER , glx_doublebuffer ? True : False,GLX_DOUBLEBUFFER , glx_doublebuffer ? False : False,
    • 搭環境:
  // under the directory of SLAM (the dir of my project)
  cd Pangolin
  mkdir build
  cd build
  cmake ..
  cmake --build .
  sudo make install		# can not find in the Readme.md of Pangolin GitHub, but it is necessary to install in /usr/local/bin/
  • 生成了一堆.o可執行文件,pangolin配置完成
    SLAM-pangolin環境搭建完成

  • 測試安裝是否成功,可以在/usr/local/bin/include目錄下查找。

安裝OpenCV 3.2

  • 在之前的視頻流拼接學習中,發現OpenCV是一款好用的視頻圖像處理軟件,應該也是入門Computer vision的路徑之一,只是版本較多更新也很多,網上的源碼openCV2、3都有,我之前下載最新版本4.1,無奈網站上的大多數源碼都通不過編譯,而剛剛入門openCV的本咸魚還不很了解OpenCV,代碼運行常有一籌莫展
  • 所以,我的建議是,在熟練OpenCV之前,版本盡量和源碼保持一致,此處GitHub顯示ORB-SLAM2支持2.4.3 & 2.4.11 & 3.2
  • 下面說安裝搭建OpenCV 3.2環境,部分參考ubuntu 16.04 OpenCV3.2.0完全編譯安裝(下文和這篇博客有不同的命令行使用習慣,建議完全按照一篇,勿混用)
    1. 下載OpenCV 3.2的.tar.gz版本到項目SLAM目錄下
    2. 解壓 tar -zxvf [filename.tar.gz] (Linux下的打包解壓,隨意搜索即得,至於tar之后參數的意義倒是非常好奇)
    3. 安裝一些官網上沒說,但之后發現ORB - SLAM2必須要的依賴,安裝libgtk2.0-dev sudo adt-get install libgtk2.0-dev 和 pkg-config sudo apt-get install pkg-config
    4. CMake將分散的程序構建為可執行文件
  cd opencv-3.2.0/
  mkdir build
  cd build
  cmake ..
  make		# wait for several minutes
  # a lot of guidance of this instruction is `make -j4`
  # but i do not find out the meaning of parameter -j4, so i give up to use it
  sudo make install		# after compiling, install it to /usr/local/bin, so "sudo" higher permission is needed.
  • 測試安裝是否成功,也可以直接跑一個openCV的程序
    • 輸入 pkg-config --modversion opencv
    • 得到版本號3.2.0
  • 初步認為安裝成功

安裝Eigen

  • Eigen官網," is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms."
  1. 官網下載3.3.7版本到項目SLAM目錄下
  2. 解壓 tar -jxvf [filename.tar.bz2]
  3. CMake & Make,同上面幾個幾乎一樣的步驟
  • 代碼如下
cd [eigen] # file name of eigen dir
mkdir build
cd build 
cmake ..
make
sudo make install 
  • 但在進行了第三行cmake時
    SLAM-eigen-cmake結果

  • 發現有很多相關庫沒有裝(有點困惑),所以嘗試裝了 Boost BLAS LAPACK,一個基礎庫,兩個和線性代數相關的庫

sudo apt-get update
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
  • 然后再進行cmake ..及其之后的指令操作

  • 這種方法,最終可用 /usr/local/include/eigen3/Eigen/src/Core/util$ vim Macros.h 查看版本 3.3.7,認為安裝成功

  • 安裝Eigen的另一種簡單方法,在進行到第一次cmake之后,我在網上查了安裝Eigen的步驟,ubuntu16.04+eigen3安裝,但是上一種方法比較知根知底...

  • 發現 sudo apt-get install libeigen3-dev,一條指令即可完成安裝,之后 cd /usr/include/eigen3/Eigen/src/Core/util/ 目錄下的 Macros.h 查看版本號為 3.2.92 符合版本要求

SLAM-eigen-version

DBoW2 and g2o (Included in Thirdparty folder)

  • 最初以為這兩個庫也需要安裝,但發現在下載的ORB-SLAM2的 GitHub中的 Thirdparty中有,而且build.sh文件里面也有想過安裝,故不需要自己安裝。

嘗試運行

  1. 在項目目錄SLAM下 cd ORB_SLAM2-master/
  2. 一系列cmake & make:給權限 chomd +x build.sh,運行 ./build.sh
  • 點評一二,為什么此處的cmake和make,跟上面見到的諸多cmake make不同呢~個人以為這是非常優秀的工程化開發習慣。
  • 輸入 vim build.sh查看shell文件,發現在此文件中運行環境已經全部配置好
  • 提醒,有說法 make -j使用多編譯器,容易崩,本機運行也崩了一次,在vim中將所有 make -j改為 make
echo "Configuring and building Thirdparty/DBoW2 ..."

cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

cd ../../g2o

echo "Configuring and building Thirdparty/g2o ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

cd ../../../

echo "Uncompress vocabulary ..."

cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..

echo "Configuring and building ORB_SLAM2 ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
  1. Debug(回憶起了OS vim 干de bug的心酸經歷...不過目前碰到的幾個bug相對課上任務來說非常容易)
  • error: usleep is not declared in this scope ,加入下面的頭文件:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
  • 這條error出現的非常頻繁,我猜測可能是Ubuntu16.4和14.4環境不同的原因,假如搭建過程中Ubuntu14.4中沒出現這個問題,那我的猜測才可能有幾分道理。

  • 也思考過把這三條頭文件加入某個庫函數比如 system.h 但是未找到,故尚未實施

  • 最終得到可執行的“ libORB_SLAM2.so at lib folder and the executables mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_euroc and stereo_euroc in Examples folder."

測試環境搭建是否成功

嘗試數據集

  • 下載Vicon Room 1 01到項目SLAM文件夾下,在ORB...文件夾下輸入
    /ORB_SLAM2-master$ ./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml ../mav0/cam0/data ../mav0/cam1/data ./Examples/Stereo/EuRoC_TimeStamps/V101.txt

出現一系列新bug

  • 提醒:下文中所有的bug,均已在上文過程中修復🙏
  • 新bug1 : terminate called after throwing an instance of 'std::runtime_error' what(): Pangolin X11: Unable to retrieve framebuffer options Aborted (core dumped)
    • 對於這個問題,GitHub上我找到兩種解決方案,方案1 & 方案2
    • 我采用方案2解決該問題之后,出現又一個新bug
  • 新bug2: /parallels/Desktop/slam/opencv-3.2.0/modules/highgui/src/window.cpp:565: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow
    • 按照要求,乖乖的install libgtk2.0-dev sudo adt-get install libgtk2.0-dev and pkg-config sudo apt-get install pkg-config,然后re-run

成功運行雙目數據集

SLAM_stereo_demo0

下一步

  • 基於項目需求,分析SLAM算法,或融入或提取出項目需要的部分
    • 雙目視頻流導入
    • 實時求出每幾幀視頻圖像上點陣對應實物到攝像頭的距離

上述內容如有問題,懇請指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM