永遠沒有把握的機器人
想像一個小機器人在倉庫地面上滾動。它命令輪子精確轉動,剛好前進一公尺。可地面有些灰塵,一個輪子打滑,機器人實際上只走了 98 公分,還向左偏了一絲。它感覺不到這一點。在它自己看來,它篤定地認為自己筆直前進了一公尺——而它其實已經錯了一點點。
為了確認自己究竟在哪裡,機器人查看它的感測器。但感測器也會「說謊」——不是故意的,而是因為每一次真實測量都帶著感測器雜訊,也就是疊加在真值之上的微小隨機抖動。讀數 2.00 公尺,真實距離可能是 1.96 公尺或 2.05 公尺。於是機器人被夾在兩個都不可靠的證人之間:它自己的運動(會打滑)和它的感測器(會抖動)。它永遠無法鎖定自己所在位置那個唯一而精確的真相。
狀態:道盡一切的幾個數字
在談論「不確定」之前,我們得先弄清機器人對什麼不確定。那個對象就是它的狀態:能完整描述機器人此刻處境的最小一組數字。對於在平地上行駛的機器人,狀態也許就是三個數——它的 x 座標、y 座標,以及它所朝的方向。再沒有別的東西需要補充,就能說清它在哪裡、面朝何方。
什麼算作狀態,取決於機器人要做什麼。一架快速飛行的無人機還在乎速度,於是它的狀態擴展到包含它在各個方向上的運動快慢。一條機械臂的狀態則是它每個關節的角度。其中的門道在於:挑出最少的幾個數,又仍能涵蓋一切要緊之事——少到便於計算,又全到不漏掉任何重要的東西。
信念:攜帶一片雲,而非一個點
關鍵的一步在這裡。既然機器人永遠無法知道自己的真實狀態,它就不會存下「我在 (3.0, 4.0)」這樣一個單一答案。它存下的是一個信念:一片機率,鋪展在它可能所處的所有狀態之上。你可以把它想像成懸在地面上的一團柔軟的雲——在機器人最可能所在之處最濃,向邊緣逐漸稀薄,那裡它大概、但不確定地,並不在那裡。
這團雲有兩樣東西值得讀取。它的中心是機器人最好的單點猜測——如果非要給出一個位置,就是它。它的寬度是機器人有多沒把握:緊緻狹窄的雲意味著高度自信;寬闊瀰散的雲意味著機器人只有一個模糊的概念。機器人會明確地追蹤這個寬度,通常藉助狀態共變異數矩陣——一份緊湊的帳本,記下每個方向上散布有多大,以及狀態中不同部分的不確定性如何彼此關聯。
為什麼要費事攜帶一整團雲?因為這個寬度是機器人能據以行動的資訊。一個知道自己沒把握的機器人,可以放慢速度、再看一眼,或者請求幫助。而一個丟掉自身不確定性、只信一個點的機器人,會自信滿滿地一頭撞上牆。誠實的懷疑,比虛假的篤定更有用。
為什麼不確定性永不消失
人們很容易指望:只要硬體夠好,懷疑就會消失。它不會,原因有兩條,深植於物理之中。第一,機器人自身的運動每一步都在累加誤差:每一次輪子轉動都會以微小而不可預測的量打滑,這些小誤差隨時間不斷堆積。第二,每一次感測器讀數都被雜訊弄得模糊,因此任何單獨一瞥都無法把真相完美釐清。
所以目標不是抹去不確定性——那不可能——而是誠實地表示它,並把它壓到證據所允許的最小限度。一個說「我大概在這裡,上下浮動 10 公分」的機器人,是誠實而有用的。一個說「我精確地就在這裡」的機器人,是天真的,而真實世界裡的天真,結局就是碰撞。忠實地呈現這份懷疑,毫不誇張地說,就是狀態估計的全部。
預告:濾波如何馴服那團雲
如果運動不斷把信念之雲鋪開,是什麼又把它收回去?新的證據。每當機器人取得一次感測器讀數,並把它與自己預期看到的相比對,它就學到了一點東西,那團雲便圍著契合新觀測的那些狀態收緊。這種永不停歇的節奏——猜測、查看、修正、重複——就叫濾波,它是機器人定位(在地圖上弄清機器人位於何處這一任務)的引擎。
- 預測:用下達的運動指令把信念之雲向前推。中心發生移動,而由於運動會增添不確定性,雲會鋪得更寬。
- 更新:取一次感測器讀數,把雲朝著與之相符的那些狀態拉攏。雲收緊了,機器人也變得更有把握。
- 重複:一遍又一遍地做,每秒許多次,讓信念始終是一個鮮活、即時更新的最佳估計,而非陳舊的猜測。
本主線裡其餘的一切——著名的卡爾曼濾波器、它的非線性表親、粒子濾波器,以及一次融合多個感測器的技巧——都不過是把那兩步做好的不同配方而已。它們共享同一種心跳:用運動鋪開雲,用測量擠壓它,循環不息。一旦你把狀態估計看作照料一團信念之雲,而非追逐一個唯一的真值,這門領域的其餘部分便會豁然貫通。