從最開始接觸SLAM已經3年了,從二維雷射SLAM到三維雷射SLAM,再到視覺SLAM,都有一些接觸,現將簡單梳理一下SLAM的各個模塊的功能以及實現方式,為本系列文章起到個總領作用。
1 SLAM是什麼SLAM(simultaneous localization and mapping)的中文翻譯為 同步定位與地圖構建。目的有2個,一個是進行定位,一個是進行周圍環境的地圖的構建,二者相互依賴,只有同時進行求解才能夠解決這個問題。
為什麼一定要同時進行求解呢?人通過眼睛,通過手部等肢體的觸摸進行感知,從而了解周圍的環境,人的大腦自動的為周圍環境進行了模型搭建(地圖構建),所以人可以做到閉著眼睛通過感覺拿到水杯等物體。同時,人可以通過眼睛的感知,知道自己的手處於水杯的前方(定位),通過再向前伸手就可以碰到水杯,所以,當人看著水杯的時候,幾乎所有人都可以準確的拿到水杯。
機器人想要屋子裡進行導航,也是同樣的道理。首先通過雷射雷達,攝像頭等傳感器確定了周圍環境的地圖(地圖構建),當機器人向前走了1米,這時候再將周圍的環境建成地圖,而且要將地圖準確地放到之前建的地圖的相應位置處(定位)。
定位,是通過將當前傳感器感知到的環境信息與構建好的環境地圖進行匹配,確定機器人在當前地圖中的位置,只有地圖準確了,定位才能夠準確。
地圖構建,通過將當前傳感器感知到的環境信息構建成地圖,這時的地圖是要放到機器人當前位置處的,所以只有定位準確了,構建的地圖才能夠與真實環境相符合。
所以定位與地圖構建,二者相互依賴,必須要同時進行求解才能構建好地圖。
2 SLAM的目的或應用是什麼個人認為SLAM最大的應用就是建圖,通過SLAM的處理,獲得一個能夠在之後繼續使用的地圖。而由於SLAM本身包含了定位,當不保存地圖的時候,SLAM也可以當成個定位算法來用。
二維雷射SLAM構建的二維柵格地圖,可以用來做機器人的定位與導航。
三維雷射SLAM構建的三維點雲地圖,可以用來做無人車的定位與導航,也可以用來做三維建模。
視覺SLAM構建的稀疏點雲地圖,可以用來做定位。
視覺SLAM構建的半稠密與稠密的點雲地圖,可以用來做定位與導航,也可以用來做VR領域的交互場景,也可以用來做三維建模。
上圖為二維雷射SLAM構建的二維柵格地圖
上圖為三維雷射SLAM構建的三維點雲地圖
上圖為視覺SLAM(ORB-SLAM2)構建的稀疏點雲地圖
上圖為視覺SLAM構建稠密點雲地圖
眾所周知,目前階段,SLAM的框架大體上已經固定了,分為前端裡程計模塊,後端優化模塊,以及迴環檢測模塊。
接下來,我將簡要介紹這三個模塊的功能,以及實現每個模塊的方法。
3.1 前端裡程計3.1.1 什麼是前端裡程計機器人的輪子上有種叫做編碼器的傳感器,用於測量輪子具體走了多遠。前端裡程計也是同樣的目的,就是為了測量機器人從開始後到現在到底走了多遠,與初始位置處的相對距離和相對姿態(位姿)。
3.1.2 怎麼實現呢對於雷射SLAM來說,雷射雷達的頻率一般是10Hz-40Hz之間。我只要確定第一幀雷達數據與第二幀雷達數據的時間間隔內,機器人走了多遠,再確定第二幀到第三幀雷達數據的時間間隔內,機器人走了多遠(位姿變換),依次類推,我們就可以一直確定機器人到底走了多遠,確定機器人當前的位姿與初始時刻的相對位姿。
對於視覺SLAM來說,攝像頭的數據是一幀一幀的圖像,可能是RGB彩色圖像,也可能是彩色圖像加上深度圖像。一般的處理方法為在圖像中提取特徵點,然後確定特徵點在空間中的坐標值,通過這些特徵點,確定機器人在2幀圖像間的位姿變換,再確定第二幀圖像與第三幀圖像間的位姿變換,依次類推,就可以確定了機器人當前的位姿與初始時刻的相對位姿。
上述過程確定了機器人相對於初始時刻以及相對於每幀數據到來時的位姿變換,這個過程就是定位的過程。
3.1.3 具體實現方法對於雷射SLAM來說,求從前一幀雷達數據到當前幀雷達數據間的位姿變換,一般將這個過程稱為 掃描匹配(scan-matching) 過程。scan就是雷達的數據,通過與前一幀數據進行匹配,從而確定處位姿變換。
目前的掃描匹配方法為:
對於視覺SLAM來說,求從前一幀圖像到當前幀圖像間的位姿變換,一般將這個過程稱為 BA(Bundle Adjustment),求解BA的方法有很多,由於目前我對視覺SLAM了解不多,不在這裡進行更多的說明。
3.2 後端優化3.2.1 為什麼需要後端優化不管是使用編碼器得到的裡程計,還是前端計算出來的裡程計,都不是完全準確的。
即使選用的編碼器十分精確,當輪子在光滑的地面上出現打滑時(數據比實際值偏大)或者在輪子路過了一個坑或者土包時,都會導致裡程計的測量值與實際值不匹配。
同樣的,由於所有傳感器都是存在誤差的,我們通過前端裡程計計算出來的裡程計數值也一定是存在誤差的,而且這個誤差將隨著時間的增長而不斷增大。
這將導致機器人的位置與實際的位置相差的越來越大,最終導致機器人的位置與真實的位置不符,不能構建很好的地圖。
3.2.2 什麼是後端優化由於前端裡程計會有累計誤差,那有沒有一種方法可以將這種累計誤差減小甚至消除掉呢?
這就是後端優化的作用,通過圖結構,將機器人的各個位姿以及生成的地圖數據,進行聯合優化,通過優化求解,將所有的誤差平均分散到每個機器人位姿以及每個地圖數據上去,當我的優化過程十分完美的時候,這些累計誤差可以減小到可以忽略的地步。
對於雷射SLAM與視覺SLAM,他們的後端優化過程都是差不多的,都是通過圖結構來減小誤差,只不過由於傳感器的數據類型不同,具體的實現方法也不完全相同。
3.3 迴環檢測我們可以通過後端優化來減小位姿,那麼,有沒有一種比較強的約束來對優化的方程進行約束呢?
答案肯定是存在的,那就是迴環檢測。
當我們人類從公園的東門出發,轉了10分鐘之後再回到東門,我們可以輕而易舉的分辨出這就是之前我來過的地點,和之前的東門是同一個東門。
但是,對於機器人而言,同樣從東門出發,走了10分鐘。由於機器人的位姿是通過逐步累加得到的,這樣的計算存在累計誤差,當機器人再次回到東門時,有可能機器人認為自己還和東門差距20米。這20米就是機器人由於長時間定位產生的偏差。
我們可以通過某種手段,將當前傳感器感知的環境信息,與機器人之前構建的地圖相對比,如果匹配程度很高,則我們認為,機器人到了一個之前去過的地方,那麼當前的位置應該與之前路過這個位置時相距不會太遠(約束)。
我們可以將這個約束,輸入到後端優化過程中,當做一個新的並且十分強烈的約束,通過這個強烈的約束,當我們進行優化完成後,能夠大幅度的進行誤差的消除。
4 SLAM的發展4.1 高精確度地圖這是目前學術研究的重點,很多的工作量都是為了如何構建更準確,更精確的地圖。
4.2 長期環境下的建圖人們接觸的環境從來沒有一成不變的,但是我們每次進行SLAM保存的地圖都是不會再變換的,如何在不佔資源的情況下,一邊運行著導航任務,一邊將之前的地圖進行更新,也是一個研究重點。目前已經有幾家公司可以做到。
4.3 減小計算量目前的各個SLAM算法都有著不小的計算量,如果要是能夠實時運行稠密地圖的構建,那麼將會把VR領域抬到一個新的高峰。這也是我一直關注這VR領域的原因。
4.4 語義SLAM人們可以通過眼睛來感知環境的同時,識別出能看到的物體的名字與種類。語義SLAM同樣可以做到這樣,具有語義標籤的環境地圖將會對導航產生更大的幫助。
4.5 感知代替SLAM當機器人的理解能力逐步提升,我們就不需要再去單純地構建地圖,機器人所見即可為一個地圖,像人一樣的感知周圍環境,即可確定自身位置,這就不再需要去保存地圖。
總結本文將我自己理解的雷射SLAM與視覺SLAM進行簡單說明,由於認知有限,如有錯誤請見諒,並於公眾號中回復告知,十分感謝。
下篇文章將簡要介紹本系列文章寫的主要方向與要實現的功能。