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

鐘形曲線與卡爾曼濾波

當不確定性是一條規整的鐘形曲線時,預測—更新循環就化作著名的卡爾曼濾波,其增益負責在猜測與測量之間權衡。

用兩個數就能攜帶的信念

機器人很少確切知道自己在哪裡,它持有的是一個信念:一整片「每個可能位置有多大機率」的分佈圖景。一般來說,這片圖景可以是任意雜亂的形狀,老老實實地存下來可能需要一張龐大的數值表。讓即時濾波成為可能的訣竅,是假設這片圖景是一條高斯分佈——也就是你在考試成績圖上見過的那條光滑、對稱的鐘形曲線

鐘形曲線的描述成本低得驚人,你只需要兩樣東西:一個均值,即曲線的峰頂,也就是你的單一最佳猜測;以及一個展寬,即曲線有多寬,用來表達你有多不確定。又高又窄的鐘形意味著「我相當確信自己就在這裡」;又矮又寬的鐘形則意味著「大概就在這附近,但到底在哪說不準」。

當狀態同時包含好幾個數——比如 x、y 和朝向——這個展寬就長成了一個協方差矩陣。它的對角線存放每個變量各自的不確定性;非對角線項則刻畫各變量如何彼此牽連。一個寫著「x 與朝向相關」的非對角線項,意味著對其中一個的測量會悄悄地讓你對另一個的認識也變得更清晰。

為什麼鐘形曲線能給出乾淨的公式

隨時間追蹤一個信念的通用配方是遞迴貝氏估計:讓信念順著機器人的運動向前預測,再用每一個新測量去修正它,如此永遠循環。難點在於,對於任意形狀的信念,要精確地做到這一點,就意味著要計算一些棘手的積分——在一台小機器人上是無法以閉式求解的。

高斯分佈有一個能拯救我們的神奇性質。如果你的信念是一條鐘形曲線,機器人的運動是線性的,而混入的噪聲也是高斯的,那麼預測之後的結果仍然是一條鐘形曲線。把一個高斯信念乘以一個高斯測量——結果還是高斯。在這些運算下,鐘形曲線這個形狀永遠不會破裂,於是信念始終逃不出你所追蹤的那兩個數。

由於形狀被鎖定,那些積分坍縮成了寥寥幾個矩陣的加法與乘法。在「高斯加線性」這一情形下,貝氏濾波的這種特殊而精確的閉式,就是卡爾曼濾波。它並不是與通用的預測—修正循環不同的另一套思想——它就是同一個循環,只因「一切都保持為鐘形曲線」這一假設而變得又快又精確。

先預測,再更新

卡爾曼濾波一遍又一遍地運行同樣的兩個步驟——預測與更新,每個時間節拍一輪。每一輪都接過上一刻的鐘形曲線,再把一條更銳利的交給下一刻。

  1. 預測:用運動模型把均值向前推——「我命令輪子前進了 10 公分,所以我的最佳猜測也前移 10 公分」。由於運動從不完美,過程噪聲被加進來,協方差隨之增大。鐘形曲線滑動過去並變寬:預測總會讓你變得更不確定。
  2. 更新:感測器報告了某個量——一段信標距離、雷射雷達看到的一面牆。把感測器所說的與預測所期望的相比較,二者之差就是「新息」。用它把均值朝測量方向拉過去,並收縮協方差。鐘形曲線被拉攏並變高:每一次好的測量都讓你變得更確定。

留意這個節奏:預測把鐘形攤開,更新又把它擠回去。一個只做預測的機器人——本質上就是純粹的航位推算——會眼看著自己的鐘形曲線無限膨脹。而一個不斷測量的機器人,能讓曲線始終受控。運動與感測器之間的這一推一拉,正是這套濾波器全部的心跳。

卡爾曼增益:一只信任旋鈕

更新到底該多用力地把均值朝新測量拉過去?這唯一的決定正是卡爾曼增益的職責。把它想成一只在 0 與 1 之間的旋鈕。靠近 0 意味著「相信我的預測,幾乎不理會感測器」;靠近 1 意味著「相信感測器,把舊猜測丟掉」。

濾波器會自動設定這只旋鈕,方法是比較兩個展寬。如果預測不確定(一條寬鐘形),而感測器很清晰(測量噪聲很小),增益就向 1 攀升,測量勝出。如果預測很自信,而感測器抖動得厲害,增益就向 0 下滑,預測佔上風。增益不過是兩個說法的相對確定性,被換算成了一個權重。

# Scalar update for one number (e.g. a 1-D position)
# x  = predicted mean        P = predicted variance (spread^2)
# z  = sensor reading        R = sensor variance (its noise)

K = P / (P + R)            # the gain: 0..1, P vs R decide it
x = x + K * (z - x)        # nudge mean toward the reading
P = (1 - K) * P           # spread always shrinks after a look

# If sensor is perfect (R=0): K=1, x jumps to z, P -> 0
# If sensor is useless (R huge): K~0, x stays, P unchanged
一維更新只需三行:增益把猜測與讀數融合,隨後確定性增長。

把中間那行讀成一個你在日常生活中早就在做的加權平均。「z − x」是你有多驚訝;乘以 K 則決定要相信這份驚訝的多少。把這同樣的三行用矩陣而非單個數寫出來,恰好就是完整的卡爾曼更新——純量情形正是整套直覺的微縮版。

鐘形曲線假設在哪裡失靈

卡爾曼濾波只有在運動與測量都是線性時才精確。真實的機器人會拐彎,而朝向會把正弦與餘弦折進數學裡——那不是線性的,於是一條純粹的鐘形曲線,再也無法毫髮無損地熬過預測步驟。

工程師們應對這一點時並不拋棄鐘形曲線。擴展卡爾曼濾波在每一步都把彎曲的運動拉直,化作一段局部的直線近似;而無跡卡爾曼濾波則把幾個精心挑選的取樣點推過真正的曲線,再對它們落下的位置重新擬合出一條高斯。兩者都保留了那個廉價的雙數信念,只在如何應對那道彎上有所不同。