視覺SLAM(一)預備課程與基礎知識 后續作業


第一章 作業

二 熟悉Linux

1. 如何在Ubuntu 中安裝軟件(命令行界面)?它們通常被安裝在什么地方?

Ubuntu 可通過如下命令安裝庫

sudo apt-get install package          

通過apt方式安裝的庫一般被安裝在目錄usr/lib或者usr/include中。

補充:

下載的軟件存放位置: /var/cache/apt/archives
安裝后軟件默認位置: /usr/share
可執行文件位置: /usr/bin
配置文件位置: /etc
lib文件位置: /usr/lib

如果不清楚軟件在什么地方,可以通過which和where is兩個命令來查看軟件

2. linux 的環境變量是什么?我如何定義新的環境變量?

環境變量用來定義每個用戶的操作環境。linux環境變量和Windows的環境變量一樣,分系統環境變量和用戶環境變量,系統環境變量對所有用戶有效,而用戶環境變量只對當前用戶有效。

環境変量是具有一個名字和一個值的參數。它包含了會被系統或者應用使用的信息。例如可執行文件的地址,默認的編輯器是什么等。
set / export
全局變量/局部變量

以路徑$PATH:/opt/au1200_rm/build_tools/bin為例,定義環境變量的方法如下:

方法一:用export命令,

  1. 輸入“export PATH="$PATH:/opt/au1200_rm/build_tools/bin”

方法二:修改profile文件

  1. 輸入sudo gedit /etc/profile,回車;
  2. 再輸入“export PATH="$PATH:/opt/au1200_rm/build_tools/bin”

方法三:修改.bashrc文件

  1. 輸入sudo gedit /root/.bashrc,回車。
  2. 再輸入“export PATH="$PATH:/opt/au1200_rm/build_tools/bin”

3. linux 根目錄下面的目錄結構是什么樣的?至少說出3 個目錄的用途

Linux目錄結構是樹目錄結構
Linux根目錄結構及用途

  1. bin 目錄:此目錄存放所有二進制命令(用戶)
  2. boot目錄:Linux內核及引導系統程序所需的目錄
  3. dev目錄:所有設備文件的目錄(如聲卡、磁盤、光驅)
  4. etc目錄:二進制安裝包(yum,rpm)配置文件默認路徑,服務啟動命令存放目錄
  5. lib目錄:庫文件存放目錄
  6. home目錄:普通用戶的家目錄默認數據存放目錄
  7. opt目錄:自定義軟件安裝存放目錄,用戶自行安裝的軟件包存放目錄。
  8. lost+found目錄:在EXT3系統中,當系統意外崩潰或意外關機時,會產生一些碎片文件在這個目錄下面,系統啟動fcsk工具會檢查這個目錄,並修復已損壞的文件系統。
  9. mnt目錄:用於臨時掛載存儲設備,通常情況下可以掛載LINUX ISO光盤進行無網條件下的安裝其他軟件包
  10. proc目錄:進程及內核信息存放目錄
  11. root目錄:管理的家目錄
  12. sbin目錄:系統管理員命令存放的目錄(超級管理員使用的命令)
  13. tmp目錄:臨時文件目錄,程序運行時產生的臨時文件存放目錄
  14. usr目錄:系統存放程序的目錄(命令和幫助文件)

4. 假設我要給a.sh 加上可執行權限,該輸入什么命令?

為一個文件添加可執行權限

chmod +x a.sh

*:為一個文件夾下的所有文件添加可執行權限

chmod +x *

5. 假設我要將a.sh文件的所有者改成xiang:xiang,該輸入什么命令?

可利用如下命令:

sudo chown -R  username:groupname  filename

解釋

sudo:管理員權限

chown :修改文件所有者和組別

-R :遞歸文件夾內部的所有文件及文件夾

username:目標所有者名稱

groupname:組名

filename:文件或文件夾名稱

答案:

sudo chown -R xiang:xiang a.sh 

三 SLAM綜述文獻閱讀

1. SLAM 會在哪些場合中用到?至少列舉三個方向

答:SLAM在以下方向可能會有非常大的用處

  1. 增強現實應用: AR通過電腦技術,將虛擬的信息應用到真實世界,真實的環境和虛擬的物體實時地疊加到了同一個畫面或空間同時存在。這一畫面的實現,離不開SLAM技術的實時定位。雖然在AR行業有很多可代替技術,但SLAM技術是最理想的定位導航技術。相較於SLAM在機器人、無人駕駛等領域的應用,在AR行業的應用則有很多不同點。
    • 精度:AR一般更關注於局部精度,要求恢復的相機運動避免出現漂移、抖動,這樣疊加的虛擬物體才能看起來與現實場景真實地融合在一起。但在機器人和無人駕駛領域則一般更關注全局精度,需要恢復的整條運動軌跡誤差累積不能太大,循環回路要能閉合,而在某個局部的漂移、 抖動等問題往往對機器人應用來說影響不大。
    • 效率:AR需要在有限的計算資源下實時求解,人眼的刷新率為24幀,所以AR的計算效率通常需要到達30幀以上; 機器人本身運動就很慢,可以把幀率降低,所以對算法效率的要求相對較低。
    • 配置:AR對硬件的體積、功率、成本等問題比機器人更敏感,比如機器人上可以配置魚眼、雙目或深度攝像頭、高性能CPU等硬件來降低SLAM的難度,而AR應用更傾向於采用更為高效、魯棒的算法達到需求。
  2. 無人機: 無人機在飛行的過程中需要知道哪里有障礙物,該怎么規避,怎么重新規划路線。顯然,這是SLAM技術的應用。但無人機飛行的范圍較大,所以對精度的要求不高,市面上其他的一些光流、超聲波傳感器可以作為輔助。
  3. 自動駕駛: 隨着城市物聯網和智能系統的完善,無人駕駛必是大勢所趨。無人駕駛利用激光雷達傳感器(Velodyne、IBEO等)作為工具,獲取地圖數據,並構建地圖,規避路程中遇到的障礙物,實現路徑規划。跟SLAM技術在機器人領域的應用類似,只是相比較於SLAM在機器人中的應用,無人駕駛的雷達要求和成本要明顯高於機器人。
  4. 機器人: 激光+SLAM是目前機器人自主定位導航所使用的主流技術。激光測距相比較於圖像和超聲波測距,具有良好的指向性和高度聚焦性,是目前最可靠、穩定的定位技術。激光雷達傳感器獲取地圖信息,構建地圖,實現路徑規划與導航。機器人可以應用的地方很多,比如配送機器人,探索機器人等。
  5. **智能家居: **近年來,智能家居的發展使得我們的居家生活變得更加充滿樂趣與效率。對於智能清掃機器人這類室內移動型機器人而言,機器人自主定位和對周邊環境的識別是其高效工作的根本。利用激光或相機進行SLAM在只能家居機器人上有很大的應用空間。

2. SLAM 中定位與建圖是什么關系?為什么在定位的同時需要建圖?

答:SLAM全稱是simultaneous localization and mapping(即時定位與建圖)。假設了機器人從未知環境中的未知地點出發,在運動過程中通過重復觀測到的地圖特征(比如,牆角,柱子等)定位自身位置和姿態,再根據自身位置增量式的構建地圖,從而達到同時定位和地圖構建的目的。

定位與建圖的關系

整個SLAM過程中,移動機器人一方面要明白自身的狀態(即定位),另一方面又需要了解外在的環境(即建圖)。兩者緊密相關。建圖的准確性依賴於定位精度,而定位的實現又離不開精確的建圖。

為什么定位的同時需要建圖

答:SLAM強調在未知環境下進行整個過程,如果在未知環境下進行定位,首先需要能夠識別並理解周圍的環境。再利用環境中的外部信息作為定位的基准,所以需要對所處的環境進行建圖。

3. SLAM 發展歷史如何?我們可以將它划分成哪幾個階段?

答:SLAM發展歷史

SLAM最早由Smith、Self和Cheeseman於1988年提出。 由於其重要的理論與應用價值,被很多學者認為是實現真正全自主移動機器人的關鍵。在文獻2(Past, Present, and Future of Simultaneous Localization And Mapping: Towards the Robust-Perception Age)中,根據Durrant-Whyte和Bailey在兩篇綜述中對SLAM的前20年歷史進行的詳盡回顧。SLAM的發展可以大致分為三個階段:

  1. 朴素時期:classical age(1986-2004)。classical age出現了SLAM最基本的概率公式,包括基於擴展卡爾曼濾波器(EKF),Rao-Blackwellised粒子濾波器和最大似然估計的方法。此外,它還剔除了與效率以及魯棒數據等相關的基本問題,這也是日后的發展方向。

  2. 算法分析時期:algorithmic-analysis age(2004-2015),這一時期研究了SLAM的基本特性,包括可觀察性,收斂性,一致性以及稀疏性對SLAM高效求解的關鍵作用,主要的開源SLAM庫在這個時期得到了開發。

  3. **魯棒性-預測性時代: ** robust-perception(2015-至今):這一時期主要探索SLAM在位置環境中對魯棒性、高級別的場景理解,計算資源優化,任務驅動的環境感知等。

    視覺SLAM是在傳統SLAM的基礎上發展起來的,早期的視覺SLAM多采用擴展卡爾曼濾波等手段來優化相機位姿的估計和地圖構建的准確性,后期隨着計算能力的提升及算法的改進,BA優化、位姿優化等手段逐漸成為主流。隨着人工智能技術的普及,基於深度學習的SLAM越來越受到研究者的關注。

4. 列舉三篇在SLAM 領域的經典文獻。

  1. On the Representation and Estimation of Spatial Uncertainty[0]: 公認的SLAM開山之作

  2. MonoSLAM[1]: real-time single camera SLAM[1]:第一個實時的單目視覺SLAM系統

  3. ORB-SLAM2[2]: 當前應用最多基於優化的視覺SLAM方法,系統框架非常完善

  4. MSCKF[3]: 基於濾波的視覺SLAM方法,由於優秀的計算量和精度得到了實際應用(AR Kit)

[0] Randall, C, Smith,等. On the Representation and Estimation of Spatial Uncertainty[J]. The International Journal of Robotics Research, 1986.

[1] Davison A J , Reid I D , Molton N D , et al. MonoSLAM: real-time single camera SLAM[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2007, 29(6):1052-1067.

[2] Mur-Artal R , Tardos J D . ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras[J]. IEEE Transactions on Robotics, 2016, 33(5):1255-1262.

[3]Mourikis, Anastasios /I, Roumeliotis, Stergios /I. A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation[C]// IEEE International Conference on Robotics & Automation. IEEE, 2007.

四. CMake 練習

書寫⼀個由 cmake 組織的 C++ ⼯程,要求如下:

  1. include/hello.h 和 src/hello.c 構成了 libhello.so 庫。hello.c 中提供⼀個函數 sayHello(),調⽤此函數時往屏幕輸出⼀⾏“Hello SLAM”。我們已經為你准備了 hello.h 和 hello.c 這兩個⽂件,見“code/” ⽬錄下。
  2. ⽂件 useHello.c 中含有⼀個 main 函數,它可以編譯成⼀個可執⾏⽂件,名為“sayhello”。
  3. 默認⽤ Release 模式編譯這個⼯程。
  4. 如果⽤戶使⽤ sudo make install,那么將 hello.h 放⾄/usr/local/include/下,將 libhello.so 放⾄/usr/local/lib/下。請按照上述要求組織源代碼⽂件,並書寫CMakeLists.txt。

答:編譯運行截圖如下:

![image-20200522180910727](D:\我的堅果雲\視覺SLAM\第一節 概述與預備知識\image\編譯LibHello截圖.png)

推薦結構:

五. 理解ORB-SLAM2 框架

1. 從github.com 下載ORB-SLAM2 的代碼。

地址在:https://github.com/raulmur/ORB_SLAM2.
提示:在安裝git 之后,可以⽤git clone https://github.com/raulmur/ORB_SLAM2 命令下載
ORB-SLAM2。下載完成后,請給出終端截圖。

![image-20200522170310934](D:\我的堅果雲\視覺SLAM\第一節 概述與預備知識\image\下載ORBSLAM.png)

2. 閱讀ORB-SLAM2 代碼目錄下的CMakeLists.txt,回答問題:

(a) ORB-SLAM2 將編譯出什么結果?有幾個庫文件和可執行文件?
project(ORB_SLAM2)
add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/FrameDrawer.cc
src/Converter.cc
src/MapPoint.cc
src/KeyFrame.cc
src/Map.cc
src/MapDrawer.cc
src/Optimizer.cc
src/PnPsolver.cc
src/Frame.cc
src/KeyFrameDatabase.cc
src/Sim3Solver.cc
src/Initializer.cc
src/Viewer.cc
)

根據以上CMakeLists.txt的描述,ORBSLAM2編譯將生成libORB_SLAM2.so動態鏈接庫

# Build examples

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D)

add_executable(rgbd_tum
Examples/RGB-D/rgbd_tum.cc)
target_link_libraries(rgbd_tum ${PROJECT_NAME})

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Stereo)

add_executable(stereo_kitti
Examples/Stereo/stereo_kitti.cc)
target_link_libraries(stereo_kitti ${PROJECT_NAME})

add_executable(stereo_euroc
Examples/Stereo/stereo_euroc.cc)
target_link_libraries(stereo_euroc ${PROJECT_NAME})


set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Monocular)

add_executable(mono_tum
Examples/Monocular/mono_tum.cc)
target_link_libraries(mono_tum ${PROJECT_NAME})

add_executable(mono_kitti
Examples/Monocular/mono_kitti.cc)
target_link_libraries(mono_kitti ${PROJECT_NAME})

add_executable(mono_euroc
Examples/Monocular/mono_euroc.cc)
target_link_libraries(mono_euroc ${PROJECT_NAME})

根據以上部分CMakeLists.txt的描述,ORBSLAM2還將生成rgbd_tum, stereo_kitti, stereo_euroc, mono_tum, mono_kitti,mono_euroc共6個可執行的demo程序

庫文件有19個:

//**修正:庫文件指的是lib*.so文件

add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/FrameDrawer.cc
src/Converter.cc
src/MapPoint.cc
src/KeyFrame.cc
src/Map.cc
src/MapDrawer.cc
src/Optimizer.cc
src/PnPsolver.cc
src/Frame.cc
src/KeyFrameDatabase.cc
src/Sim3Solver.cc
src/Initializer.cc
src/Viewer.cc
)

可執行文件有如下6個:

  1. rgbd_tum
  2. stereo_kitti
  3. stereo_euroc
  4. mono_tum
  5. mono_kitti
  6. mono_euroc
(b) ORB-SLAM2 中的include, src, Examples 三個文件夾中都含有什么內容?
  • include:存放頭文件
  • src:用來存放.cc等庫文件
  • Example:存放運行例子的可執行文件,包含了針對不同數據集的運行文件,:
    • 基於TUM數據集的深度相機運行文件
    • 基於TUM數據集的單目相機運行例程
    • 基於EuRoc數據集的單目相機運行例程
    • 基於EuRoc數據集的雙目相機運行例程
    • 基於KITTI數據集的單目相機運行例程
    • 基於KITTI數據集的雙目相機運行例程
(c) ORB-SLAM2 中的可執行文件鏈接到了哪些庫?它們的名字是什么?

ORBSLAM2中的可執行文件鏈接了五個第三方庫:OpenCVEIGEN3PangolinDBoW2g2o和一個生成庫libORB_SLAM2.so

附加題六 使用攝像頭或視頻運行ORB-SLAM2

1. 編譯ORBSLAM2,請給出它編譯完成的截圖。

![image-20200522171557820](D:\我的堅果雲\視覺SLAM\第一節 概述與預備知識\image\編譯ORBSLAM2截圖.png)

2. 修改工程

注意到,ORB-SLAM2 提供了若⼲數據集中的運⾏⽰例,這可以作為我們運行自己攝像頭程序的參考,因為它們很相似。對於數據集上的⽰例,ORB-SLAM2 會⾸先讀取數據集中的圖像,再放到SLAM 中處理。那么對於我們⾃⼰的攝像頭,同樣可以這樣處理。所以最方便的方案是直接將我們的程序作為⼀個新的可執⾏程序,加入到ORB-SLAM2 ⼯程中。那么請問,如何將myslam.cpp或myvideo.cpp 加⼊到ORB-SLAM2 工程中?請給出你的CMakeLists.txt 修改⽅案。

答:修改方案:修改ORBSLAM2的目錄下CMakeLists

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/myvideo)
add_executable(myvideo
Examples/myvideo/myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})

3. 運行ORBSLAM

現在你的程序應該可以編譯出結果了。但是我們現在還沒有談相機標定,所以你還沒辦法標定你的攝像頭。我們可以用⼀個不那么好的標定參數,先來試一試效果(所幸 ORB-SLAM2對標定參數不太敏感)。我為你提供了⼀個myslam.yaml(myvideo.yaml),這個文件是我們假想的標定參數。現在,用這個文件讓 ORB-SLAM2 運行起來,看看 ORB-SLAM2 的實際效果吧。請給出運行截圖,並談談你在運⾏過程中的體會。

![image-20200522191534063](D:\我的堅果雲\視覺SLAM\第一節 概述與預備知識\image\ORBSLAM運行截圖.png)

![image-20200522191424081](D:\我的堅果雲\視覺SLAM\第一節 概述與預備知識\image\運行myvideo.png)

體會

實驗過程中,我使用的是虛擬機,運行內存為3G,ORBSLAM2在運行myvideo的過程中,能夠保持24~40的關鍵幀,同時追蹤200個特征點,可見其能在計算量有限的情況下仍能追蹤到特征點,非常強大。

對於一個不那么准確的標定文件,依然能展現出一定的結果,表明ORBSLAM具有對於標定過程具有一定的魯棒性。我猜想這可能是因為單目相機的單一性,不需要考慮多個傳感器之間的協同。在我測試VINS的過程中則發現運行效果對標定的依賴性非常大。


免責聲明!

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



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