編者按:本文來源《程序員》雜志 http://programmer.com.cn,授權36氪發布。
作者:張哲,紐約州立大學機器人方向博士,清華大學自動化系本科。研發方向:地圖重建、位置跟蹤、機器人自主避障導航、設備端和雲端的算法優化。2009-2014年在微軟,2014-2016年初在Magic Leap工作。
SLAM技術隨着最近幾年機器人、VR、AR的火爆而為人所知,在傳感器、算法、軟件、硬件等方向都有不同的進展。本文簡要解釋了SLAM的定義和分類,具體分析了當前VR、AR、機器人等各種應用需要什么類別的SLAM,探討了在實際應用中實現SLAM的一些工程細節,並展望了SLAM剛剛開始的未來。
什么是SLAM
SLAM是什么?根據Wikipedia的介紹:“Simultaneous Localization and Mapping (SLAM) is the computational problem of constructing or updating a map of an unknown environment while simultaneously keeping track of an agent’s location within it.”最簡單而又直指本質的理解,SLAM指的是當某種設備(如機器人、VR設備等)來到一個完全陌生的環境時,它需要精准地建立時間和空間的對應關系,並能完美地回答以下一系列問題:我剛才在哪里,現在在哪里?我看到了什么,現在看到的和之前看到的有哪些異同?我過去的行走軌跡是什么?我現在看到的世界是什么樣子,和過去相比有怎樣的變化?我的軌跡抖嗎,我的位置飄嗎?我還能跟蹤到自己的軌跡嗎,如果我丟了應該怎么辦?我過去建立的對世界的認識還有用嗎?我能在已有世界的抽象里快速對我現在的位置進行定位嗎?
SLAM的主要分類 robotic SLAM
從最早期軍事用途的雛形到后來的機器人應用,業界對SLAM有了進一步的研究。robotic SLAM主要包括卡爾曼濾波和粒子濾波。卡爾曼濾波在很多工程領域中都有應用,最早期用於機器人的卡爾曼濾波,默認系統是線性的且帶高斯分布的噪音,經典的卡爾曼濾波可以直接給出最優解,但現實比這復雜太多,所以有了卡爾曼濾波的很多變種。而如果不是線性系統或噪音不是高斯分布,那么粒子濾波算法生成很多粒子,並且每個粒子是模型狀態的一種可能,再根據觀察和更新得到粒子群的狀態趨於一致的收斂結果。當然粒子濾波也有實際的問題,比如經典的粒子衰減問題(particle depletion),和工程上如何控制准確性和收斂速度很好平衡的問題。
PTAM
PTAM(Parallel Tracking and Mapping)架構更多的是系統上的設計,姿態跟蹤(Tracking)和建立地圖(Mapping)兩個線程是並行的,這實質上是一種針對SLAM的多線程設計。PTAM在當前SLAM領域看來是小兒科,但在當時是一個創舉,第一次讓大家覺得對地圖的優化可以整合到實時計算中,並且整個系統可以跑起來。具體而言,姿態跟蹤線程不修改地圖,只是利用已知地圖來快速跟蹤;而在建立地圖線程專注於地圖的建立、維護和更新。即使建立地圖線程耗時稍長,姿態跟蹤線程仍然有地圖可以跟蹤(如果設備還在已建成的地圖范圍內)。這是兩個事情並行來做的一個好處,但很現實的問題是如果地圖建立或優化過慢,跟蹤線程很容易會因為沒有最新的地圖或者沒有優化過的地圖而跟丟。另外比較實際的工程問題是地圖線程的最新地圖數據應該lock還是copy data between threads以及threading的實現質量。
sparse SLAM
現在常說的sparse SLAM從架構上主要分為兩大類:filter based和keyframe based。這里的濾波比早年的robotic SLAM的濾波已經復雜很多,比較有代表性的是EKF SLAM,核心的思想是對非線性系統進行線性近似。最簡單的例子,如果是一個變量,那么就用當前模型值和導數來表達;如果多個變量,那么表達就是Jacobian Matrix。filter based的full scale SLAM需要注意filter state和計算時間的平衡,以及實際工程實現里面的矩陣分塊更新(高維度的稀疏矩陣取逆直接就爆了)。keyframe based SLAM的核心思想是關鍵幀(keyframe)的概念——因為每一張圖都用來建立或更新地圖計算量太大,從image stream里面選擇一些好的關鍵幀來建立並更新地圖——PTAM里的地圖建立就是從關鍵幀生成地圖。這種思路已經被業內普遍接受。但關鍵幀的提取本身就是一門很大的學問,伴隨而來的還有局部地圖和全局地圖的維護、更新和效率平衡。
dense SLAM
dense SLAM是另外一大類SLAM。這里說的sparse或dense指的是地圖點的稀疏或稠密程度。舉個簡單的例子,sparse map都是通過三角測量法算出來的,在一個卧室里有一千個點足夠了;但dense map一般是某種主動光源的深度傳感器(depth sensor,如英特爾的RealSense里面是ASIC)產生的,假設depth sensor每一幀的分辨率是640x480,即使有2/3的invalid depth,仍然有十萬個3D點,所以通常所說的sparse map和dense map相比至少差了兩個數量級。因為dense SLAM有足夠多的地圖信息,所以很適合用來做精細的3D重建。而如果dense SLAM要實時地從0到1邊建地圖邊跟蹤,就要把每一幀的可用像素的深度數據全部用來貢獻到建立地圖和跟蹤上。dense SLAM的代表是Kinect Fusion,到目前已經有很多變種和進化,如ElasticFusion和DynamicFusion等。
近年來的SLAM“變種人” DTAM - Dense Tracking and Mapping
DTAM繼承了關鍵幀的架構,但對關鍵幀的處理和傳統的特征點提取有很大的不同。相比傳統方法對每一幀進行很稀疏的特征點提取,DTAM的direct method在默認環境亮度不變(brightness consistancy assumption)的前提下,對每一個像素的深度數據進行inverse depth的提取和不斷優化來建立稠密地圖並實現穩定的位置跟蹤。用比較直觀的數字對比來說明DTAM和PTAM的區別:DTAM的一個關鍵幀有30萬個像素的深度估計,而PTAM一般的做法是最多一千個。DTAM的優缺點很明顯(具體對比見圖1):准、穩,但速度是問題,每一個像素都計算,確實容易通過GPU並行計算,但功耗和產品化的難度也都隨之升高。
圖1 兩種關鍵幀處理方式的比較,圖片來自Jakob Engel在ICCV 2015的PPT
Semi-Dense LSD SLAM - Semi-Dense Large Scale Direct SLAM這里要特別說明,LSD SLAM里semi的是像素數量,也就是說,只估計“有信息”的區域,而不是像DTAM那樣每個像素都估計,更簡單形象(但不是100%學術嚴謹)地說,只估計“有紋理”的地方,不估計令每一個做SLAM的人都害怕的終極大魔頭——“大白牆”部分。參見圖2,右上是semi-dense, 左下是sparse approach,右下是dense approach。估計深度的部分在原理上也是direct method,和DTAM類似,這里不做過多描述。速度上,semi-dense在一台只有酷睿i7處理器的電腦上是可以做到實時的。
圖2 semi-dense的不同,圖片來自Semi-Dense Visual Odometry for a Monocular Camera,Jakob Engel、Ju rgen Sturm和Daniel Cremers的ICCV 2013論文
VIO - Visual Inertial Odometry
VIO和之前的幾種SLAM最大的不同在於兩點:
首先,VIO在硬件上需要傳感器的融合,包括相機和六軸陀螺儀,相機產生圖片,六軸陀螺儀產生加速度和角速度。相機相對准但相對慢,六軸陀螺儀的原始加速度如果拿來直接積分會在很短的時間飄走(zero-drift),但六軸陀螺儀的頻率很高,在手機上都有200Hz。
其次,VIO實現的是一種比較復雜而有效的卡爾曼濾波,比如MSCKF(Multi-State-Constraint-Kalman-Filter),側重的是快速的姿態跟蹤,而不花精力來維護全局地圖,也不做keyframe based SLAM里面的針對地圖的全局優化(bundle adjustment)。最著名的商業化實現就是Google的Project Tango和已經被蘋果收購的Flyby Media,其中第二代Project Tango搭載了Nividia TK1並有主動光源的深度攝像頭的平板電腦,這款硬件可謂每個做算法的小伙伴的夢幻搭檔,具體在這里不多闡述。
在不同應用中用哪種SLAM
筆者一直以來的一個觀點是SLAM技術和別的技術一樣:一方面,從研究和開發的角度,技術需要達到一個較高的學術或工業標准;另一方面,技術本身必須落地到真正的產品中去,單純的技術上要達到100分當然也有它的意義,但一味追求技術或數學上的“美”而完全無視工程實現和產品化要求就很可能誤入歧途。在今天SLAM種類如此繁多細微細節如此復雜的情況下,微軟、蘋果、Google、Facebook等大公司憑借多年各方面積累和各種資源能夠負擔得起核心算法、軟件的研發,但廣大中小型公司或是之前沒在這方面布局的大公司,在急需這項技術時,需要想好自己的產品規划和具體需求再做決策。以下為SLAM在幾個不同方向或行業的應用:
VR產品:
VR的本質是讓用戶通過沉浸式的體驗來感受一個完全不同的虛擬世界,而SLAM是對真實世界的感知和理解,如果VR產品需要SLAM,那一定是虛擬世界和真實世界的結合。目前市場上除了三大廠(Oculws、索尼和HTC)有自己的“outside-in tracking”,大部分沒有“outside-in tracking”解決方案的VR產品只能通過六軸陀螺儀來跟蹤用戶的頭部轉動而不能跟蹤用戶的位移,但SLAM能解決六個自由度的跟蹤問題。另外,對於VR產品是否需要SLAM中的地圖(mapping)、什么形式什么場景有需要,也有待各方面進一步的思考。
AR產品:
AR的本質是虛擬元素在現實中的完美融合,相比於VR,AR產品無論算法、軟件的復雜度還是硬件的復雜度或者量產難度都增大了很多很多。對於AR來說,SLAM不是“最好能擁有”而是“必須擁有”。更進一步地說,SLAM作為感知世界的技術僅僅是AR產品“必須擁有”的技術中的一項,對世界的學習和解讀、顯示的內容、光學顯示的質量、硬件的舒適度以及硬件的量產能力等,也都是需要解決的,需要大量的人力物力財力能力和加班。
機器人產品:
比爾蓋茨曾在2007年新年展望了“A Robot in Every Home”的願景,如今已過去了將近十年,機器人已有太多種類,包括工業類、服務類、家庭類等等。但如果一款機器人需要自主性的探索,如定位、制作地圖、跟隨、監控、路徑規划、識別和應對等,那么SLAM也是“必須擁有”的。具體的SLAM種類也隨着機器人種類和應用的不同而千差萬別。
行業應用:
不同行業有不同行業的具體需求,比如兒童玩具類,如果只是跟蹤玩具卡片,那么marker-based tracking就應該能夠滿足基本的AR效果;比如一家房地產公司想實現VR看房,那么需要考慮給用戶帶來什么樣的體驗:360度高清全景圖還是3D mesh?如果是一個房子里面幾個位置的360度全景圖,那么並不需要SLAM,但如果是真正3D重建(dense reconstruction)模型,那么必須要稠密的地圖,而這種情況下需要考慮的是想讓用戶看的最低地圖分辨率要求是多少,因為現有的放在手機或平板上的3D攝像頭的分辨率一般也就是VGA(640x480),這種情況下重建出來的3D模型是沒有photorealistic那種效果。而如果不考慮計算時間和成本,那么高精度高准確性校准好的高端LiDAR+高清相機系統應該可以滿足非常好的體驗。再比如一家游戲公司要做一款VR或AR游戲,需要對用戶進行六個自由度的姿態跟蹤,那他需要很精准的位置信息和地圖信息,但這個地圖只是為了定位,所以准確快速更新的稀疏地圖就可以了。
SLAM在實際應用中的“愛恨情仇”
首先,SLAM對數學專業知識有一定的基本要求,包括矩陣、微積分、數值計算和空間幾何等,同時對計算機視覺的基礎知識也有一定的要求,包括特征點、地圖、multi-view geometry、bundle adjustment、filter和camera model等。這些知識都需要一定的基礎和積累,不過也不需要純數學專業背景。SLAM編程一般使用C++,如果針對某個特殊指令集或平台進行優化,可能需要知道SSE、NEON、GPU的一些知識和經驗,需要對系統設計有一定的經驗和感覺,需要比較靠譜的動手能力及寫代碼的能力和意願。總體而言,門檻就是一定的數學和工科背景、一定的計算機視覺的基礎知識、一定的編程基礎和經驗以及最關鍵的踏踏實實寫代碼的意願。
其次,SLAM強調實時和准確性。SLAM是一整套的大型系統,實時系統一般是多線程並發執行,資源的分配、讀寫的協調、地圖數據的管理、優化和准確性、一些關鍵參數和變量的不確定性和高速度高精度的姿態跟蹤(比如VR/AR應用必須要至少90fps才有可能解決眩暈和渲染效果)等,都是需要解決的挑戰。
再次,SLAM難在適應硬件,更難在系統整合。SLAM的數據來源於傳感器,而且越來越多的SLAM種類來源於多個傳感器融合,那么傳感器的質量對SLAM的效果影響很大。舉個例子,如果一套SLAM系統用了某款相機,該相機在一動不動而且光照環境完全不變時圖像噪點非常多,那么系統對穩定的姿態跟蹤影響就非常不好,因為特征點提取會很不一致。另一個很實際的例子,如果用多個傳感器(相機或六軸陀螺儀),如果時間戳不一致(至少毫秒級),也會很影響算法。多個傳感器的分別校准和互相校准,乃至整個系統幾十個上百個參數的調整,都是很實際很花時間的東西。
此外,在對數學有一定要求的同時,SLAM目前還有很多工程方面的問題,需要靜下心來一塊一塊地至少走兩遍踩各種坑並一一解決。如果只看已有代碼就覺得數學和算法盡在掌握,而動手時要么眼高手低要么根本不去寫代碼,這對真正要做產品研發的團隊而言是非常可怕的。當前多個領域因為硬件系統和產品應用之間差異很大,所以距離所有領域的SLAM都實現產品化還有很多的工作,但相信在不久的未來會有較大的突破。而由於SLAM的復雜特性和眾多的算法及其產品化仍然需要在SLAM的基礎上實現,可以預見和SLAM相關的產品研發在未來相當長一段時間內仍然需要大量人力和資源。
圖3 SLAM的未來才剛剛開始
SLAM剛剛開始的未來
在過去的兩年里,隨着VR、AR、機器人資本市場和消費者市場熱度的不斷升級,在SLAM相關的傳感器、算法、軟件、硬件等方向,小公司在關鍵細分領域快速創新、大公司在各個關鍵方向布局並且頻繁收購的趨勢越來越明顯。目前,軟件公司往硬件做,硬件公司往算法做,大公司渴望擁有自己的技術和硬件,小公司希望反應快執行力強地快速推進,SLAM相關各個領域的產品化的努力日新月異,所以有志布局在SLAM的大中型公司需要盡快行動,而對於初創公司,專注SLAM研發、產品化、深耕某個應用或行業都是可行的思路。
由於產品和硬件高度差異化,而SLAM相關技術的整合和優化又很復雜,導致算法和軟件高度碎片化,所以市場上目前還沒有一套通用普適的解決方案,在短時間內也不會有。正如前文所述,SLAM技術是對世界的感知和理解,是撐起VR、AR、機器人的骨骼,但骨骼搭起后離最終完美的用戶體驗仍有大量工作來做,SLAM的未來才剛剛開始。另一方面,移動端硬件的計算能力還遠遠不夠,所以SLAM相關技術可以而且正在從軟件和算法層面向硬件推動,筆者相信在這個過程中一定會成就一批新的公司。
從個人職業發展來說,筆者非常鼓勵志同道合的小伙伴們投入到VR、AR、機器人相關的計算機視覺和傳感器等領域中,在做非常有意思又有挑戰的事情的同時個人發展也隨着整個大潮流一起向上走,是非常好的選擇