“把桌上的杯子放进水槽。”人做这件事不用想:走过去、伸手、抓住、转身、松手。同一句话交给机器人,会变成三个性质不同的问题:先做什么后做什么、手怎么在空间里挪过去、每个关节每一毫秒出多大力。

这篇把这三层摊开,看清每一层输入什么、输出什么,以及一句话最常在哪一层断掉。

全貌:三个问题,三种时间尺度

第二段按顺序、几何、力学展开:任务层的输出是一串离散步骤(走到桌边 → 抓住杯子 → 走到水槽 → 松手);运动层把其中一步展开成一条连续轨迹,即每个时刻手腕在哪、朝哪个方向;控制层把轨迹上的每个点变成关节力矩。

三层的时间尺度差了几个数量级:任务层可能几十秒才决策一次,运动层算一条轨迹要几百毫秒到几秒,控制层每秒要更新几百到上千次。让每秒要出上千次结果的模块等上层慢慢想,是不可能的。分层先是被这个差别逼出来的。

绘制中

任务层:世界被压成一张清单

任务层只认几个离散事实:杯子在桌上、手是空的。每个动作用两句话描述——前提条件 和 效果:抓杯子要求“手是空的”且“杯子可及”,效果是“手上有杯子”。规划于是变成搜索:找一串动作,让每个动作轮到它时前提刚好成立。

这样做的好处,是连续的物理世界被压成有限个状态,搜索有现成算法可用。代价是这一层不知道距离,不知道碰撞,不知道杯子有多重——它只判断逻辑上说不说得通。

大模型常被放在这一层,因为它确实会拆步骤:倒水之前要先拿杯子。但它不知道杯子还在不在桌上、手是不是空的、那个位置够不够得着。SayCan 的办法是把两件事相乘:语言模型给每个技能一个“这对完成指令有多大用”的分,价值函数给一个“此刻能做成的概率”,相乘后选最高的执行;执行完一个技能,再问一次 1。

SayCan 的结构:语言模型给技能的“有用程度”打分,价值函数给“此刻做成的概率”打分,相乘选出下一步,然后循环

在 101 个真实厨房任务上,这个系统选对技能序列的比例是 84%,真正做完的是 74%;加入可行性打分后,误差大约减半 1。比数字更要紧的是结构:每执行一步就重新规划一次,而不是算完一整条计划再一口气执行。上层因此随时有机会发现前提已经不成立。

运动层:位姿变成高维空间里的一个点

一台七轴机械臂,每个关节角是一个数,七个角合起来决定一个完整姿态。把七个角当成七个坐标轴,就得到七维的 构型空间:手臂的每一种姿态是里面一个点,“从当前位置挪到杯壁”变成“在两个点之间连一条线”,“会不会撞到桌沿”变成“这条线会不会穿过被占掉的那块区域”。上一篇里的末端位姿,在这一层就是“先换成构型空间里的坐标,再连线”。

找这条线的主流做法是 采样:随机在空间里撒点、从起点往外长出一棵树、碰上目标就停。它赌的是“存在一条可行路径”比“找到最短的那条”容易得多,而机器人通常只需要前者。

这一层还要定两个 连续参数:抓杯子的哪一侧、放在水槽的哪里、什么朝向。它们既不是离散步骤,也不是关节角,而是夹在两层中间的数。TAMP(任务与运动规划)的综述指出,通用性最吃紧的地方恰恰是这类“怎么抓、放哪儿”的实数参数 2。

控制层:轨迹只是期望,不是结果

轨迹说“0.7 秒时手腕应该到 (x, y, z)”,控制器面对的是重力、变了的惯量、摩擦和间隙。它的活是算力矩,并按测到的偏差不断修正。只做位置控制时,它会假定没人挡我,一碰到意料之外的接触就一路使劲往里顶;需要接触的任务(拧、插、擦)得改成控制力,这一层留到下一篇专门讲。控制层也会失败:要求关节在 0.1 秒内转过 90 度,电机给不出那么大扭矩。

接口最容易断的三处

第一处:任务计划在几何上做不到。 水槽前面被椅子挡着,或者手从任何角度都伸不进杯子和墙之间那条缝。分开求解时,任务层以为最优的顺序,运动层直接返回无解,只能回头换顺序——这正是 TAMP 要反复迭代的原因 23。

第二处:中间那两个连续参数选错。 抓点选在杯口,力封闭没问题,能提起来,但往水槽里倒的时候手腕就转不动了;放的位置离槽壁太近,松手瞬间就碰翻。力封闭那条界线在这里显出后果:它只回答“抓得住”,不回答“抓得对不对下一步”。

第三处:状态估计错了。 每一层都以为任务在按计划推进,实际上杯子已经滑了、门根本没开。这一种最隐蔽,因为没有任何一层天然负责发现“计划的前提已经不成立”。

端到端 VLA 的选择正好相反:把三层压进一个网络,接口问题直接消失,也不用再写前提条件。代价是误差失去了中间被纠正的机会,而且现有 VLA 的训练和评测主要还集中在短时序任务上,多步串联与子任务依赖仍是明确的短板 4。这也解释了为什么能真干活的系统大多保留分层——分层不是为了架构好看,而是为了在层与层之间留出纠错的接口。

一句话收束

一句“把杯子放进水槽”,先被拆成一串离散步骤(管顺序),每一步再展开成一条不撞东西的轨迹(管几何,顺带定了抓哪儿、放哪儿),轨迹最后换成每毫秒的力矩(管力学)。最容易断的地方不在某一层内部,而在层与层之间:符号说“放进水槽”,几何可能说“伸不进去”。所以可靠性不来自某一层多聪明,而来自层与层之间有没有验证和回头的通道。