參考教材——《視覺SLAM十四講》高翔著
第一講 前言
筆記
- SLAM
- Simultaneous Localization And Mapping——同時定位與地圖構建
- 搭載特定傳感器的主體,在沒有環境先驗信息的情況下,在運動過程中建立環境的模型,同時估計自己的運動
- 本質——對運動主體自身和周圍環境空間不確定性的估計
- 模塊體系
- 視覺里程計
- 后端優化
- 建圖
- 回環檢測
習題
第二講 初識SLAM
筆記
-
單目SLAM
- 估計的軌跡和地圖,將與真實的軌跡、地圖,相差一個因子,也就是所謂的尺度(scale)
- 由於單目SLAM無法僅憑圖像確定這個真實尺度,所以又稱為尺度不確定性
-
雙目SLAM——Stereo
- 通過視差來測量物體與相機的距離,克服單目無法檢測距離的缺點
- 由兩個單目相機組成,兩個相機之間的距離(基線baseline)是已知的,我們可以通過基線來估計每個像素的空間位置
- 對雙目相機進行擴展可以得到多目相機,本質沒有區別
- 雙目相機測量到的深度范圍與基線相關,基線距離越大,能測量到的就越遠,因此一般雙目相機體積較大
- 缺點:
- 配置和標定均較為復雜,其深度量程和精度受雙目的基線與分辨率限制,而且視差的計算非常消耗計算資源,需要使用GPU&FPGA設備加速后才能實時輸出整張圖像的距離信息
- 因此當先雙目的主要問題是計算量無法解決
-
深度相機(RGB-D相機)
- 通過紅外結構光或者Time-of-Flight(ToF)原理,像激光傳感器那樣,通過主動向物體發射光並接受返回的,測出物體離相機的距離
- 相較於雙目相機,通過物理測量手段,可以節省大量的計算量
- 在SLAM方面主要用於室內
- 缺點:測量范圍窄,噪聲大,視野小,易受日光干擾,無法測量投射材質
-
傳統視覺SLAM流程
graph a[傳感器數據]-->b[視覺里程計]-->c[非線性優化]-->d[建圖] a[傳感器數據]-->e[回環檢測]-->c[非線性優化]- 視覺里程計(Visual Odometry,VO)
- VO又稱為前端(Front End)
- 估算相鄰圖像間相機的運動,以及局部地圖的樣子
- 只計算相鄰時刻的運動而和其他數據沒有關系,可以想象成一條金魚
- 僅通過VO來估計軌跡會不可避免地出現累計漂移(Accummulating Drift),當一個時刻的角度出現誤差時,之后的不管之后的數據多么精確,都會不可避免地產生誤差。因此為了解決累計漂移問題,需要引入后端優化和回環檢測兩種技術,回環檢測負責把“機器人是否走回原位”的事情檢測出來,后端優化則根據此信息校正整個軌跡的形狀
- 優化(Optimization)
- 又稱為后端(Back End)
- 接受不同時刻視覺里程計測量的相機位姿,以及回環檢測的信息,對他們進行優化,得到全局一致的軌跡和地圖
- 主要處理SLAM過程中噪聲的問題,即如何從這些帶有噪聲的數據中,估計整個系統的狀態,以及這個狀態估計的不准確性有多大————這被稱作最大后驗概率估計(Mazimum-a-Posteriori,MAP)
- 視覺SLAM中,前端和計算機視覺研究領域更加相關,比如圖像特征提取與匹配,而后端主要時濾波和非線性優化算法
- 回環檢測(Loop Closing)
- 又稱閉環檢測(Loop Closure Detection)
- 解決位置估計隨時間漂移的問題
- 判斷機器人是否曾經到達過先前的位置
- 可以通過圖像間的相似性來完成回環檢測,如果檢測到回環,會把信息提供給后端進行處理
- 建圖(Mapping)
- 根據估計的軌跡,建立與任務要求對應的地圖
- 度量地圖(Metric Map)
- 強調精確地表示地圖中物體的位置關系
- 通常用稀疏(Sparse)和稠密(Dense)對其進行分類
- 稀疏地圖進行了一定程度的抽象,並不需要表達所有物體,在地圖當中選取具有代表性的地標(Landmark)用於表示地圖,其他元素則全部忽略
- 稠密地圖着重於建模所有看到的東西
- 二維度量地圖時許多小格子(grid),三維度量地圖則是許多小方塊(Voxel),一個單位含有占據、空閑、未知三狀態,以表達格內是否由物體
- 拓撲地圖(Topological Map)
- 強調地圖元素之間的關系
- 數據結構為圖(Graph),由點、邊組成,只考慮節點間的連通性
- 放松了地圖對精確位置的需要,去掉地圖細節問題,是更為緊湊的表達方式
- 不擅長表達具有復雜結構的地圖
- 如果將工作環境限定在靜態、剛體、光照變化不明顯、沒有人為干擾的場景,那么SLAM系統應該是相當成熟的
- 視覺里程計(Visual Odometry,VO)
-
SLAM問題的數學表述
- 相機主要處理離散時刻的問題\(t = 1,...,k\),用x表示機器人自身的位置。各個時刻的位置標記為\(x_{1},...,x_{k}\),這些位置構成了軌跡
- 設地圖由多個路標(Landmark)組成,每個時刻,傳感器會測量到一部分路標點,得到它們的觀測數據
- 不妨設路標點共有N個,用\(y_{1},...,y_{N}\)表示
- 在此前提下可以描述
- 運動 —— 從k-1~k時刻,位置x如何變化
- 由此抽象出運動方程
- \(x_{k}=f(x_{k-1},u_{k},w_{k})\)
- \(u_{k}\)是運動傳感器讀數(輸入)
- \(w_{k}\)為噪聲
- 由此抽象出運動方程
- 觀測 —— 機器人在k時刻,於\(x_{k}\)處探測到某個路標\(y_{j}\)
- 由此觀測方程
- 機器人在\(x_{k}\)位置上看到某個路標點\(y_{j}\),產生了觀測數據\(z_{k,j}\)
- \(z_{k,j}=h(y_{j},x_{k},v_{k,j})\)
- \(v_{k,j}\)為觀測噪音
- 由此觀測方程
- 運動 —— 從k-1~k時刻,位置x如何變化
- 還可以使用參數化描述問題
- 位姿 —— 由兩個位置和一個轉角來描述
- \(x_{k}=[x,y,\theta]_{k}^{T}\)
- 運動傳感器能夠檢測到每兩個時間間隔位置和轉角的變化量\(u_{k}=[\varDelta_{x},\varDelta_{y},\varDelta_{\theta}]_{k}^{T}\)
- 則運動方程就可以具體化為\( \left[ \begin{array}{c} x\\ y\\ \theta\\ \end{array} \right] _k=\left[ \begin{array}{c} x\\ y\\ \theta\\ \end{array} \right] _{k-1}+\left[ \begin{array}{c} \varDelta x\\ \varDelta y\\ \varDelta \theta\\ \end{array} \right] _k+w_k \)
- 二維激光傳感器觀測一個2D路標點時,能夠觀測兩個量:路標點與機器人本體之間的距離r和夾角\(\phi\)
- 我們記路標點為\(y=[p_{x},p_{y}]^{T}\),觀測數據為\(z=[r,\phi]^{T}\)
- 為保持簡潔,省略下標
- 則觀測方程可以具體化為\( \left[ \begin{array}{c} r\\ \phi\\ \end{array} \right] =\left[ \begin{array}{c} \sqrt{\left( p_x-x \right) ^2+\left( p_y-y \right) ^2}\\ \arctan \left( \frac{p_y-y}{p_x-x} \right)\\ \end{array} \right] +v \)
- 位姿 —— 由兩個位置和一個轉角來描述
- 最終,SLAM過程可以總結為兩個基本方程:\( \left\{ \begin{array}{c} x_k=f\left( x_{k-1},u_k,w_k \right)\\ z_{k,j}=h\left( y_j,x_k,v_{k,j} \right)\\ \end{array} \right. \)
- 這兩個方程描述了最基本的SLAM問題:當我們知道測量讀數u,以及傳感器讀數z,如何求解定位問題(估計x)和建圖問題(估計y)
- 此時我們將SLAM問題建模成一個狀態估計問題:如何通過帶有噪聲的測量數據,估計內部的、隱藏的狀態變量?
- 問題的求解與兩個方程的具體形式以及噪聲服從哪種分布有關
- 運動和觀測方程是否為線性
- 噪聲是否服從高斯分布
- 可以分為
- 線性/非線性和高斯/非高斯系統
- 線性高斯系統(LG系統)是最簡單的,其無偏最優估計可以由卡爾曼濾波器(KF)給出
- 復雜的非線性非高斯系統(NLNG系統),我們會使用擴展卡爾曼濾波器(EKF)和非線性優化兩大類方法去求解
- 問題的求解與兩個方程的具體形式以及噪聲服從哪種分布有關
