
我的無人機穿越 GPS 干擾氣泡時漂移僅 0.9%。我最自豪的程式碼,是那行拒絕起飛的程式碼。
我沒想到這個專案最重要的部分,竟是那個選擇放棄的部分。
那個下午大半時間,我一直盯著一次合成飛行的重播。一架無人機在 245.3 m 的路徑上執行一段 80 秒的任務。GPS 在前 18 秒維持正常,接著當飛行器進入模擬的電子戰氣泡時就失效了。畫面上,從那一刻起扇出三條軌跡。其中一條鮮亮的粉紅線朝地圖角落偏離並持續飛遠——自信滿滿,卻完全錯了——旁邊的小讀數卻堅持一切都沒問題。
那條粉紅線是標準的視覺慣性里程計(VIO),看著它對我說謊,徹底改變了我正在打造的東西的整體形狀。我原本以為 GPS 拒止導航的難題是保持精確。不是。難題是在那個真正要緊的瞬間,知道自己並不精確。
在 GPS 拒止空域裡,一個自信卻錯誤的位置,比一句誠實的「我不知道」更危險。
這是打造 Lodestar——我們的導航完整性引擎——的故事,也是我花了一週解決錯誤問題、才終於理解正確問題的故事。
我追著精度跑了一週,才弄懂真正的問題
我從大多數人會開始的地方著手:估計器。電子戰讓 GPS 恰好在自主無人機如今真正重要的地方變得不可靠:對抗空域、礦坑、隧道、都市峽谷。對抗空域中的干擾與欺騙如今被廣泛報導,常見到 GPS 拒止導航已不再是研究好奇心,而成了硬性要求。顯而易見的修補做法,是掛上視覺慣性里程計,把攝影機與慣性感測器融合,然後指望漂移維持在小範圍。
於是我打造了一個真正緊耦合的 VIO EKF,並把第一週花在把它做準確上。同一個濾波器,三種誠實的配置:完全沒有視覺的航位推算 IMU 基準線、把看到的每個視覺特徵都融合進去的標準 VIO,以及對相信哪些特徵更謹慎的完整性感知版本。我把它們全部拿去對照模擬器產生的地面真值——該真值是獨立於每一個估計器產生的,因此沒有任何東西能替自己的作業打分。整趟任務都經過種子化,可逐位元重現,這點在當時比我意識到的還重要。
精度數字確實漂亮。穿越干擾氣泡時,完整性感知估計器維持0.92% 漂移,在那條 245.3 m 路徑上最終誤差為 2.26 m。相比之下,航位推算膨脹到30.95% 漂移以及 75.92 m 的最終誤差,這就是落在停機坪上與落到鄰縣之間的差別。我大約有一天時間為自己感到得意。
接著我跑了車隊場景。
干擾氣泡會對一架信任自己雙眼的無人機做什麼
我想誠實地說 GPS 切換看起來有多尋常,因為那正是運作正常的部分。當 GPS 在 t=18 s 掉線時,濾波器重新加權到視覺慣性來源,沒有模式切換、沒有警報、沒有操作員可見的接縫。估計只是保持連續。如果你正在飛這趟任務,你不會感覺到地板消失。

這是我低估的地方。靠視覺飛行的無人機,並不是以慢慢變差的方式失效。它失效的方式是鎖定錯誤的目標,並回報一個乾淨、自信、其實根本是垃圾的位置。估計器不知道自己被愚弄了,因為計算位置的那套機制,正是本該察覺位置錯誤的同一套機制。我打造的系統在災難性、靜默地出錯之前一直都很準確,而我從內部卻無從分辨這兩者。
那不是調參問題。你無法靠調參走出一個對自己的錯誤充滿自信的系統。我需要某種完全置於估計器之外的東西。
教會一個好估計器說謊的車隊
我專門打造車隊場景來擊垮自己的工作,而它確實做到了。在 t=30 到 t=43 之間,一列車輛穿過低紋理空地,噴出對飢渴的 VIO 前端來說,看起來完全像它想追蹤的穩定地標的虛假特徵。這就是有文獻記載的 ORB-SLAM3 失效:演算法追蹤卡車,並斷定無人機靜止不動。
標準 VIO 完全上鉤了。在同一次種子化執行中,它鎖定移動車輛並飛離,最終達到28.79% 漂移以及 70.61 m 的最終誤差,ATE 為 32.95 m,實際上更糟於完全不做視覺。那就是我一直在看的粉紅線。醜陋的細節是:當它失效時,內部置信度看起來很健康。估計器對自己很有把握。它有把握的,是一個正朝地圖邊緣漂移的位置。

完整性感知估計器能挺過車隊,原因很單純:它拒絕相信屬於移動物體的特徵。在上方畫面中,語意遮罩拒絕了 10 個車隊特徵,只保留 2 個靜態特徵,因此估計器從未鎖定那一列車輛。軌跡得以維持。但我沒預料到的是,我的完整性監視器在同一瞬間做了什麼。它沒有把畫面塗成綠色、假裝世界一切正常。它切換成AMBER,因為在車隊特徵被遮罩掉之後,確實只剩下一小撮靜態地標可以信任。它既準確又緊張,同時如此,並且說了出來。
那是監視器第一次告訴我估計器無法告訴我的事,而單就這一點,就比精度本身更有價值。它也逼出了我一直在迴避的問題。
為什麼估計器不能自行認證自己?
我花了令人尷尬的小時數,試圖用估計器自己的數字來回答。我的第一次完整性檢查只是讀取濾波器回報的不確定性——其位置 sigma——並據此設閘。若協方差看起來緊密,就飛。這看起來很合理。
車隊把它打垮了。當標準 VIO 鎖定卡車時,其回報的 sigma 仍然很小。濾波器之所以自信,恰恰是因為它找到了某種一致的東西可追蹤。那種一致性是謊言,但協方差無法知道,因為協方差是估計器對自己做出的陳述。我是在要求證人為自己的證詞背書。
信任絕不能依賴被信任的對象本身。
那句話成了設計。導航完整性監視器刻意活在估計器之外,作為回答不同問題的獨立程式碼。不是「我的位置是什麼」——那是 EKF 回答的——而是「此刻能否信任這個位置」,而 EKF 在結構上無法對自己回答後者。監視器把三個訊號融合成帶硬閾值的 GREEN、AMBER 或 RED 狀態:可用特徵數(8 個及以上為 GREEN,低於 1 為 RED)、位置 sigma(低於 0.6 m 為 GREEN,超過 1.5 m 為 RED),以及視覺 NIS——捕捉估計器自信卻錯誤之情形的卡方創新一致性(低於 7.0 為 GREEN,超過 30.0 為 RED)。沒有任何單一數字能被估計器玩弄,因為三者之中有兩個根本不是來自估計器的自我評估。
這是我現在對安全關鍵自主性抱持最強烈信念的一點。更好的 VIO 無法修復自信卻錯誤的失效,因為「這是否可信」是不同於「這是什麼」的問題,而你無法用產出後者的那套機制來回答前者。產業界不斷競速讓估計器更聰明。持久的架構不是更聰明的估計器。而是一個願意否決它的監視器。
那行拒絕起飛的程式碼
我真正理解自己產品的那一刻是隧道,我記得它,因為那是系統做得最少的那一刻。
在 t=52 到 t=66 之間,任務進入黑暗隧道,可用視覺特徵崩潰到實質上為零。沒有東西可看。無論調校得多好,任何估計器都無法從它無法觀測的場景中製造出可信的位置。這不是要修復的失效。這是要尊重的事實。標準 VIO 仍在嘗試,滑行到一個它無權主張的位置。
Lodestar 做了別的事。特徵消失,位置不確定性跨越閾值,在持續 RED 達 0.5 秒之後,監視器鎖定故障保護並命令返航,時刻為t=52.5 s。它不虛張一個位置。它宣告估計不可信,並把控制交回安全行為,而且這是確定性的,迴路中沒有任何模型在做決定。

我想謹慎對待這裡的數字,因為誠實就是整套主張。在這一次種子化任務中,監視器對真正不可觀測的隧道100% 的時間都發出標記,而在健康的 GPS 拒止航段上誤報約0.1% 的時間,在拒止飛行中有56.3%的時間維持 GREEN。那些是這趟任務的結果——對機制的物理忠實證明,不是開放世界飛行測試保證。持久的主張是結構:信任在估計器之外計算、RED 持續到鎖定返航、在無人能導航的場景上誠實棄權。精確的公尺數屬於這次執行。架構屬於每一次執行。
自主堆疊中最有價值的那行程式碼,是拒絕起飛的那一行。
我寫進報告裡、好讓沒人必須只憑我的話的東西
我不希望任何人必須信任我的螢幕截圖,所以我打造的最後一樣東西是收據。一鍵匯出飛行完整性報告(Flight Integrity Report),JSON 加上可列印的 HTML,含計分板、頭條指標、棄權正確性、故障保護時間、事件時間軸,以及——我最在乎的部分——明確的範圍揭露:哪些是暫代、哪些延後。
那份揭露不是我埋起來的免責聲明。它是一項功能。報告明白寫道:視覺前端是替身、LiDAR 融合是模擬距離約束而非真實 LiDAR 因子、MAVLink 介面與 Jetson 吞吐量未在此演練,以及 Jetson Orin NX 16 GB 上的 30-45 FPS 是目標硬體規格、不是量測結果。報告中的 16,000 次 EKF 傳播更新是在展示機上量測的。FPS 不是,報告也用同樣的措辭如此說明。

那場 LiDAR 執行值得細看,因為那正是許多展示會作弊的地方。打開模擬 LiDAR,隧道就恢復了:距離約束錨定解、完整性維持、故障保護不觸發,因為場景不再不可觀測。只展示那一場並宣稱問題已解決,很容易。但報告也帶著解決方案頁面坦承的成本,大約250 到 400 g 的酬載與 8 到 12 W 的功耗。LiDAR 是帶有真實 SWaP-C 帳單的真實工程取捨,不是免費的勝利,買家有權在利益旁邊看到帳單。
這個系統附近恰好只有一個模型:一個可選按鈕,從結構化報告草擬技術審查敘事。它完全在飛行迴路之外運行。它寫散文。它從不觸碰控制決策。決定是否飛行的閘門是確定性的、種子化的、離線的,即便把敘事按鈕拆掉,也會做出完全相同的呼叫。我對那條界線很堅持,因為語言模型有權投票決定無人機是否信任自己位置的那一天,是我不想負責的一天。
我不斷回到的事
我著手打造一架在 GPS 失效時仍能保持精確的無人機,而在這趟任務上,我做到了,漂移低於百分之一。我沒預料到的是,離開時我深信精度只是容易的那一半。
精度是一場任何人都能參加的競賽。這個領域裡的每個人都在讓估計器更緊一點、特徵更密一點、後端更聰明一點,而那些都是好工作。但它們沒有任何一項回答真正會在干擾氣泡中弄死無人機的問題——不是「我錯了多少」,而是「我是否處在一個無法知道自己錯了多少的情境」。那個問題必須從估計器之外提出,由某個願意說出不體面的話並交出控制權的東西來回答。
精度是一場任何人都能參加的競賽。一個知道自己何時盲目的系統,才是產品。
你可以自己跑完整流程,看粉紅線飛離,再看 RED 狀態觸發,網址是veriprajna.com/zh-Hant/demos/gps-denied-drone-autonomy。它是種子化的,所以你會看到我看到的一模一樣的東西。
而如果你寧願看它運作,而不是讀我描述,這裡就是端到端跑完整件事。
我仍反覆琢磨的問題是這個。如果自主堆疊中最有價值的行為是拒絕行動,你的工程預算有多少花在那個會放棄的部分,又有多少花在那個從未學會何時該停的部分?


