GPT‑6 Astra 如何与 VLA 结合:从语义推理到可执行机器人动作
0. 简介
GPT‑6 Astra 与视觉语言动作模型(Vision-Language-Action,VLA)的结合,适合被理解为一条可落地的控制工程路线:VLA 负责从图像、语言和本体状态产生连续动作候选,Astra 负责检查目标是否对齐、上一段动作是否真的生效,以及是否需要短程 EEF 修正。用户提供的 GPT‑6 Astra 评测显示,在同一套 YAM 双臂任务中,它把方块放入碗的成功率做到 19/20;在 RoboDojo 的十项双臂任务上,π0.5 提供动作、Astra 负责审核修正的混合架构达到 48% 成功率,高于 Direct 的 26%。本文把重点放在如何接入:先固定观察和动作契约,再用单臂仿真验证 VLA 适配器,随后加入 Astra gate、限幅 EEF 控制、日志指标和真机灰度,最后把真实失败回流到仿真和数据增广中。
1. 机器人控制中的真实矛盾
1.1 语言目标与连续动作之间存在鸿沟
人类听到“把蓝色圆片放入圆槽”时,会自动补齐许多没有说出的步骤:先辨认圆片和圆槽,再判断旋钮能否夹持,接近时避开板面,抓起后调整姿态,最后用小幅度动作完成插入。语言模型能够描述这些步骤,却不天然知道机械臂每个关节在当前坐标系中能否到达,也不知道夹爪闭合后物体是否真的被夹住。机器人接口通常只接受位置、姿态、夹爪开度或关节目标,因此中间必须有一层把语义判断翻译成受限的几何动作。控制难点不是生成一句正确指令,而是在每个动作片段之后确认世界真的发生了预期变化。
1.2 只靠大模型或只靠 VLA 都会留下空缺
纯大模型控制的优势是能处理开放式指令、目标选择和异常解释,但它需要频繁读取图像、推理、输出动作,容易产生长延迟和轨迹不连贯。专门的 VLA 则从大规模机器人轨迹中学到接近、抓取、搬运等连续模式,反应更像熟练的运动控制器,可是当场景里出现任务未完成、目标被遮挡或候选轨迹指向错误物体时,单一策略缺少重新解释指令的能力。两者的互补关系可以理解为“语义审核器加动作小脑”,而不是把两个模型简单串联。

2. VLA 在系统中的位置
2.1 VLA 学到的是动作分布而非完整任务证明
VLA 通常把图像、语言和机器人状态编码到同一个策略中,然后预测关节动作、末端位姿或一段动作块。它从示范中学习“看到杯子、夹爪在右侧、目标在前方时,下一小段轨迹大概长什么样”,因此拥有很强的动作先验,但输出仍然是概率意义上的候选。候选动作是否满足任务顺序、是否抓住了正确对象、是否已经达到终止条件,需要额外的状态判断。这里的关键是把 VLA 的输出看成可审查的提案,而不是无条件执行的真值。
2.2 π0.5 适合承担连续运动的低层负担
用户提供的实验中,π0.5 每次根据三路图像、14 维本体状态和任务指令生成 50 步、每步 14 维的关节空间候选序列。Astra 不需要从零构造完整的低层轨迹,而是查看候选动作对应的双臂正运动学轨迹,再决定执行前 1–15 步,或用自己的末端执行器动作修正 1–5 步。换句话说,VLA 负责把机械臂带到“合理的运动流形”附近,通用模型把有限的推理预算集中到目标错位、接触异常和任务收尾等高价值节点。
2.3 与 RT‑2、Octo、OpenVLA 的路线差异
RT‑2 把视觉语言模型的知识迁移到机器人动作预测,代表“扩大多模态模型并让它直接输出动作”的路线;Octo 使用 Open X‑Embodiment 中约 80 万条轨迹,强调跨传感器、跨动作空间的可微调通用策略;OpenVLA 是约 7B 参数的开源 VLA,使用 DINOv2、SigLIP 与 Llama 2 组件,并在约 97 万条真实机器人示范上训练。GPT‑6 Astra 与这些模型的差异在于控制角色:它可以直接成为策略,也可以只做候选轨迹的语义审查器。直观理解是,前几类工作主要在提升“动作生成器”的覆盖面,而 Astra 组合方案额外引入了“动作是否仍然符合任务”的审查面。这使得比较重点从“哪个模型更大”转向“谁负责连续动作、谁负责异常决策”。
3. 两种控制架构的输入与输出
3.1 观察、历史与任务指令
系统在每个决策点接收头部相机、左右腕部相机、本体状态、原始任务指令和执行历史。三路图像提供互补视角:头部相机适合判断整体布局,腕部相机适合看夹爪附近的接触关系,本体状态则给出关节和末端执行器的实际位姿。历史记录保存已经验证的子目标、最近动作、失败迹象和剩余步数,避免模型把“已经完成但后来掉落”的状态误认为仍然有效。观察不是一次性输入,而是每个动作片段结束后重新采样的闭环状态。这意味着多视角输入的价值不只是增加像素数量,而是让模型能够把全局目标、局部接触与自身运动放到同一时刻对齐。
3.2 混合架构与 Direct 架构的数学表示
令 o t o_t ot 表示三路视觉观察, p t p_t pt 表示本体状态, ℓ \ell ℓ 表示任务指令, h t h_t ht 表示执行历史。这里的关键是,四类变量在系统中承担的角色不同:图像提供可见场景,本体状态提供可达性与运动约束,语言给出任务目标,历史则提供跨动作段的因果线索。混合控制先由 VLA 产生候选动作,再由 Astra 在候选动作和观测之间做选择;Direct 则跳过候选动作生成,直接输出末端执行器目标。对于研究者而言,这个划分决定了消融实验应该比较“是否有候选动作”“是否允许 EEF 修正”以及“是否保留历史”,而不能只比较两个模型名称。
A t π = π 0.5 ( o t , p t , ℓ ) , d t = R e v i e w A s t r a ( o t , p t , ℓ , h t , A t π ) A_t^{\pi}=\pi_{0.5}(o_t,p_t,\ell),\qquad d_t=\mathrm{Review}_{\mathrm{Astra}}(o_t,p_t,\ell,h_t,A_t^{\pi}) Atπ=π0.5(ot,pt,ℓ),dt=ReviewAstra(ot,pt,ℓ,ht,Atπ)
A t = { A t π [ 1 : k t ] , d t = s t u d e n t A t A s t r a , d t = e d i t o r e e f , ( o t + k t , p t + k t ) = E n v ( A t ) A_t=\begin{cases}A_t^{\pi}[1:k_t],&d_t=\mathrm{student}\\A_t^{\mathrm{Astra}},&d_t=\mathrm{edit\ or\ eef}\end{cases},\qquad (o_{t+k_t},p_{t+k_t})=\mathrm{Env}(A_t) At={Atπ[1:kt],AtAstra,dt=studentdt=edit or eef,(ot+kt,pt+kt)=Env(At)
其中
k
t
k_t
kt 是本次真正执行的控制步数。这里要厘清的是,
k
t
k_t
kt 不是模型计划执行的步数,而是经过服务校验、动作裁剪和控制 ACK 后实际落到仿真器或机器人上的步数。混合架构中的 student 不是学生模型的泛称,而是沿用 π0.5 候选动作的分支;edit 和 eef 则代表受限修正。Direct 架构可写成:
A t d i r e c t = A s t r a ( o t , p t , ℓ , h t ) , A t d i r e c t = { x t , R t , g t } l e f t , r i g h t A_t^{\mathrm{direct}}=\mathrm{Astra}(o_t,p_t,\ell,h_t),\qquad A_t^{\mathrm{direct}}=\{x_t,R_t,g_t\}_{\mathrm{left,right}} Atdirect=Astra(ot,pt,ℓ,ht),Atdirect={xt,Rt,gt}left,right
这里 x t x_t xt 是位置, R t R_t Rt 是姿态, g t g_t gt 是夹爪状态。对于双臂系统,左右臂的目标必须同时给出,即使其中一只手只是保持当前姿态,也要显式发送保持目标,否则接口层无法区分“保持”与“未提供”。这会影响控制器的幂等性、日志回放和异常恢复。同一个大模型在两种架构里承担的工作量并不相同:混合模式审核并修正,Direct 模式需要从观察直接合成全部 EEF 动作。
3.3 EEF 接口把语言决策限制在可执行范围内
末端执行器接口要求左右臂都给出环境坐标系下的位置、单位四元数姿态和夹爪状态,每次目标距离当前实测位姿不超过 5 厘米、旋转不超过 0.35 弧度。底层再用局部阻尼最小二乘逆运动学把 EEF 目标变成关节增量,并在每次实际控制确认后重新计算。这个限制像汽车的方向盘限位器:模型仍然可以决定往哪里走,但不能一口气发出超出机械臂局部可达范围的跳跃命令。
直觉理解:EEF 限制像驾校教练在副驾驶踩着辅助刹车。教练可以接受学员“向左并线”的判断,但会限制一次打方向的幅度,并在车辆真正移动后再决定下一步。
工程价值:对研究者而言,局部 EEF 限制把大模型的开放式输出压缩到可测试的动作邻域,使同一条轨迹可以分别评估语义目标、局部几何和底层跟踪误差。
4. Astra 如何审核 VLA 候选动作
4.1 先判断上一段动作是否真的生效
Astra 的审核不能只看候选动作长什么样,还要对比执行前后的图像、实测 EEF 位姿、夹爪命令和任务历史。例如,夹爪闭合并不能证明抓住物体,物体被抬离桌面且随夹爪移动才是更有力的证据;放置动作结束后,物体暂时出现在碗口附近也不能证明已经进入容器。审核器因此维护 verified_completed、currently_attempting 和 remaining 三类状态,并允许在后续观察发现物体掉落或结构倒塌时撤销此前的完成判断。
4.2 再判断下一段动作是否符合任务意图
第二个问题是候选轨迹的下一步是否与当前子目标一致。模型需要检查选中的物体、目标位置、操作方向和先决条件。例如,前一步抓取失败后,候选轨迹直接去搬运另一个物体,就算动作本身在几何上可达,也属于意图错位。只有在上一段明确失败或下一段意图明确偏离时,Astra 才应该接管;仅仅因为姿态看起来不完美或结果暂时不确定就频繁修正,会打断原本连续的 VLA 轨迹。
4.3 最小可用的审核器代码
下面的代码是依据公开报告中的 Outcome / Intent 规则整理的工程示例,展示如何把“动作结果”和“下一步意图”分开判断。它没有假装能够从一张图像得到物体真值,输入的 evidence 必须来自执行前后观察与实测状态。进一步看,这个拆分还为评测提供了可解释的错误标签:同一条失败轨迹可以被标记为“抓取未发生”“目标已错位”或“候选动作虽可达但违反先决条件”,从而避免把所有失败都归因于模型推理能力不足。
# hybrid_gate.py
from dataclasses import dataclass
from typing import Literal
ExecutionStatus = Literal["not_started", "progressing", "failed", "uncertain", "recovered"]
IntentStatus = Literal["aligned", "misaligned", "uncertain"]
@dataclass
class GateResult:
execution_status: ExecutionStatus
intent_status: IntentStatus
evidence: str
takeover: bool
def review_chunk(last_observation, next_trajectory, task_state) -> GateResult:
execution_status, evidence = compare_before_after(
task_state.before, last_observation, task_state.last_action
)
intent_status = assess_intent(
next_trajectory, task_state.current_subgoal, task_state.verified_completed
)
takeover = execution_status == "failed" or intent_status == "misaligned"
return GateResult(execution_status, intent_status, evidence, takeover)
这段代码最重要的设计不是 takeover 这一行,而是把两个判断拆开:执行失败说明上一段没有得到预期结果,意图错位说明下一段即使能执行也不该执行。工程上还要把每次判断绑定到 request_id、观察路径和实际 ACK,避免审核器读取旧图像或把未执行的目标误当成已到达状态。审核器的价值在于控制接管时机,而不是让大模型对每个控制步都重新发号施令。

5. EEF 修正与局部逆运动学
5.1 为什么修正动作要短
混合控制中的修正只执行 1–5 步,位置偏移限制为 5 厘米、姿态偏移限制为 0.35 弧度。短片段让模型有机会在拨动物体、调整接近方向或避开容器边缘后立即重新观察,而不是一次生成很长的“纠错计划”。这对接触任务尤其重要,因为物体滑落、夹爪碰撞和容器边缘干涉往往发生在动作段内部,段越长,模型发现错误的时间就越晚。这里的关键是让修正承担局部恢复,不让它取代 VLA 的全部运动经验。
5.2 用阻尼最小二乘把目标变成关节增量
设当前关节为 q q q,末端位姿误差为 e e e,雅可比矩阵为 J ( q ) J(q) J(q),阻尼系数为 λ \lambda λ。局部控制器求一个小的关节增量,使末端朝目标移动,同时避免在奇异位形附近出现过大的关节变化。核心问题在于,模型输出的是笛卡尔空间目标,而机械臂实际执行的是关节空间控制;两者之间不仅有逆运动学映射,还有关节限位、碰撞约束、夹爪偏置和控制周期离散化。研究时应同时记录目标位姿、IK 求解结果和实测位姿,否则无法判断失败发生在语义规划、几何映射还是底层跟踪。
Δ q = J ( q ) T ( J ( q ) J ( q ) T + λ 2 I ) − 1 e , q t + 1 = c l i p ( q t + Δ q , q min , q max ) \Delta q=J(q)^T\left(J(q)J(q)^T+\lambda^2I\right)^{-1}e,\qquad q_{t+1}=\mathrm{clip}(q_t+\Delta q,q_{\min},q_{\max}) Δq=J(q)T(J(q)J(q)T+λ2I)−1e,qt+1=clip(qt+Δq,qmin,qmax)
代码层面还要限制单步平移、旋转和关节变化,并在每次 ACK 后用实测状态重算,而不是把模型提出的目标当作已经到达。这样做牺牲了一点动作速度,换来对关节限位和局部数值不稳定的保护。EEF 目标是控制请求,不是物理事实;物理事实必须来自下一次观察。
难点提示:阻尼项可以类比为走狭窄楼梯时扶住栏杆。没有阻尼,算法可能为了追一个小的末端误差而突然大幅扭动多个关节;有了阻尼,它会接受“先走得稳,再走得准”的折中。
解读:逆运动学公式只解决“怎样让末端靠近目标”,不解决“物体是否被夹住”。这就像地图能给出一条可行道路,却不能证明车辆轮胎已经抓住湿滑路面;接触结果仍需由下一帧视觉、力或触觉反馈确认。
5.3 局部 EEF 执行器示例
# eef_controller.py
import numpy as np
def damped_ik_step(q, target_pose, current_pose, jacobian,
damping=0.08, max_joint_step=0.05):
error = pose_error(current_pose, target_pose) # [dx, dy, dz, d_rx, d_ry, d_rz]
jj_t = jacobian @ jacobian.T
dq = jacobian.T @ np.linalg.solve(jj_t + damping**2 * np.eye(6), error)
dq = np.clip(dq, -max_joint_step, max_joint_step)
return q + dq
def bounded_target(current, proposed, max_translation=0.05, max_rotation=0.35):
delta = pose_delta(current, proposed)
delta[:3] = clip_norm(delta[:3], max_translation)
delta[3:] = clip_norm(delta[3:], max_rotation)
return compose_pose(current, delta)
这段执行器代码体现了三层保护:先计算位姿误差,再用阻尼逆解得到关节变化,最后对目标位姿和单关节步长做裁剪。真实系统还应加入碰撞检查、夹爪状态映射、控制 ACK 超时和不可恢复错误处理。对于双臂任务,左右臂目标必须一起校验,否则一只手在等待时另一只手继续前进,可能把原本安全的协作轨迹变成碰撞。代码没有包含具体机器人厂商的运动学参数,因此它适合作为控制接口骨架,不能直接替代机器人厂商的安全控制器。
6. 端到端闭环的工程实现
6.1 每轮控制的固定顺序
一个可审计的执行循环通常包含启动环境、读取观察、生成候选动作、审核候选动作、执行短片段、再次读取观察和写入日志七个步骤。混合模式使用 robodojo_start → pi05_infer → robodojo_execute,Direct 模式使用 robodojo_start → robodojo_act。每次服务调用都绑定最新的观察路径和唯一请求编号,执行结果返回后才允许进入下一轮。这样的顺序看起来比直接写一个 while 循环更繁琐,但它能把“模型想做什么”“控制器实际做了什么”“环境反馈了什么”分开记录。
6.2 混合策略控制循环示例
# hybrid_rollout.py
def run_hybrid(task, env, policy, astra, max_steps):
obs = env.start(task)
history = []
while not obs.rollout_finished and obs.step_id < max_steps:
proposal = policy.infer(obs.images, obs.proprio, task.instruction)
gate = astra.review(
observation=obs,
proposal_fk=proposal.fk_trajectory,
history=history,
instruction=task.instruction,
)
if gate.decision == "student":
action = proposal.actions[:gate.steps]
elif gate.decision in {"edit", "eef"}:
action = astra.make_bounded_eef_action(obs, gate, steps=gate.steps)
else:
raise RuntimeError("stop is not valid before native termination")
result = env.execute(action, request_id=obs.request_id)
history.append({"gate": gate, "result": result.summary})
obs = result.next_observation
return obs.native_outcome, history
这段循环把 VLA 当作高频候选轨迹源,把 Astra 当作低频但高成本的决策层。它还明确禁止在“模型觉得成功”时提前停止,只有环境返回原生终止信号才结束评测。这里的关键是 proposal.fk_trajectory 只描述机器人自身的正运动学,不包含物体接触、抓取成功或未来奖励,因此审核器必须结合真实图像和实测状态判断。这里值得注意,控制 ACK 只能证明命令被执行器接受,不能证明末端已经到达,更不能证明物体已经移动;后两者需要下一时刻的实测位姿和视觉证据。闭环不是把模型调用次数堆起来,而是让每次调用都对应一个可验证的状态转移。
6.3 日志、回放与失败归因
每个控制步应保存原始图像、14 维本体状态、当前 EEF 位姿、动作命令、控制 ACK、模型决策理由和环境终止状态。失败分析至少区分目标选择错误、抓取失败、搬运碰撞、放置姿态错误、动作段过长和终止条件遗漏。只有这样,后续训练才能判断是 VLA 的动作先验不足、Astra 的语义判断错误,还是底层运动学和传感器延迟造成的问题。日志结构也决定了实验能否复现:任务、布局、重置、初始状态和策略随机种子必须绑定到同一个输出目录。
7. 训练与推理的接口边界
7.1 这套组合通常不需要重新训练 Astra
用户给出的 RoboDojo 设置把 GPT‑6 Astra 当作推理时的策略或审核器,把任务微调过的 π0.5 当作动作提案器。系统重点不在端到端反向传播,而在接口设计、上下文组织、动作约束和失败反馈。这样可以快速验证通用模型是否能理解机器人状态,也避免为了每一种机械臂重新训练一个巨大语言模型。代价是推理延迟、调用成本和错误恢复策略必须在运行时解决,且不能把报告中的一次性成功率当成模型已经学会了新的机器人技能。
7.2 如果要训练 VLA,动作目标需要统一坐标和时间尺度
VLA 训练时需要把不同机器人、不同相机、不同夹爪和不同控制频率的数据转换到统一表示。常见目标是下一段关节动作、EEF 位姿增量或动作块分布,损失可以写成条件动作回归或扩散/流匹配目标。若直接把不同坐标系的动作拼在一起,模型会把“左臂向前”误学成与本体无关的绝对方向,因此数据规范比单纯扩大模型更先决定跨机器人泛化上限。
L a c t i o n ( θ ) = E ( o t , ℓ , a t ) ∼ D [ ∥ f θ ( o t , ℓ ) − a t ∥ 2 2 ] \mathcal{L}_{\mathrm{action}}(\theta)=\mathbb{E}_{(o_t,\ell,a_t)\sim\mathcal{D}}\left[\left\|f_\theta(o_t,\ell)-a_t\right\|_2^2\right] Laction(θ)=E(ot,ℓ,at)∼D[∥fθ(ot,ℓ)−at∥22]
其中 D \mathcal{D} D 是机器人示范数据, a t a_t at 是统一坐标系中的动作表示。若动作是长度为 H H H 的动作块,则损失还要在时间维度聚合,并对夹爪开合、位置和姿态分别设置尺度。Astra 的审核器可以在不更新 θ \theta θ 的情况下使用这些动作块,但它无法替代数据本身对接触技能的覆盖。
工程价值:把训练目标和运行时审核拆开,就像先训练一名熟练司机,再安排一名能读地图的领航员。领航员可以纠正路线,却不能凭语言补齐司机从未练过的倒车入库动作。
7.3 动作块长度是成功率与延迟的旋钮
动作块太短,模型调用密集,观察与推理延迟会主导总时间;动作块太长,模型无法及时发现滑落和碰撞,失败后又可能已经消耗大量步数。用户提供的 RoboDojo 结果中,混合架构执行约 3,776 个动作段,Direct 执行约 7,729 个动作段,后者约为前者的 2.05 倍。这个数字不能直接等同于真实机器人速度,因为它没有计入模型响应时间,但它清楚说明了动作先验能够减少通用模型构造低层动作的频率。
8. 从单次动作到任务级状态机
8.1 任务进度必须以可观察证据更新
复杂任务不能只保存一个“完成百分比”,而应维护有顺序的子目标,例如“找到目标物体、抓起、移动到容器上方、释放、撤回并归位”。每个子目标都需要记录观察证据和反证条件。搭塔任务中,已经放好的木块可能在后续操作中倒塌;折衣任务中,衣服虽然被抓起,却可能没有形成要求的折叠形状。任务状态机的作用是防止语言模型把视觉上的“看起来完成”误当成环境的原生成功。
8.2 非抓取操作是 VLA 与 Astra 互补的典型场景
很多机器人策略默认“接近—抓取—搬运—释放”,但真实场景经常需要先推、拨、挪或调整接近方向。用户资料中的 Astra 轨迹显示,它会先拨动物体,改变物体与夹爪的几何关系,再把控制交回 π0.5;这类修正并不要求模型自己生成完整长轨迹,只需在局部观察到候选动作不合适时提出短 EEF 动作。进一步看,这种能力也解释了为什么混合架构的修正步比例只有 14.4%,却可能对最终成功率产生不成比例的影响。这意味着修正比例不能单独作为“模型参与程度”的指标,还要结合被修正动作所在的任务阶段、修正前后的状态差和最终成功率一起分析。
8.3 终止反馈是一个外部验证器
当物体已经大致放置,但仿真器没有返回终止信号时,Astra 会继续检查遗漏物体、朝向、结构稳定性或机械臂归位条件。这种行为不应被描述成模型“读懂了隐藏奖励”,因为评测规则明确要求使用环境公开的终止状态和视觉反馈。它更接近程序员看到测试仍未通过后检查边界条件:先承认目标尚未满足,再根据可观察证据提出下一步动作。

9. 实验结果如何阅读
9.1 YAM 双臂实测:任务类型决定结论
在用户提供的 Robocurve 报告中,GPT‑6 Astra 在“方块入碗”任务上完成 19/20,完成率 95%,平均每次约 2.5 分钟,估算成本 0.94 美元;Fable 5.1 为 8/20、6.8 分钟和 2.12 美元。相同报告中,“圆形拼图插入凹槽”任务 Astra 只完成 2/20,与 Fable 5.1 持平,说明语义抓取与精细插接不能用一个总分概括。报告还明确说明两类方块任务使用的机械臂 rig 不完全相同、评测不是交错执行,且人工评分存在模型已知偏差,因此这些数据适合说明行为差异,不适合推出普遍的模型排名。
9.2 RoboDojo:混合架构在困难双臂子集上领先
RoboDojo 的十个双臂任务每个运行五次。用户提供的研究报告记录了混合架构 24/50 成功,平均 Score 为 62.60;Astra Direct 13/50,平均 Score 为 37.81;π0.5 的公开重加权参照为 15.67% 成功率和 24.43 Score。混合控制共执行 42,750 个控制步,其中 6,174 步由 Astra 修正,占 14.4%,其余 85.6% 沿用 π0.5。关键数字不是“模型只调用了 14.4% 的时间”,而是它在每个决策点都审核候选动作,却只在观察到失败或意图错位时真正替换动作。
| 架构 | 成功率 | 平均 Score | 执行动作段 | 记录 Token(含缓存输入) |
|---|---|---|---|---|
| π0.5 + GPT‑6 Astra | 48%(24/50) | 62.60 | 3,776 | 624,762,828 |
| GPT‑6 Astra Direct | 26%(13/50) | 37.81 | 7,729 | 1,132,343,772 |
| π0.5 公开参照 | 15.67% | 24.43 | 未提供 | 未提供 |
9.3 RoboLab:基础策略是否适配任务很关键
在用户资料引用的 RoboLab 十项单臂 Franka 任务中,Direct 成功 49/50,混合架构 46/50,π0.5 与 Cosmos3‑Nano‑Policy 都是 18/50,DreamZero 为 17/50。这个排序与 RoboDojo 相反,原因可能在任务构成和策略适配:RoboLab 子集偏语义抓放、颜色与大小判断、按顺序叠放和杯子朝向调整,而 π0.5 在这些测试任务上属于零样本迁移;当 Direct 已能稳定完成目标,加入不匹配的动作先验反而会增加审核与恢复负担。这里的结论是条件性的,不能把两个 benchmark 的百分比直接横向相减。
9.4 成本、Token 与物理时间不能混为一谈
用户资料中的 Token 统计是线路层面的请求与响应数量,包含缓存输入,并不等于账单金额;物理时长则按控制步数乘以 0.04 秒计算,不包含模型响应等待。Direct 的平均物理时长较短,可能部分来自它更早失败而提前结束;混合架构 Token 更少,也不能自动说明端到端延迟更低。评价真实部署应同时记录模型响应时间、控制频率、动作段长度、重试次数、人工干预和失败恢复成功率。

10. 用一个适配器接入 VLA
10.1 先冻结观察与动作契约
接入 VLA 的第一步不是写提示词,而是把机器人系统的数据契约冻结下来。建议把每一帧观察统一为 images、proprio、eef_pose、instruction、episode_id 和 step_id 六个字段,并明确时间戳、坐标系、单位和缺失值处理方式;动作则统一为 eef_target 或 joint_chunk,同时携带 horizon、gripper、frame_id 和 request_id。研究者常见的错误是直接把某个仓库的动作数组塞给另一个机器人,结果位置单位、四元数顺序、夹爪开合语义和控制频率同时发生漂移。VLA 适配器的首要任务是消除表示歧义,模型本身反而排在第二位。
建议在接口层写出不可变的 schema 校验。位置必须是米,旋转统一使用单位四元数 wxyz,夹爪状态明确区分“开口宽度”和“闭合布尔值”;所有动作都要绑定生成它的观察编号,过期动作直接丢弃。这样做能够把许多“模型表现不稳定”的问题提前变成可定位的协议错误。换句话说,适配器不是一层简单的字段重命名,而是把 VLA 的输出变成可以回放、拒绝和审计的控制请求。
# vla_contract.py
from dataclasses import dataclass
import numpy as np
@dataclass(frozen=True)
class Observation:
images: dict[str, str]
proprio: np.ndarray # radians, meters, normalized gripper
eef_pose_wxyz: dict[str, np.ndarray]
instruction: str
episode_id: str
step_id: int
@dataclass(frozen=True)
class ActionChunk:
mode: str # "joint_chunk" or "eef"
values: np.ndarray
horizon: int
request_id: str
source_step: int
def validate_action(action: ActionChunk, obs: Observation) -> None:
assert action.request_id
assert action.source_step == obs.step_id
assert 1 <= action.horizon <= 15
assert np.isfinite(action.values).all()
这段代码的作用是让控制服务在模型输出之后拥有一个明确的拒绝点。source_step 防止旧观察产生的动作插入当前 episode,horizon 防止一次调用绕过动作段上限,isfinite 则拦截 NaN 和无穷值。真正接入时还应把姿态单位化、检查双臂目标是否齐全,并验证动作坐标系是否与机器人控制器一致。代码只展示契约骨架,不能代替厂商安全 API;但没有这层契约,后面的 Astra 审核和统计都无法回答“执行的究竟是哪一版动作”。
10.2 选择 Joint Chunk 还是 EEF Target
如果 VLA 已经针对目标机器人训练,优先保留它的原生 joint_chunk 输出,让底层策略负责连续协调;如果 VLA 来自不同本体或只支持末端动作,则在适配器中转换为 EEF 目标,并把 IK、碰撞和关节限位放在模型之外。研究阶段可以同时保存两种表示:原始关节候选用于复现策略行为,EEF 轨迹用于给 Astra 审核和人类研究者阅读。这里值得注意,正运动学只能说明机械臂自身会经过哪些位姿,不能说明物体是否被抓住,因此候选轨迹必须和视觉执行证据分开记录。

11. 把 Astra 接成审核器而不是第二个 VLA
…详情请参照古月居
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)