2026年的机器人竞赛场上,发生了一件挺让人意外的事。
当时排行榜上排名靠前的,是一堆有着炫酷名字的模型:GPT-6 Astra、π0.5、各种打着"世界动作模型"旗号的新秀。这些模型动辄几十亿参数,靠海量真实机器人数据训练出来,代表着当下机器人智能的最高水平。它们在一个叫RoboDojo的测试里,最好成绩是31.38%的任务成功率。
然后几个来自南洋理工大学的研究者站出来说,我们不用任何AI模型,就写代码,成功率能做到70.24%。
这差不多是把第二名甩开了一倍还多。更讽刺的是,他们用的"武器"不是什么新的神经网络架构,而是一个已经存在了快一百年的老古董概念,图灵机。
**这篇论文要说的事情听起来有点反常识:在机器人领域,最前沿的解法可能不是更聪明的AI,而是回到最朴素的代码逻辑。**
这事值得掰开揉碎讲讲。
### 机器人智能的三条路,走到了同一个坑里
先说说现在主流的机器人控制到底是怎么工作的。
第一种叫VLA
VLA(视觉语言动作模型):一种直接把摄像头看到的画面和语言指令,映射成机器人动作指令的神经网络模型,比如π0、OpenVLA这些。
VLA的逻辑很直接:喂给它大量"看到什么画面、该做什么动作"的数据,让它自己学出一套映射关系。这套映射关系藏在模型的几十亿个参数里,没人能说清楚某个具体的决定是怎么做出来的。
第二种叫Agent Harness,也就是智能体框架。这种方案让一个大语言模型(比如GPT)在执行任务的过程中不断被问:"现在该干什么?"模型给出文字指令,再转化成机器人动作。听起来更灵活,因为有"推理"过程,但代价是,每做一个决定就要调用一次大模型,又慢又贵。
第三种,也是过去几年机器人代码圈里悄悄流行的思路,叫"用模型写代码当策略"。比如Code as Policies这类工作,让语言模型现场写一段代码来控制机器人完成任务。但这里有个关键限制:代码是临场生成的,这一局用完就扔,下一局任务重新开始时,模型又要从零开始现编代码。
三条路看起来方向不同,但本质上有个共同点:**状态,也就是机器人需要知道的"世界此刻是什么样子",要么藏在模型权重里看不见,要么写在一堆文字记忆里不可靠,要么干脆靠外部的感知模型临时给一个结果。**
这就是论文作者觉得别扭的地方。他们提出一个很朴素的类比:机器人和它所在的环境,其实就是一台图灵机。
图灵机:计算机科学里最基础的抽象计算模型,由阿兰·图灵在1936年提出。它由一条存储符号的"纸带"和一套读写规则组成,规则固定不变,纸带的内容变化,就能让同一套规则处理不同的输入。
图灵当年那句话放在这里特别合适:"发明一台单一的机器,用来计算任何可计算的序列是可能的。"规则是死的,带子是活的,这就是图灵机的全部秘密。放到机器人身上,这台"图灵机"的纸带就是机器人本身和周围环境的状态,比如桌上的碗在哪儿、机械臂的关节角度是多少,而规则就是控制它行动的策略。
如果状态能被准确记录下来,规则足够完善,理论上根本不需要一个会"思考"的模型实时介入,纯代码就能跑完整个任务。这就是这篇论文的核心主张,起名叫Code-Only-as-Policy,简称COAP。
### 想象一下,你去一个完全陌生的厨房做饭
COAP这个设计思路,其实可以用一个很具体的场景来理解。
假设你要去一个陌生人家里帮忙做一道菜。如果你完全不记路、不记东西放哪,每次转身都得重新"看一眼环境再决定下一步",那你做菜的效率会很低,而且很容易出错,比如转头看到一把刀,但忘了刚才已经放了盐,又放了一次。
**现在换一种做法:你进厨房先花时间把所有东西的位置都记在一张清单上,盐在左边第二个抽屉,油在灶台右侧,然后按照清单上记录的信息按部就班地操作,而不是每一步都重新观察、重新判断。**
这就是COAP和VLA/Agent Harness的根本区别。前者维护的是一份精确、持久、看得见的"清单"(代码变量里的状态),后者是每一步都靠"感觉"(模型推理)重新判断。
如果不维护这份清单会怎样?论文里给出了具体数据。在RoboDojo的记忆类任务(比如记住某个颜色在哪个杯子下面)上,COAP达到89.9%的成功率,而最强的Agent Harness方案只有46.6%,VLA方案更惨,只有33%左右。差了快一倍,原因很简单:没有"清单"的系统,看一眼忘一眼,物体一旦被遮挡,它的位置信息就丢了。
### 状态要分成几类来管
那COAP具体怎么维护这份"清单"的?论文里把状态拆成了三个部分。
第一部分是环境状态,记录每个物体的位置、大小、类别,以及物体之间的空间关系,比如A放在B上面。每条记录还会额外存一个误差值、来源和时间戳,表明这个信息是什么时候、通过什么方式测出来的,还有没有过期。
第二部分是机器人状态,直接从机器人自身的传感器读取,包括关节角度、末端执行器的位置、夹爪开合程度。
这两部分加起来,就是图灵机里那条"纸带"。
第三部分叫任务状态,它不属于纸带,更像是图灵机内部那个决定"现在处于哪个阶段"的内部寄存器。比如记录当前任务进行到第几步、每个物体分配给哪只手臂、重试了几次。
这三类状态分别由不同的来源更新:机器人状态每一步都从传感器直接读取,环境状态靠专门写的感知代码从摄像头画面里测量出来,任务状态则由任务程序自己在执行过程中更新。
感知*:从摄像头拍到的RGB图像里,识别出物体的位置、朝向、大小等信息的过程,这里用的是传统的计算机视觉方法(基于NumPy和OpenCV这类工具库),而不是训练出来的黑箱神经网络。
这里有个细节特别值得说:COAP的感知代码是"白盒"的,也就是透明可查的。它的做法是把机器人的三维网格模型投影到摄像头画面里,先把属于机器人自己的像素遮住,剩下和桌面颜色不一样的区域,就是候选物体。再通过一条简单的几何公式,把图像上的像素点换算成真实世界里的三维坐标。这个公式其实就是解一条从摄像头出发、穿过那个像素点的射线,和桌面平面的交点在哪儿。
这意味着,如果某次识别出错了,比如把一个飞镖盘认成了耳机(论文里真实发生过这个案例),开发者能顺着这条"射线交点"的逻辑一步步查下去,找到到底是哪一步出了问题,然后直接改代码修正。这在VLA或者Agent Harness里是做不到的,因为那些系统的判断过程压根看不见。
### 一套代码库,被几十个任务反复用
COAP还有一个很关键的设计,它不是给每个任务单独写一套代码,而是维护一个共享的代码库,让不同任务去调用。
论文给出一个具体数字:新任务运行时,83%的代码行数来自这个共享库,只有17%是任务专属的逻辑。
这个比例是怎么做到的?论文给出的解释是,代码是分层设计的,任务程序在最上层,只负责"做什么",比如先做A再做B;往下是操作物体的具体方法层,比如抓取、搬运、放置;再往下是感知和运动控制层,负责测量和路径规划这类"怎么做"的细节。
举个例子,抓取功能不是按"这是个杯子"还是"这是个积木"来分别写代码的,而是按抓取方式来写:从顶部抓、抓边缘、抓把手、抓碗沿。这样一来,一个新出现的、从没见过的物体,只要形状符合某种已有的抓取方式,就能直接复用现成的抓取逻辑,不用从零开始写。
论文还设计了一种"默认关闭参数"的机制,保证新功能不会破坏老功能。比如有个任务需要让抓起来的物体斜着往上提,而不是垂直往上提,工程师就给抓取函数加了一个新参数lift_dir,默认值还是原来的垂直方向,只有传入新参数的那个任务才会用到新行为,其他所有调用这个函数的老任务完全不受影响。
这套机制背后有个数学表达,用B表示某个任务在某套代码和某组观测数据下的执行轨迹,要求对于没有主动传入新参数的任务i,加了新功能δ之后的执行轨迹必须和加之前完全一样。简单说就是,新增功能只能是"选配",不能是"强制升级"。
**这种设计思路,很像一个大型软件公司维护一套底层基础库的方式:新团队接手新项目时,不用把轮子重新发明一遍,而是在已有的、经过千锤百炼的基础设施上,加一点自己的业务逻辑。**
如果没有这套共享库的设计会怎样?每个任务都从零写代码,开发一个新任务要花的时间会呈线性甚至更糟的方式累积,而且老任务很可能因为新代码的改动而悄悄崩掉。论文里专门测过这一点:冻结库之后再开发新任务,老任务在相同场景下的成功率,开发前是78.4%,开发后是79.9%,统计检验显示没有显著下降(p值0.16)。换句话说,加新功能基本不会把旧的东西搞坏。
### 出错了怎么办,靠的是"倒带"
执行过程中出问题是难免的,关键在于系统怎么应对。
COAP的做法叫"回溯重试"(backtrack and re-attempt)。因为状态被完整记录在代码变量里,系统随时知道任务进行到哪一步、上一次确认成功的状态是什么样子。一旦某个检查没通过(比如抓取之后发现没抓稳),系统可以直接退回到上一个确认有效的状态,换一种方法重新尝试,而不是任由错误一直累积到任务彻底失败。
论文里统计了实际运行数据:在出问题的那些场景里,76%的情况下,系统能自己察觉到出了问题;其中34%会立刻换个方法重新尝试,包括重新测量物体、换个抓取角度之类的调整。
**这就像你在高速公路上开车,如果导航系统压根不知道你现在走到哪个出口了,一旦错过路口,只能一路开到底再想办法;但如果导航实时知道你的精确位置,错过路口的那一刻就能立刻重新规划路线,代价小得多。**
反过来说,如果没有这套状态追踪和回溯机制会怎样?论文里有个很直观的对比图:没有检查机制的系统,哪怕只有一步失败,整个任务就直接终止了,图上显示,随着任务步骤增多到30步,这种系统的成功率会从接近100%一路跌到个位数;而有回溯能力的系统,下降速度慢了1.7倍左右。任务越长,这个差距就越明显,这也解释了为什么COAP在长时程任务(Long-Horizon)上的优势相对没那么夸张,只比第二名高13个百分点,因为长任务本身对任何方法都更难,但即便如此也依然是第一。
### 没有模型意味着什么
COAP最被低估的一个优势,可能是效率。
因为运行时完全不调用任何AI模型,一次控制决策在普通CPU上的中位耗时只有0.3毫秒。论文给出了和其他方案的算力对比:COAP每局任务消耗的算力,只有VLA方案的0.8%到2.4%,只有Agent Harness方案的0.03%左右。
这个差距为什么这么大?因为VLA每一步(或每个动作块)都要跑一次几十亿参数的神经网络前向计算,Agent Harness更夸张,每隔一段时间就要调用一次超大规模语言模型,还要带着不断增长的上下文文本。而COAP运行时就是普通代码,该做什么已经提前想清楚、写进逻辑里了,不需要临场"思考"。
这也带来一个很实际的好处,成本。调用大模型是要花钱的,无论是算力成本还是API费用,而COAP一旦代码写好,之后每一局的运行成本几乎可以忽略不计。
### 代码也能"自我进化"
论文里最有意思的部分,可能是COAP怎么被开发出来的。整个代码库不是人工一行一行写出来的,而是由AI编程助手(论文里用的是Claude Opus 5.5)在一个闭环流程里自己写、自己测、自己改出来的。
这个过程被称为RSI
RSI(递归自我改进):一种系统能不断检查自己的表现、定位问题、修改自身逻辑,并且每次修改都要验证是否真的变好的开发范式。
论文设计了一套很讲究的流程。编程助手先在自己定义的开发数据集上调试代码,通过看录像、对比测量状态和模拟器里的真实数据,找到问题出在哪儿;然后在一批独立的验证数据上评估修改有没有带来提升,只有提升幅度超过某个阈值(用来排除运行本身的随机噪声干扰)的改动才会被正式采纳。整个过程里测试数据和验证数据是分开的,开发阶段完全不碰最终要考核的测试集。
更妙的是,因为每一个候选修改方案都是完整可运行的代码,不需要训练,所以可以让很多个修改方案同时在不同的"分支"上跑,并行比较哪个效果更好。论文管这个过程叫"广度优先搜索"(BFS),把每个决策点(比如"怎么抓一个杯子")展开成好几种可能的做法(抓杯沿、抓把手、抓侧面……),同时跑一遍,挑出表现最好的那个,再继续往下一个决策点走。
论文给了一组具体实验数据:如果每轮只试1个修改方案,被采纳的概率是17%左右;如果每轮并行试8个方案,采纳概率能冲到77%,预期获得的提升幅度也从2.5个百分点涨到12.4个百分点。代价是需要更多并行算力,但换来的是更快拿到有效改进,从单线测试需要大约20小时缩短到并行测试只需要2.3小时左右。
**这个过程让我想起小区里修路。如果一条路出了问题,一次只能派一个工人去试一种修法,试错速度很慢;但如果能同时派八个工人,各自尝试不同的修补方案,当天晚上就能比较出哪种方案最耐用,第二天就全面推广。并行,本身就是效率的来源。**
### 这套方法到底跑赢了多少
说了这么多设计思路,该看实际成绩了。
RoboDojo是一个专门用来评估机器人通用操作能力的基准测试,包含42个双臂协作任务,横跨记忆、精度、开放指令理解、泛化能力、长时程操作这五个维度,每个任务用三个随机种子各跑50次,结果由官方评测脚本统一产出,避免了自说自话的嫌疑。
COAP最终拿到了70.24%的总体成功率,比排行榜上此前最好的方法(一个叫PhysicalRSI的智能体加VLA混合方案,31.38%)高出38.86个百分点,比最强的"世界动作模型"方案(29.64%)高出超过40个百分点,比最强的纯VLA方案(27.96%)也高出超过40个百分点。
分维度看更有意思。记忆类任务上COAP拿到89.9%,比第二名高39.6个百分点;精度类任务上拿到75.1%,比第二名高41.6个百分点。这两类任务恰好最能体现"状态是否被准确记住、测量是否精确"这件事的价值,差距也确实最大。泛化类任务(包含新物体、新场景、新干扰物的随机化设置)上COAP拿到65.7%,领先33.1到35.2个百分点。唯独长时程任务领先幅度最小,只有13个百分点,这也和前面提到的"任务越长、失败累积风险越大"是吻合的。
| 维度 | COAP | 最强VLA | 最强世界模型 | 最强智能体框架 |
|---|---|---|---|---|
| 记忆 | **89.9%** | 33.0% | 41.2% | 46.6% |
| 精度 | **75.1%** | 26.9% | 33.5% | 32.5% |
| 开放指令 | **64.1%** | 8.5% | 22.9% | 24.9% |
| 泛化 | **65.7%** | 27.9% | 23.8% | 15.6% |
| 长时程 | **56.4%** | 43.4% | 26.8% | 37.3% |
| 总体成功率 | **70.24%** | 27.96% | 29.64% | 31.38% |
这张表格最扎眼的地方在于,不是某一项突出,而是五个维度COAP全部第一,没有一个弱项。这在学术圈的基准测试结果里其实挺少见的,大部分方法都是有所取舍,擅长某类任务、弱于另一类,全面压制意味着这套设计思路触及的是某种更底层的东西。
### 这套方法也不是万能的
不过这篇论文很坦诚地承认了自己的局限,错误分析那部分写得挺实在。
研究者把失败案例归成四类。第一类叫感知错误,占35%,典型情况是场景被随机化后(比如换了房间、桌面风格),某个物体被识别错了。论文举的例子是前面提到的,一个飞镖盘在随机化场景里被认成了耳机。第二类叫接触错误,占27%,主要出现在抓软的、形变的东西上,比如夹爪夹住了衬衫的下摆,布料太软,中途滑脱了。第三类叫逻辑不完整,占29%,比如推动积木的函数自己的检查机制已经发现积木还没转到位,却没有继续重试。第四类叫代码设计不够好,占8%,比如某个尺寸阈值是写死的常数,导致一个偏小的手表被错误过滤掉。
把前两类归为"状态表示的局限",占62%;后两类归为"代码逻辑的局限",占37%。论文直接点明了COAP能力的天花板在哪:**状态被测量得越准确、代码逻辑写得越健壮,COAP能做到的上限就越高。反过来,这个方法目前的短板也恰好卡在这两个地方。**
还有一点值得提:所有这些结果都是在仿真环境里跑出来的。真实世界里,摄像头参数、机器人尺寸、物体大小这些COAP目前依赖的"已知常量",需要重新测量和标定,接触相关的参数(比如抓取力度、搬运速度)大概率也得重新调试。这是论文自己承认的局限,不是我瞎猜的。
### 这篇论文站在谁的肩膀上,又会被谁接着往前推
COAP不是凭空冒出来的,它接着几条脉络往前走。
往回看,2023年的Code as Policies(发表在ICRA)算是"用代码当策略"这条路子的早期代表,让语言模型现场写代码调用感知和控制接口,但那套系统里状态还是靠外部感知模型实时给,代码也是每局重新生成,用完就扔。同年的VoxPoser做了类似尝试,让语言模型写代码来组合空间价值地图。这些工作证明了"代码可以当控制逻辑的载体",但都没有解决"状态怎么持久化、代码怎么跨任务复用"这两个核心问题,而这恰好是COAP补上的那块拼图。
往前看,论文里提到的RHO和EmbodiedSWE算是更接近COAP的尝试,让编程助手离线写出一整套程序,而不是现场生成,但状态来源依然依赖外部的感知模型(比如SAM、Molmo)或者仿真器给的"上帝视角"数据,没有做到COAP这种自己测量、自己维护状态的闭环。论文作者明确把这个差异当成自己的核心创新点来强调。
往更远看,机器人之外的领域里也有类似的思路在萌芽。2024年的CodeAct(发表于ICML)把可执行代码当作智能体的"动作空间",而不只是输出文本;更早之前的Voyager让游戏智能体在和环境交互的过程中,持续积累一套可复用的代码技能库,这和COAP"共享库跨任务复用"的设计思路其实是同一种哲学在不同场景下的体现。论文里提到的RoboRSI(2026年的工作)也尝试了用多智能体协作的方式做机器人的递归自我改进,但执行阶段依然保留了一个VLM在做决策,黑箱问题没有根本解决,这也正是COAP想要彻底绕开的那个坑。
这几条线索放在一起看会发现一个趋势:**代码正在从"工具"变成"接口",不只是帮AI调用外部功能,而是直接承载决策本身。**这个转变可能比某一个具体的性能数字更值得留意。
写在后面
读完这篇论文,我脑子里一直转的一个问题是:为什么过去几年大家默认的方向都是"让模型更大、数据更多",很少有人认真问过"状态能不能干脆写在代码里"这种看起来有点返璞归真的问题?
论文里有个细节我觉得特别值得单独拎出来说。作者提到,一个碗被抓着碗沿快速搬运时会滑落,他们的修复方式是加了一行代码,限制碗沿抓取方式下的搬运速度。一行代码,解决一个具体的物理失败模式。这种"精确制导式"的修复,在黑箱模型里是做不到的,你没法对着一个几十亿参数的神经网络说"把你学到的某个权重稍微调一下",你只能重新喂数据、重新训练,然后祈祷这次它学明白了,还不会把别的任务搞砸。
这让我联想到软件工程里一个很老的争论:到底该用规则引擎还是机器学习。很多年前做反欺诈系统的人都纠结过这事,规则引擎可解释、可调试、出了问题能精确定位;机器学习覆盖面广、能发现人想不到的模式,但黑箱,出了问题很难说清楚到底哪儿错了。这篇论文某种程度上是在机器人领域把这个老问题重新问了一遍,而且给出了一个让人意外的答案:至少在当前阶段,规则引擎(精心设计的代码)可能比黑箱模型更可靠。
论文里没有展开说的一件事是,这套方法在真实世界里会不会同样好用。仿真环境里物体的三维模型、尺寸、摄像头参数都是已知的、精确的,这是COAP感知代码能工作得这么好的重要前提。真实世界里这些东西都得现测,测量误差会怎么影响整个系统的稳定性,这是一个悬而未决、但非常值得追问下去的问题。
Q&A
Q1:Code-Only-as-Policy(COAP)是什么?
A:COAP是一种让机器人完全靠代码(不靠AI模型)来完成任务的方法。它把机器人和环境看作一台图灵机,用代码变量记录状态(物体位置、机器人姿态等),用代码逻辑来决策,运行时不需要调用任何神经网络模型。
Q2:COAP和VLA、Agent Harness相比效果怎么样?
A:在RoboDojo的42个双臂任务测试中,COAP拿到70.24%的成功率,比最强的智能体框架方案(31.38%)高出38.86个百分点,比最强的VLA方案(27.96%)高出超过40个百分点,而且在记忆、精度、泛化等五个维度全部排名第一。
Q3:COAP的代码库是怎么开发出来的?
A:由AI编程助手(Claude Opus 5.5)在一个闭环流程里自主完成,包括写代码、调试、测试、决定是否采纳修改,整个过程没有人工介入。开发时会并行尝试多个修改方案(类似广度优先搜索),挑出效果最好的那个合并进主代码库。







