一個循環,永遠運轉
機器人永遠無法精確知道自己在哪裡。它持有一個信念——一個鋪在所有可能位置上的機率分布——而它在每一個時鐘節拍要做的全部工作,就是讓這個信念保持誠實。貝氏濾波正是做到這一點的配方,它只有兩個永遠重複的動作:預測,然後修正。
想像你在黑暗中穿過自己的家。你朝著你認為門口所在的方向邁出一步——這是預測,依據的是你的腿執行的指令。接著你的手蹭到了牆——這是一次感測器讀數,它讓你對所處位置的感覺變得更清晰。預測、感知、循環。貝氏濾波不過是把這個習慣寫得足夠精確,讓電腦每秒能運行幾千次。
濾波器依賴的兩個模型
迴圈的每個動作都由兩個模型之一驅動。運動模型(有時稱為過程模型)回答的是:在我原本相信的位置上,加上我剛發給輪子的指令,我現在應該出現在哪裡?它刻畫了狀態在一個時間步內如何演化。
觀測模型(或測量模型)則朝反方向運轉:如果我真的位於某個位置,我的感測器應該產生什麼讀數?比如一個測牆距的感測器,靠近牆時會報出一個小數值,在空曠處則報出一個大數值。當一個新讀數到來時,濾波器會問哪些候選位置能解釋這個讀數,並偏向它們。
兩個模型都不完美,而濾波器對此心知肚明。每條指令都會略有偏差——輪子在灰塵上打滑、齒輪有間隙——每個感測器也都會略微撒謊。這種對不完美的誠實承認就是過程雜訊與測量雜訊,把這些雜訊的大小估個八九不離十,幾乎比其他任何事都更重要。
看著信念呼吸:一維走廊
把一切簡化成一個待在筆直走廊裡的機器人,它唯一在意的就是自己沿走廊的位置。它的信念現在是一條簡單的曲線:又高又窄表示「我相當確定自己在這裡」,又低又寬表示「我可能在這段走廊的任何地方」。看看這兩個步驟各自如何改變這條曲線。
- 預測。機器人發出指令「前進 1 公尺」。整條信念曲線沿走廊滑動 1 公尺——同時它也變寬變矮,因為輪子可能打滑了。僅憑自己的猜測移動,總會讓你更不確定。
- 感知。一個門偵測器觸發了,機器人知道走廊上有三處裝著門。觀測模型在這三個位置附近抬高信念,在別處把它壓平。
- 修正。濾波器把預測曲線乘上感測器曲線。兩者一致之處,結果又高又窄;兩者不一致之處,結果塌縮到接近零。攤開的信念被收緊成一個自信的尖峰。
- 循環。機器人繼續行駛,曲線在下一次預測時再次攤開,而下一次看到門又把它收回。經過幾個循環,三扇門之間的歧義就收斂成一個唯一而自信的答案。
這種呼吸的節律——預測時變寬、感知時收緊——就是每一個估計器的心跳。預測花掉確定性以在時間上向前邁進;感知則用真實證據把確定性買回來。只會預測的機器人(純航位推算)只能眼睜睜看著信念模糊到毫無用處;而濾波器能讓它始終保持清晰。
loop forever each tick: # 1. PREDICT using motion model + command u belief = move(belief, u) # slides and widens # 2. CORRECT using observation model + reading z belief = belief * likelihood(z) # reweights belief = normalize(belief) # rescale to sum 1
你接下來會遇到的那些濾波器之母
走廊版本把信念存成一列「桶子」,對一條走廊夠用,但對一個在二維倉庫裡遊走、有成千上萬格子的機器人就毫無指望了。你接下來要學的那些著名濾波器,無非是用更聰明的方式來表示和更新同一個信念,從而繞開這種蠻力網格。
卡爾曼濾波做了一個大膽的假設——信念永遠是一條單一的鐘形曲線——於是預測和修正就化為幾行矩陣代數,快到足以勝任最緊湊的控制迴路。當機器人的運動或感測器太「彎」、裝不進一條直線鐘形曲線的故事時,擴展型和無跡型變體會彎折這個假設來貼合現實。
粒子濾波則走了另一條路:它保留了走廊版本的誠實——一個可以同時擁有好幾個峰的信念,正是三扇門看起來一模一樣時你所需要的——但用一群採樣出來的猜測點而非網格來表示它。同樣的預測-修正迴圈,不同的記帳方式。