深蓝学院-视觉SLAM十四讲-第一章作业
目錄
- 第1章作業
- 1. 熟悉Linux
- `請描述apt-get 安裝軟件的整體步驟,說明Ubuntu 是如何管理軟件依賴關系和軟件版本的。`
- `什么是軟件源?如何更換系統自帶的軟件源?如何安裝來自第三方軟件源中的軟件?`
- `除了apt-get 以外,還有什么方式在系統中安裝所需軟件?除了Ubuntu 以外,其他發行版使用什么軟件管理工具?請至少各列舉兩種。`
- `環境變量PATH 是什么?有什么用途?LD_LIBRARY_PATH 是什么?指令ldconfig 有什么用途?`
- `Linux 文件權限有哪幾種?如何修改一個文件的權限?`
- `Linux 用戶和用戶組是什么概念?用戶組的權限是什么意思?有哪些常見的用戶組?`
- `常見的Linux 下C++ 編譯器有哪幾種?在你的機器上,默認用的是哪一種?它能夠支持C++ 的哪個標準?`
- 2. SLAM綜述文獻閱讀
- `SLAM 會在哪些場合中用到?至少列舉三個方向。`
- `SLAM 中定位與建圖是什么關系?為什么在定位的同時需要建圖?`
- `SLAM 發展歷史如何?我們可以將它劃分成哪幾個階段?`
- `從什么時候開始SLAM 區分為前端和后端?為什么我們要把SLAM 區分為前端和后端?`
- `列舉三篇在SLAM 領域的經典文獻。`
- 3. CMake練習
- 4. gflags, glog, gtest的使用
- 5. 理解ORB-SLAM2框架
- 6. *使用攝像頭或視頻運行ORB-SLAM2
- 習題講解補充內容
- CMake練習
第1章作業
1. 熟悉Linux
請描述apt-get 安裝軟件的整體步驟,說明Ubuntu 是如何管理軟件依賴關系和軟件版本的。
注:閱讀了鳥哥私房菜第23章的內容,該章主要講述了RPM機制的軟件安裝方式。而ubuntu使用dpkg機制的軟件安裝方式,本人平時只是使用apt-get安裝軟件,并沒有深入了解背后的安裝原理,所以本題參考了ubuntu APT-GET工作原理 進行作答。
使用apt-get安裝軟件主要分為四步:
- 掃描本地存放的軟件包更新列表(由“apt-get update”命令刷新更新列表,也就是/var/lib/apt/lists/),找到最新版本的軟件包;
- 進行軟件包依賴關系檢查,找到支持該軟件正常運行的所有軟件包;
- 從軟件源所指 的鏡像站點中,下載相關軟件包;
- 解壓軟件包,并自動完成應用程序的安裝和配置。
Ubuntu 是如何管理軟件依賴關系和軟件版本:
? 有時候在Ubuntu下安裝軟件包時會遇到提示說,下列軟件包有未滿足的依賴關系這樣的問題。實際上linux的包是開源的,而這些包的編輯者大多數是一些大神為了方便使用某個功能編寫的。恰好某個復雜功能里用到了這個小功能,那么作為程序員肯定是直接調用現成的。依賴的意思就是你用這個復雜功能之前需要使用某個包或者調用某個包。
? 這里引入一個APT包管理工具的概念,Ubuntu上用與Debian一樣的Deb軟件管理工具,apt-get就是Ubuntu的Deb軟件管理工具,即APT包管理工具。這個軟件會從Ubuntu的軟件源庫里調用安裝所需要安裝的包,而且可以自動分析和解決依賴關系,并且將所依賴的軟件都搞定。Ubuntu如果想安裝指定版本的軟件,可以在安裝時在安裝包名后邊指定所要安裝的版本即可。
什么是軟件源?如何更換系統自帶的軟件源?如何安裝來自第三方軟件源中的軟件?
軟件源(軟件倉庫)一般指debian系操作系統的應用程序安裝包倉庫,其中存放大量的軟件包,apt會從軟件源中下載軟件,在/ect/apt/soure.list中可以為apt配置軟件源。
其實在Ubuntu中軟件源還細分為兩種:Ubuntu官方軟件源和PPA軟件源
? Ubuntu 官方軟件源中包含了 Ubuntu 系統中所用到的絕大部分的軟件,它對應的源列表是 /ect/apt/soure.list。在這個文件中,記錄了 Ubuntu 官方源的地址。像我們平時常用的清華源、阿里源等鏡像地址,它其實和 Ubuntu 官方的鏡像是相同的,我這里做了替換主要是為了加快 apt 安裝和更新軟件源的速度。
? PPA 源出現的背景是因為系統自帶的源是很有限的,我們肯定需要一些其他的軟件包然而如果是直接下載deb格式的文件的話,又不能獲取到更新和維護,所以這就用到了十分重要的 PPA 源了。
如何更新系統自帶的軟件源
#這里盡量添加新的軟件源,而不要刪除掉原來自帶的ubuntu軟件源 sudo gedit /etc/apt/sources.list 添加源 #國內開源鏡像站點匯總 https://www.asfor.cn/server/mirror/index.html sudo apt-get update安裝來自第三方軟件源中的軟件
我用的是Ubuntu18.04系統,安裝搜狗拼音時直接下載deb安裝包,用dpkg進行安裝,使用 sudo apt install -f 進行修復,對于安裝第三方軟件沒有什么特別的要求。但Ubuntu 16.04 自帶的軟件中心對第三方軟件安裝非常不友好,需要先安裝gdebi工具,然后使用此工具進行第三方軟件的安裝。
除了apt-get 以外,還有什么方式在系統中安裝所需軟件?除了Ubuntu 以外,其他發行版使用什么軟件管理工具?請至少各列舉兩種。
我知道的Ubuntu軟件安裝主要有以下幾種方式:
-
下載deb格式文件進行離線安裝;使用dpkg命令進行安裝和卸載deb安裝包。
-
apt-get方式在線安裝;主要用于在線從互聯網的軟件倉庫中 搜索、安裝、升級、卸載 軟件。
-
make方式安裝;對于某些軟件倉庫沒有的庫或者安裝包,或者下載過慢的這種情況,我們可以選擇直接下載其源碼,然后進行源碼安裝。通常分為四步:配置–>編譯–>安裝–>清除臨時文件。
-
pip或者conda安裝;這種方式并不是ubuntu自帶的安裝工具,但在特定的環境下需要使用這兩種安裝方式。
其它發行版本的軟件管理工具:
? Archlinux使用pacman進行軟件包管理
環境變量PATH 是什么?有什么用途?LD_LIBRARY_PATH 是什么?指令ldconfig 有什么用途?
環境變量PATH:系統通過PATH這個環境變量來獲得可執行文件所在的位置,然后運行一下對應的可執行文件。
LD_LIBRARY_PATH:程序已經成功編譯并且鏈接成功后,使用LD_LIBRARY_PATH來搜索目錄,該變量中只有動態庫有意義。
Idconfig的作用:
ldconfig是一個動態鏈接庫管理命令,為了讓動態鏈接庫為系統所共享,還需運行動態鏈接庫的管理命令–ldconfig。Idconfig的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(lib.so),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為 /etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表。
Linux 文件權限有哪幾種?如何修改一個文件的權限?
文件權限是指文件的訪問控制,即那些用戶和組群可以訪問文件以及可以執行什么樣的操作。默認情況下文件或目錄的創建者即為該對象的屬主。屬主對文件或者目錄有特別的操作權限。
訪問權限規定三種不同類型的用戶:
- 文件屬主(Owner): 文件的所有者,稱為屬主。
- 同組用戶(Group):文件屬組的同組用戶。
- 其它用戶(Others):可以訪問文件的其他用戶。
訪問權限的表示方法有三種,即三組九位字母表示法、三組九位二進制表示法和三位八進制表示法。其中用r表示讀,用w表示寫,用x表示可執行可查找,用-表示無權限。
文件權限的修改方法:
修改文件權限的命令是chmod,執行該命令要求必須為文件屬主或者是root用戶才能使用。有兩種修改方法,字母形式修改權限;數字形式修改權限。
- 字母形式修改權限;即“用戶對象 操作符號 操作權限”
- 數字形式修改權限
Linux 用戶和用戶組是什么概念?用戶組的權限是什么意思?有哪些常見的用戶組?
Linux操作系統是多用戶的分時操作系統,具有功能強大的用戶管理機制,它將用戶分為組,每個用戶都屬于某個組,每個用戶都需要進行身份驗證,同時用戶只能在所屬組所擁有的權限內工作,這樣不僅方便管理,而且增加了系統的安全性。
**用戶:**分為普通用戶、管理員用戶(root用戶)和系統用戶。普通用戶在系統上的任務是進行普通的工作,root用戶對系統具有絕對的控制權,但操作不當會對系統造成損毀。所以在進行簡單任務是進行使用普通用戶。
**用戶組:**用戶組是用戶的容器,通過組,我們可以更加方便的歸類、管理用戶。用戶能從用戶組繼承權限,一般分為普通用戶組,系統用戶組,私有用戶組。當創建一個新用戶時,若沒有指定他所屬于的組,系統就建立一個與該用戶同名的私有組。當然此時該私有組中只包含這個用戶自己。標準組可以容納多個用戶,若使用標準組,在創建一個新的用戶時就應該指定他所屬于的組。
常見的Linux 下C++ 編譯器有哪幾種?在你的機器上,默認用的是哪一種?它能夠支持C++ 的哪個標準?
gcc和g++。我的電腦中默認用的是g++,它支持c++11標準。
2. SLAM綜述文獻閱讀
SLAM 會在哪些場合中用到?至少列舉三個方向。
SLAM的應用場景主要有以下幾個方向:
- SLAM技術可用于增強現實(AR, Augmented reality),增強現實是一種在現實場景中無縫融入虛擬物體的一種技術,比如京東或者淘寶一些店鋪提供的在線試鞋服務,抖音等提供的一些AR特效服務,利用平板可以觀察選中的家具在自己房間擺放和搭配的效果。
- SLAM在自動駕駛領域的應用,如無人駕駛利用激光雷達傳感器來獲取地圖數據,構建地圖,規避路程中遇到的障礙實現路徑規劃。
- SLAM在機器人領域的應用,如掃地機器人等。
- 無人機領域,無人機在飛行過程中需要知道哪里有障礙物,該怎么規避,怎么重新規劃路線,顯然需要用到slam技術。
SLAM 中定位與建圖是什么關系?為什么在定位的同時需要建圖?
定位是為了精確地確定當前設備在某個環境中的姿態和位置;建圖將周圍環境的觀測部分整合到一個單一的模型中。最初定位和建圖是兩個相互獨立的關系,后來發現這兩個步驟是相互依賴的。建圖的準確性依賴于定位精度,而定位的實現又離不開精確的建圖。
SLAM強調在未知環境下進行整個過程,如果在未知環境下進行定位,首先需要能夠識別并理解周圍的環境。再利用環境中的外部信息作為定位的基準,所以需要對所處的環境進行建圖。
SLAM 發展歷史如何?我們可以將它劃分成哪幾個階段?
概率SLAM問題最早起源于1986年在舊金山舉辦的IEEE機器人自動化會議中。經過幾年的深耕,Smith等人發表了具有里程碑意義的論文。在最早提出SLAM的一系列論文中,當時的人們稱它為“空間狀態不確定性的估計”。而SLAM這一概念最早由Hugh Durrant-Whyte 和 John J.Leonard提出。SLAM主要用于解決移動機器人在未知環境中運行時定位導航與地圖構建的問題。從SLAM的提出到現在已有三十多年,大致劃分為以下幾個階段:
參考文獻:
[1] H. Durrant-Whyte and T. Bailey, “Simultaneous localization and mapping: part I,” in IEEE Robotics & Automation Magazine, vol. 13, no. 2, pp. 99-110, June 2006, doi: 10.1109/MRA.2006.1638022.
[2] 劉明芹,張曉光,徐桂云,李宗周.單機器人SLAM技術的發展及相關主流技術綜述[J].計算機工程與應用,2020,56(18):25-35.
從什么時候開始SLAM 區分為前端和后端?為什么我們要把SLAM 區分為前端和后端?
SLAM系統結構出現前后端應該是在出現基于視覺的SLAM方法之后,推測應該是在2010年之后,具體何時出現明確的前后端區別,我還不太清楚。
SLAM系統的體系結構包括兩個主要部分:前端(或者叫視覺里程計)與后端。前端將傳感器數據抽象成適用于估計的模型,估算相鄰圖像間相機的運動,以及局部地圖的樣子;而后端在這些經由前端處理的抽象數據上執行推理。后端接受不同時刻視覺里程計測量的相機位姿,以及回環檢測的信息,對它們進行優化,得到全局一致的軌跡和地圖。前后端所實現的功能不同,目的不同。
列舉三篇在SLAM 領域的經典文獻。
[1] Mur-Artal R, Montiel J M M, Tardos J D. ORB-SLAM: a versatile and accurate monocular SLAM system[J]. IEEE transactions on robotics, 2015, 31(5): 1147-1163.
[2] 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.
[3] Durrant-Whyte H, Bailey T. Simultaneous localization and mapping: part I[J]. IEEE robotics & automation magazine, 2006, 13(2): 99-110.
3. CMake練習
參考資料:CMake Practice.pdf文檔
1-4題
閱讀CMake Practice.pdf后,開始組織代碼文件和編寫CMakeLists.txt。之前也并沒有怎么接觸過CMakeLists.txt編寫,所以在初步編寫是也出現了各種各樣的問題。經過,出錯->再看書->出錯->網上搜->編寫,最后終于可以運行1-4要求的格式。
代碼的組織架構如下圖所示:
cmd運行指令:
mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. make sudo make install ./sayHello運行結果截圖:
5.為我的庫提供 FindHello.cmake 文件
遇到的問題1:cmake無法找到FindHELLO.cmake文件
網上查找資料,最后發現CMakeLists.txt文件中,下面的FIND_PACKAGE(Hello REQUIRED)這句代碼中,Hello需要與FindHello.cmake的大小寫匹配才可。修改后可正常運行,截圖如下,最后運行./sayHello可正常運行。其中FindHello.cmake和CMakeLists.txt的編寫代碼文件可見。
?
4. gflags, glog, gtest的使用
參考資料:https://zhuanlan.zhihu.com/p/108477489
https://blog.csdn.net/alwaysrun/article/details/108418769
? 1.gflags, glog, gtest的安裝
使用命令行安裝最簡單,但是版本可能比較老。使用源碼編譯安裝,安裝步驟復雜,但可靠穩定。
使用命令行安裝:
如果要刪除的話,執行下邊的命令
sudo apt-get remove libgflags-dev sudo apt-get remove libgoogle-glog-dev sudo apt-get remove libgtest-dev使用源碼編譯安裝:
gflags的安裝
git clone https://ghproxy.com/https://github.com/gflags/gflags.git gflags_stable cd gflags_stable mkdir build cd build cmake .. -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC .. make sudo make installglog的安裝
git clone https://ghproxy.com/https://github.com/google/glog sudo apt-get install autoconf automake libtool cd glog mkdir build cd build cmake .. make sudo make install初次編譯glog時如果出錯,如下圖所示,網上搜索解決方案,需要把glfag編譯成動態庫或者使用apt-get方法進行安裝。
重新執行gflags的安裝過程,將gflag編譯成動態鏈接庫 cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/ ..gtest安裝
git clone https://ghproxy.com/https://github.com/google/googletest.git cd googletest mkdir build cd build cmake .. make sudo make install代碼編寫過程
2-3題:我直接將sayHello函數放入了useHello.cpp代碼中,具體代碼編寫和CMakeLists.txt編寫見代碼文件。最后的日志文件如下圖所示。
由于本人能力有限,gtest的編寫過程理解不深,沒能寫出來。
5. 理解ORB-SLAM2框架
? 1.ORB-SLAM2下載完成終端截圖
-
ORB-SLAM2將編譯出什么結果?有幾個庫文件和可執行文件?
CMakeLists.txt的51-71行:代碼將由19個.cc文件生成一個動態鏈接庫,在/lib文件夾下的libORB_SLAM2.so文件;
85-86行:將會產生一個可執行文件 rgbd_tum;
91-92行:將會產生一個可執行文件 stereo_kitti;
95-96行:將會產生一個可執行文件 stereo_euroc;
102-103行:將會產生一個可執行文件 mono_tum;
106-107行:將會產生一個可執行文件 mono_kitti;
110-111行:將會產生一個可執行文件 mono_euroc。
-
ORB-SLAM2 中的 include, src, Examples 三個文件夾中都含有什么內容?
include和src文件夾下是一些需要編譯成動態鏈接庫文件的頭文件和源代碼。其中Tracking.cc主要是從圖像中提取ORB特征;LocalMapping.cc這部分用來完成局部地圖構建。LoopClosing.cc分為兩個過程,分別是閉環探測和閉環校正。
Examples:此目錄下是Monocular(單目)、RGB-D、ROS和Stereo文件
-
ORB-SLAM2 中的可執行文件鏈接到了哪些庫?它們的名字是什么?
以stereo_kitti為例,可執行文件鏈接到了變量${PROJECT_NAME}$,而此變量是src文件夾下的代碼文件構建的動態鏈接庫 libORB_SLAM2.so。
另外還有OpenCV_LIBS、EIGEN3_LIBS、Pangolin_LIBRARIES、libDBoW2.so、libg2o.so庫文件。
6. *使用攝像頭或視頻運行ORB-SLAM2
? 1.編譯 ORB-SLAM2截圖,因為之前安裝過pangolin、opencv和eigen3等庫,所以在編譯這一步沒有出什么大的問題,且參照群里對于usleep的錯誤解決方案,解決了這個問題。
#執行編譯的命令 cd ORB_SLAM2 chmod +x build.sh ./build.sh? 2. 如何將 myslam.cpp或 myvideo.cpp 加入到 ORB-SLAM2 工程中?請給出你的 CMakeLists.txt 修改方案。
如下圖所示,在Examples文件夾中創建Task7文件夾,將提供的代碼myvideo.cpp等放置到Task7文件夾下。
CMakeLists.txt文件編寫:
在ORB-SLAM2原CMakeLists.txt文件基礎上,添加如下命令
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Task7) add_executable(myvideoExamples/Task7/myvideo.cpp) target_link_libraries(myvideo ${PROJECT_NAME})初次運行時報出如下錯誤,懷著忐忑的心情在群里@了助教韓爽,后來經過提示發現原來是myvideo.cpp中一些路徑問題沒有修改對。這里要特別感謝助教們的熱心解答,即便是在中秋節也很熱心的在群里幫助大家解決問題。感謝!!
成功運行orb-slam2的測試文件,如下圖所示:
習題講解補充內容
CMake練習
使用MESSAGE進行Debug
指定編譯路徑:
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output)gflags, glog, gtest的使用
github地址: https://github.com/ximing1998/slam-learning.git
國內gitee地址:https://gitee.com/ximing689/slam-learning.git
總結
以上是生活随笔為你收集整理的深蓝学院-视觉SLAM十四讲-第一章作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多层描边字体设计
- 下一篇: 树莓派摄像头使用 motion + fr