JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

SLAM 的先有雞還是先有蛋

定位需要地圖,建圖需要位姿;SLAM 同時解決這兩者,本文講清這個循環如何自洽。

兩個互相依賴的問題

想像你在一棟陌生的大樓裡醒來,沒有地圖,也不知道身在何處。要弄清自己在哪,你得拿眼前所見去比對一張地圖——可你沒有地圖。於是你改為親手畫一張,邊走邊把每個房間畫下來。但要把房間畫在圖上的正確位置,你得知道自己看到它時站在哪——而這恰恰是你不知道的。兩件事都在等對方先動手。

這就是先有雞還是先有蛋這一悖論的核心。定位,即算出機器人在哪,通常假定你已經有一張可供比對的地圖建圖,即構建對世界的模型,通常假定你已經知道機器人的位姿,這樣每次測量才能放到正確位置。有地圖,找位姿就容易;知道位姿,畫地圖也容易。兩樣都沒有,看上去就卡住了。

同時定位與建圖(SLAM)跳出這個陷阱的辦法,是乾脆不去選誰先來。它不先求位姿再求地圖,而是把兩者放在一起求解,當作一個彼此纏繞的大估計,隨著機器人移動不斷擴展、不斷收緊。這個訣竅並非魔法——它依靠的是這樣一個事實:每一次新測量都會同時透露一點點關於地圖的資訊和一點點關於位姿的資訊。

同時求解兩者

走出這個循環的辦法是自舉。機器人先信任自己的運動。車輪轉動、慣性感測器,或匹配的相機幀,能給出里程計——對自上一時刻以來移動了多遠、朝哪個方向的一個滾動估計。這足以得出一個粗略的初始位姿,從而把最初的觀測擺成一張粗略的初始地圖。地圖很晃,位姿也很晃,但兩者都不再是空白了。

從那以後,兩個估計便互相牽引。單靠里程計會漂移:每一步的小誤差不斷累積,走久了機器人對自身位姿的判斷可能偏出好幾公尺。但當機器人看到一面先前已建圖的牆時,那個舊地圖特徵就像一個錨點,把漂移的位姿拉回來。作為回報,更準的位姿又讓機器人修正每個地圖特徵的真實位置。一輪又一輪,二者彼此修補。

這也解釋了為何回到已知地點如此有力。當機器人認出一處很久以前到過的地方——即迴環偵測——它能把一整段漂移的軌跡一下子拉回對齊,而這一修正會順著共享的不確定性流過去,把地圖也一併修好。在對的位置上一次好的觀測,就能理清積攢了好幾分鐘的誤差。

前端與後端

真正的 SLAM 系統會把工作分成扮演截然不同角色的兩半。這種劃分為前端與後端,是整個領域裡最有用的心智模型之一,因為它把讀取感測器這件雜亂的活,與處理幾何這件乾淨的活分了開來。

  1. 前端直面原始數據。它從每一幀裡抽出有辨識度的東西——相機影像裡的角點、雷射掃描裡的邊緣——並把它們和之前所見做匹配。對一套 LiDAR 系統,它可能用迭代最近點把兩次掃描對齊;對相機,則跨幀追蹤視覺特徵。它的輸出是一串約束:「相對一刻之前的位置,我大概在這兒」,以及「這個特徵就是我先前看到的那個」。
  2. 後端直面幾何。它拿起那一堆約束,找出唯一一條能盡可能契合所有約束的軌跡與地圖,並溫和地否決任何單個含噪的測量,轉而採信整張網路所一致認同的結果。現代後端通常把這表述為位姿圖最佳化,或表述為因子圖,其中位姿和地標是節點,每條約束是一條把它們拉向一致的邊。

決定成敗的那個安靜步驟:資料關聯

上面所有內容都立在一個明擺著卻容易被忽視的假設上:前端正確地判定每一個新觀測對應於它之前見過的哪樣東西。這就是資料關聯問題,它是那個不聲不響、卻決定整個系統成敗的步驟。判對了,後端就有乾淨的約束去最佳化;判錯了,你就給偵探遞了一張偽造的便條。

危險在於世界充滿了相似之物。兩條辦公走廊、兩根一模一樣的柱子、兩段平淡的白牆,都能騙過匹配器,讓它以為機器人身處某個並不在的地方。僅僅一次錯誤匹配——比如,在兩個不過是長得像的地方之間宣布一次錯誤的迴環偵測——就能把整張地圖扯進一道再也無法挽回的褶皺。正因如此,對著一張乾淨的地標地圖做關聯,並用幾何(而不只是外觀)來確認匹配,才如此重要。

好的系統對資料關聯深懷戒心。它們要求一次匹配不僅在特徵長什麼樣上吻合,還要在「以當前位姿估計來看它本應在哪」上吻合;它們剔除任何無法用自洽幾何解釋的離群點;它們寧可保持存疑,也不輕易認定一個可能錯誤的猜測。SLAM 那個精巧的循環彌合了先有雞還是先有蛋的裂縫——但前提始終是:它把對的蛋配給了對的雞。