打造Lodestar:估计器之外的导航完整性监视器如何在GPS拒止干扰气泡中翻转为RED并返航,而不是虚报定位。
DronesRoboticsAutonomy

我的无人机在GPS干扰气泡中把漂移压到0.9%。我最骄傲的代码,是拒绝起飞的那一行。

Ashutosh SinghalAshutosh Singhal2026年7月3日13 min

我没想到这个项目最重要的部分,恰恰是那个选择放弃的部分。

我盯着一段合成飞行回放看了大半个下午。一架无人机在245.3米的路径上执行一段80秒的任务。GPS在前18秒保持正常,随后当飞机进入模拟电子战气泡时失效。屏幕上,从那一刻起扇出三条轨迹。其中一条亮粉色的线甩向地图角落并继续飞出去——自信满满,却完全错了;旁边的小读数还坚持说一切正常。

那条粉线就是原版视觉惯性里程计;看着它对我撒谎,彻底改变了我正在构建的东西的形态。我原本以为GPS拒止导航的难题是保持准确。其实不是。真正的难题是:在关键的那一刻,知道自己并不准确。

在GPS拒止空域里,一个自信却错误的位置,比一句诚实的「我不知道」更危险。

这是构建Lodestar——我们的导航完整性引擎——的故事,也是我在理解正确问题之前、花了一周解决错误问题的故事。

我追着精度忙了一周,才明白真正的问题是什么

我和其他人一样,从估计器入手。电子战已让GPS在自主无人机如今真正重要的地方变得不可靠:对抗空域、矿坑、隧道、城市峡谷。对抗空域中的干扰与欺骗现已广泛报道,常见到GPS拒止导航不再是研究猎奇,而成了硬性要求。显而易见的做法是加上视觉惯性里程计,把相机与惯性传感器融合,并指望漂移保持很小。

于是我构建了一个真正的紧耦合VIO EKF,并把第一周花在把它做准上。同一滤波器,三种诚实配置:完全没有视觉的航位推算IMU基线、融合所见每一个视觉特征的原版VIO,以及更谨慎选择相信哪些特征的完整性感知版本。我把它们全部对照仿真器生成的真值来跑,该真值独立于每一个估计器,因此没有人能批改自己的作业。整次任务都有种子,可逐字节复现——当时我还没意识到这有多重要。

精度数字确实漂亮。穿过干扰气泡时,完整性感知估计器保持0.92%漂移,在那条245.3米路径上最终误差2.26米。相比之下,航位推算爆到30.95%漂移和75.92米的最终误差,这就是落在起降坪上与落到隔壁县的差别。我自我得意了大约一天。

然后我跑了车队场景。

干扰气泡会对信任自己眼睛的无人机做什么

我想诚实说说GPS交接看起来有多平常,因为那正是管用的部分。当GPS在t=18秒掉线时,滤波器重新加权到视觉惯性源——没有模式切换、没有告警、没有操作员可见的接缝。估计值只是保持连续。如果你在飞这次任务,你不会感觉到地面消失。

Lodestar仪表盘在t=21秒:GPS刚在模拟的R-330Zh风格电子战气泡内被拒止后不久——完整性读数为GREEN,漂移0.41米,可用视觉特征358个,估计轨迹贴合真值。
t=21秒的GPS交接。完整性保持GREEN,相对真值漂移为0.41米,358个可用特征喂入估计器。这是容易的部分,也是人人都在演示的部分。

我低估的是这一点。靠视觉运行的无人机,失败方式不是慢慢变差。它失败于锁定错误目标,并报告一个干净、自信却纯属垃圾的位置。估计器不知道自己被骗了,因为计算位置的那套机制,恰恰也是本该察觉位置错误的那套机制。我建出的系统在准确无误,直到某一刻它灾难性地、悄无声息地出错——而从内部,我无法区分这两种状态。

这不是调参问题。你无法靠调参走出一个对自己的错误充满自信的系统。我需要某种完全坐在估计器之外的东西。

教会优秀估计器撒谎的车队

我专门设计了车队场景来击垮自己的工作,它确实做到了。在t=30到t=43之间,一列车辆穿过低纹理空地,喷出虚假特征;对饥渴的VIO前端来说,它们看起来恰好像它想跟踪的稳定地标。这就是有文档记载的ORB-SLAM3失败模式——算法跟踪卡车,并断定无人机静止不动。

原版VIO彻底中招。在同一次有种子的运行中,它锁定移动车辆并飞偏,最终达到28.79%漂移和70.61米最终误差,ATE为32.95米,实际上更差,连完全不做视觉都不如。那就是我一直在看的粉线。难看的细节是:它在失败时,内部置信度看起来还很健康。估计器对自己很确定。它确定的是一个正漂向地图边缘的位置。

Lodestar在t=32秒、移动车队期间:完整性已降至AMBER,特征计数显示2个、掩码10个,原版VIO误差爬升到11.0米,而完整性感知轨迹仍保持0.42米漂移。
t=32秒的车队。语义掩码已拒绝移动车辆(使用2个静态特征,掩码10个),因此完整性感知轨迹保持在0.42米,而原版VIO误差爬升到11.0米并继续增大。完整性诚实地报告AMBER,因为确实几乎没有可信任的静态特征。

完整性感知估计器能挺过车队,原因很简单:它拒绝相信属于移动物体的特征。在上图中,语义掩码拒绝了10个车队特征,只保留2个静态特征,因此估计器从未锁定车列。轨迹稳住了。但我没预料到的是,同一时刻我的完整性监视器做了什么。它没有把屏幕刷成绿色、假装世界一切正常。它翻转到AMBER,因为车队特征被掩掉后,真正剩下可信任的静态地标只剩寥寥几个。它既准确又紧张,同时如此,并且说了出来。

那是监视器第一次告诉我估计器无法说出的事,单凭这一点就比精度本身更有价值。它也逼出了我一直在回避的问题。

为什么估计器不能自己给自己背书?

我花了令人尴尬的大量小时,试图用估计器自己的数字回答这个问题。我的第一次完整性检查只是读取滤波器报告的不确定性——位置sigma——并据此设门。如果协方差看起来很紧,就飞。这似乎合理。

车队把它打得粉碎。当原版VIO锁定卡车时,它报告的sigma仍然很小。滤波器之所以自信,恰恰因为它找到了一致可跟踪的东西。一致性是谎言,但协方差不可能知道——因为协方差是估计器关于自己的陈述。我是在要求证人证明自己的证词。

信任绝不能依赖被信任的对象本身。

那句话成了设计。导航完整性监视器有意驻留在估计器之外,作为回答不同问题的独立代码。不是「我的位置是什么」——那是EKF回答的——而是「此刻这个位置能否被信任」——EKF在结构上无法就自己回答这个问题。监视器把三个信号融合成带硬阈值的GREEN、AMBER或RED状态:可用特征计数(不少于8为GREEN,低于1为RED)、位置sigma(低于0.6米为GREEN,超过1.5米为RED),以及视觉NIS——卡方新息一致性,正好抓住估计器自信却出错的情形(低于7.0为GREEN,超过30.0为RED)。没有任何单一数字能被估计器钻空子,因为三者中有两个根本不来自估计器的自我评估。

这是我如今对安全关键自主系统信念最强的一点。更好的VIO治不好自信却错误的失败,因为「这是否可信」是不同于「这是什么」的问题,你不能用产出后者的那套机制去回答前者。行业仍在竞相把估计器做得更聪明。持久的架构不是更聪明的估计器,而是一个愿意否决它的监视器。

拒绝起飞的那行代码

我真正理解自己产品的瞬间是在隧道里,我记得它,因为那是系统做得最少的一刻。

在t=52到t=66之间,任务进入黑暗隧道,可用视觉特征基本坍缩到零。没什么可看的。再怎么调参的估计器,也无法从未曾观测到的场景里制造出可信位置。这不是要修复的失败,而是要尊重的事实。原版VIO仍在尝试,滑向它无权宣称的位置。

Lodestar做了另一件事。特征消亡,位置不确定性越过阈值,在持续0.5秒的RED之后,监视器闩住故障保护,并命令返航于t=52.5秒。它不虚报位置。它声明估计不可信,并把控制交还给安全行为;而且这是确定性的,环路中没有任何模型在做决定。

Lodestar在t=54.5秒、黑暗隧道中:完整性读数为RED,「位置不可信」,特征计数为0,原版VIO误差35.2米,其轨迹飞出地图顶部;时间线显示返航在t=52.5秒触发。
t=54.5秒的隧道。特征已坍缩到0,完整性为RED(「位置不可信」),返航已在t=52.5秒触发。原版VIO仍旧自信,已飞到35.2米误差。这就是产品的全部意义:诚实的弃权,而不是自信的定位。

这里我想小心对待数字,因为诚实就是全部卖点。在这一次有种子的任务中,监视器对真正不可观测的隧道标记100%的时间,在健康的GPS拒止航段上误报约0.1%的时间,拒止飞行中56.3%的时间保持GREEN。这些是这次任务的结果——对机制的物理忠实证明,而非开放世界试飞保证。持久的主张是结构:信任在估计器之外计算,RED持续到闩住返航,在无人能导航的场景上诚实弃权。精确的米数属于这次运行。架构属于每一次运行。

自主软件栈中最有价值的一行代码,是拒绝起飞的那一行。

我写进报告的内容,好让谁都不必只信我的话

我不希望任何人必须信任我的截图,所以我最后做的是收据。一键导出飞行完整性报告——JSON加可打印HTML——含记分板、头条指标、弃权正确性、故障保护时间、事件时间线,以及我最在意的部分:明确披露哪些是占位、哪些延后。

那份披露不是我埋起来的免责声明。它是一个功能。报告直说视觉前端是替身,LiDAR融合是模拟距离约束而非真实LiDAR因子,MAVLink接口与Jetson吞吐在此未实测,而Jetson Orin NX 16 GB上30–45 FPS是目标硬件规格、不是测量结果。报告中的16,000次EKF传播更新是在演示机上测得的。FPS不是,报告也用同样的措辞说清楚了。

启用LiDAR融合后导出的飞行完整性报告:完整性感知运行漂移0.01%,飞行中78.9%为GREEN,故障保护「不适用(LiDAR维持了完整性)」,以及对照独立真值的记分板。
飞行完整性报告,在启用LiDAR融合时导出。有模拟LiDAR距离约束锚定隧道后,场景变得可观测,漂移降至0.01%,飞行中78.9%保持GREEN,监视器正确地没有触发故障保护。报告明确这是权衡,不是魔法。

这次LiDAR运行值得细看,因为很多演示会在这里作弊。打开模拟LiDAR,隧道就恢复了:距离约束锚定解算,完整性保持,故障保护不触发,因为场景不再不可观测。只展示那次运行并宣称问题解决,很容易。但报告也带着解决方案页面承认的代价,大约250到400克载荷与8到12瓦功耗。LiDAR是真实的工程权衡,带着真实的SWaP-C账单,不是免费胜利;买方有权在收益旁边看到账单。

这套系统附近只有一个模型:一个可选按钮,从结构化报告起草技术评审叙述。它完全在飞行环路之外运行。它写散文。它从不触碰控制决策。决定是否飞行的门控是确定性的、有种子的、离线的;即便把叙述按钮拆掉,它也会做出相同的调用。我坚持那条边界,因为语言模型哪天要对无人机是否信任自身位置投一票,那是我不想负责的一天。

我不断回到的一点

我动手是为了造一架GPS死掉后仍保持准确的无人机,而我做到了——在这次任务上,漂移低于百分之一。我没想到的是,离开时我确信:精度只是容易的那一半。

精度是一场谁都能报名的竞赛。这个领域里人人都在把估计器收得更紧一点、特征更密一点、后端更聪明一点,这些都是好工作。但没有一项回答真正会在干扰气泡里害死无人机的问题——不是「我错了多少」,而是「我是否处在一个无法知道自己错了多少的情境」。那个问题必须从估计器之外提出,由愿意说出不风光的话并交出控制权的东西来回答。

精度是一场谁都能报名的竞赛。知道自己何时失明的系统,才是产品。

你可以自己跑完整流程,看着粉线飞偏,再看着RED状态触发,地址是veriprajna.com/zh-Hans/demos/gps-denied-drone-autonomy。它有种子,所以你会看到和我完全一样的东西。

如果你更想看它跑起来,而不是读我描述,这里是端到端完整运行。

我仍不停翻来覆去想的问题是这个:如果你的自主软件栈中最有价值的行为是拒绝行动,那么你的工程预算有多少花在「放弃」那部分,又有多少花在从未学会何时该停的那部分?

相关研究

同步发布于

满怀信心地构建您的 AI。

与一支在打造新一代企业级 AI 方面拥有深厚经验的团队携手合作。让我们助您设计、构建并部署一套值得信赖的 AI 战略。

Veriprajna 深度科技咨询公司 专注于为医疗健康、金融和监管等领域构建安全攸关的 AI 系统。我们的架构均依据成熟的规范进行验证,并配有完善的合规文档。