预备知识第 01 篇

01|机器人任务的基本对象

本文解决一个最基础、也最容易混淆的问题:机器人模型在每个时刻到底拿到什么信息、预测什么信息、这些信息如何跨时间连成一个任务?

学完本文后,你应当能够读懂 π0/π0.5 论文中 observationstateaction chunktrajectoryepisodepolicy 的含义,并能把它们映射到一个真实的机器人执行循环。

1. 先建立一条主线:机器人在一个循环里“看、想、动、再看”

把机器人想成一个一直运行的闭环系统,而不是一个“输入指令、一次性输出完整答案”的程序。

当用户说“把红色杯子放进水槽”时,机器人不能直接把这句话变成一个抽象的“完成”信号。它必须重复完成下面的过程:

任务指令

获得当前观测(相机、传感器、机器人本体状态)

根据当前观测判断“现在处于什么阶段、下一步该做什么”

输出一小段低层控制动作

机器人执行,环境随之改变

再次获得新的观测,并修正下一步动作

我们用离散时间步 (t=0,1,2,\ldots) 表示这个循环中的每一轮。第 (t) 步结束后,环境和机器人会从当前状态演化到下一状态:

xt+1=f(xt,at,εt)x_{t+1}=f(x_t,a_t,\varepsilon_t)

其中:

  • (x_t):完整的真实世界状态;
  • (a_t):机器人在时刻 (t) 执行的动作;
  • (f):真实物理世界和控制器共同构成的状态转移过程;
  • (\varepsilon_t):未建模因素,例如摩擦变化、相机噪声、执行误差、物体滑动或人的干预。

这里的 (x_t) 是一个理论上的完整状态。它可能包含杯子的精确三维姿态、桌面摩擦系数、物体是否接触、柜门阻尼、机器人全部关节和电机状态等。真实系统无法把这些信息完整交给模型,因此机器人只能根据可见、可测的部分信息做决定。

这就得到控制问题的核心形式:

ot=g(xt,ηt),atπθ(ot,)o_t=g(x_t,\eta_t),\qquad a_t\sim\pi_\theta(\cdot\mid o_t,\ell)

其中:

  • (o_t) 是机器人实际获得的观测;
  • (g) 是传感器把真实世界映射为观测的过程;
  • (\eta_t) 是图像噪声、遮挡、延迟等感知误差;
  • (\ell) 是整项任务的语言指令,例如“把红色杯子放进水槽”;
  • (\pi_\theta) 是参数为 (\theta) 的策略模型。

这一主线最重要的结论是:模型永远不是直接看到真实世界 (x_t),而是在不完整的观测 (o_t) 下,结合任务指令 (\ell),输出短期动作并不断根据新观测修正。

1.1 统一符号、数字和张量表示

后续文章统一使用下面的符号。表格用于快速查阅“这个符号指什么”;正式数学定义统一放在表格之后,以块级公式呈现。

符号名称代码中常见 shape含义
(t)时间步单个整数当前控制循环的编号
(x_t)完整世界状态通常不可直接获得理论上完整、但通常不可直接获取的系统状态
(o_t)观测一个字典或多模态结构当前时刻实际送入策略的输入信息
(q_t)本体感觉状态([B,d_q])机器人自身可测状态,例如关节、夹爪、底座等
(I_t^{(i)})第 (i) 路图像([B,C,H,W])第 (i) 个相机在时刻 (t) 的图像
(\ell)高层任务指令([B,L])贯穿整个任务的自然语言目标
(\hat{\ell}_t)高层语义子任务([B,M])机器人当前阶段要完成的局部语义目标
(a_t)单步动作([B,d_a])当前时刻发给底层控制器的控制向量
(a_{t:t+H-1})动作块([B,H,d_a])从 (t) 开始、长度为 (H) 的连续动作序列
(\tau)轨迹长度为 (T) 的记录一次任务过程中所有时刻的记录
(e)回合一个 episode 文件/对象一次完整任务及其结果、元数据
(\pi_\theta)策略模型 forward根据输入生成子任务或动作的模型

形式化定义

t{0,1,,T},xtX,otO,qtRdqt\in\{0,1,\ldots,T\},\qquad x_t\in\mathcal{X},\qquad o_t\in\mathcal{O},\qquad q_t\in\mathbb{R}^{d_q} ot=[It(1),It(2),,It(n),qt]o_t=\left[I_t^{(1)},I_t^{(2)},\ldots,I_t^{(n)},q_t\right] L,^tL,atRda\ell\in\mathcal{L},\qquad \hat{\ell}_t\in\mathcal{L},\qquad a_t\in\mathbb{R}^{d_a} at:t+H1=[at,at+1,,at+H1]RH×daa_{t:t+H-1} =\left[a_t,a_{t+1},\ldots,a_{t+H-1}\right] \in\mathbb{R}^{H\times d_a} τ={(ot,at)}t=0T1,e=(id,,τ,y,m)\tau=\left\{(o_t,a_t)\right\}_{t=0}^{T-1},\qquad e=\left(\text{id},\ell,\tau,y,\mathcal{m}\right)

其中 (B) 是 batch size,(C) 是图像通道数,(L)、(M) 是任务指令和子任务的 token 长度,(H) 是动作块长度,(d_q)、(d_a) 分别是状态、动作向量维度。

例如,若一个机器人单步动作包含 18 个数,则 (d_a=18);若模型一次预测未来 20 步动作,则动作块 shape 为 ([B,20,18])。这些数不是通用常量,必须由具体硬件、控制模式和数据格式决定。

2. 六个核心概念

2.1 Observation:观测 (o_t)

观测是策略在当前时刻真正看得到、拿得到的信息。 它回答的问题是:“机器人现在凭什么做决定?”

一个常见的多模态观测可写为:

ot=[It(1),It(2),,It(n),qt]o_t=\left[I_t^{(1)},I_t^{(2)},\ldots,I_t^{(n)},q_t\right]

其中 (I_t^{(i)}) 是第 (i) 个相机在时刻 (t) 的图像,(n) 是相机数量,(q_t) 是机器人本体感觉状态。方括号表示将不同信息组织为同一份模型输入,不意味着图像与状态必须直接在数值维度上拼接。

观测还可能包含深度图、力/力矩传感器、历史动作、语言上下文或目标检测结果。关键不在于字段越多越好,而在于每一项是否能在部署时稳定获得,并且是否与训练时的定义一致。

观测与完整状态的区别

xt真实世界的完整状态ot机器人实际获得的观测\underbrace{x_t}_{\text{真实世界的完整状态}} \quad\neq\quad \underbrace{o_t}_{\text{机器人实际获得的观测}}

杯子背面是否已经被抓牢属于真实世界状态的一部分,但单目相机未必能可靠观察到;桌面的摩擦系数会影响动作结果,却通常不会作为一个数字输入模型。因此,机器人控制本质上是在部分可观测环境中的决策问题。

在 π0.5 中如何对应

π0.5 论文将观测写作 (o_t),明确由一个或多个相机图像与机器人本体感觉状态 (q_t) 组成。π0.5 论文,第 III、IV 节

在论文使用的移动操作平台上:

  • 高层子任务推理使用四个相机视角:前方、后方和两个腕部相机;
  • 低层动作推理使用前方相机和两个腕部相机;
  • 这说明“观测”不是固定不变的单一张量,模型不同阶段可以使用不同的观测子集。

掌握目标:看到 observationimagescamera_viewspropriostate 等字段时,能够判断它们是否属于 (o_t),以及训练和推理时是否一致。

2.2 State:完整状态 (x_t) 与本体感觉状态 (q_t)

“state”在机器人论文中有两种常见含义,必须主动区分。

含义一:完整世界状态 (x_t)

完整状态 (x_t) 指系统真实的全部情况,包括机器人、物体、环境及其相互关系:

xt=[xtrobot,xtobjects,xtenvironment,xtcontacts]x_t=\left[x_t^{\text{robot}},x_t^{\text{objects}},x_t^{\text{environment}},x_t^{\text{contacts}}\right]

它可能包含机器人关节位置、物体姿态、柜门开合、接触关系、摩擦和遮挡等。这是理论建模中的完整 state,但真实机器人通常无法完整观测。

含义二:机器人本体感觉状态 (q_t)

实际 VLA 代码里名为 state 的字段,常常更接近 (q_t):机器人自身传感器能够直接读到的数值向量。

qt=[qtjoint,qtgripper,qtee,qtbase,qtlift]Rdqq_t=\left[q_t^{\text{joint}},q_t^{\text{gripper}},q_t^{\text{ee}},q_t^{\text{base}},q_t^{\text{lift}}\right]\in\mathbb{R}^{d_q}

它可能包括关节角度/速度、夹爪开合、末端位姿、底座线速度和角速度、升降机构位置。因此最稳妥的阅读习惯是:先问代码里的 state 是完整环境状态,还是机器人本体感觉向量。 在真实机器人 VLA 中,后者更常见。

在 π0.5 中如何对应

π0.5 将 (q_t) 称为机器人配置(robot configuration)。论文中的移动平台有双臂、平行夹爪、全向移动底座和升降机构;对应状态/动作空间为 18 或 19 维,差异来自两个平台升降机构自由度不同。

论文还说明:预训练阶段会将连续本体状态离散化为 token 输入模型。这是一个实现选择,不应误读为“状态本来就是文本”;它的原始形式仍然是连续数值向量。

掌握目标:能写出 state 向量每一维的物理含义、单位、范围和时间戳,而不是只知道它的 shape。

2.3 Action:单步动作 (a_t)

动作是当前时刻交给控制器执行的低层控制量,不是“抓杯子”这样的高层任务描述。

一个动作向量可以写成:

at=[at,1,at,2,,at,da]Rdaa_t=\left[a_{t,1},a_{t,2},\ldots,a_{t,d_a}\right]^\top\in\mathbb{R}^{d_a}

动作的具体语义由控制模式决定。常见形式包括:

  1. 关节空间动作

    atjoint=[q1target,,qmtarget,gt]a_t^{\text{joint}}=[q_1^{\text{target}},\ldots,q_m^{\text{target}},g_t]
  2. 末端执行器动作

    atee=[xt,yt,zt,ϕt,θt,ψt,gt]a_t^{\text{ee}}=[x_t,y_t,z_t,\phi_t,\theta_t,\psi_t,g_t]
  3. 移动操作动作

    atmobile=[atleft arm,atright arm,atgripper,vx,t,vy,t,ωt,ht]a_t^{\text{mobile}}=[a_t^{\text{left arm}},a_t^{\text{right arm}},a_t^{\text{gripper}},v_{x,t},v_{y,t},\omega_t,h_t]

前两类动作的区别会在下一篇展开:前者直接控制关节,后者控制末端位置与姿态,仍需底层系统将目标转换为关节命令。

在 π0.5 中如何对应

π0.5 的最终低层输出是连续动作块。论文中的控制系统以 50 Hz 向双臂、夹爪、升降机构和移动底座发送目标;底层用简单 PD 控制器跟踪这些目标。论文强调,操作与导航控制来自端到端学习策略输出,而不是在策略外另加轨迹规划或碰撞检测。

训练数据的动作格式也值得注意:

  • 论文同时处理关节目标与末端执行器目标;
  • 每个数据集按各动作维度的 1% 与 99% 分位数,将动作归一化到 ([-1,1]);
  • 为容纳不同机器人,动作向量固定为最大动作空间维度;维度较少的机器人用零填充。

这三点共同说明:动作向量里的数字没有脱离数据集和控制模式的通用含义。 读代码时必须先找到 control mode、归一化统计量与每一维动作定义,才能解释模型输出。

2.4 Trajectory:轨迹 (\tau)

轨迹是一个任务在时间维度上的完整记录:

τ={(ot,at)}t=0T1\tau=\left\{(o_t,a_t)\right\}_{t=0}^{T-1}

若还要保留任务、完整状态和高层子任务,可写为:

τ=(,{xt,ot,^t,at}t=0T1)\tau=\left(\ell,\left\{x_t,o_t,\hat{\ell}_t,a_t\right\}_{t=0}^{T-1}\right)

真实机器人数据中,(x_t) 往往未知或不保存,因此更常见的是:

τrecorded=(,{It(1:n),qt,at}t=0T1)\tau_{\text{recorded}}=\left(\ell,\left\{I_t^{(1:n)},q_t,a_t\right\}_{t=0}^{T-1}\right)

若图像来自 (t)、状态来自 (t-2)、动作标签却属于 (t+1),模型不会学到正确控制关系。图像、状态与动作的时间对齐是数据质量最重要的检查项之一。

在 π0.5 中如何对应

π0.5 混合移动机器人、固定机器人、跨 embodiment 动作数据、子任务标注、语言监督和网页视觉语言数据。对其中的机器人轨迹而言,核心仍然是“在当前观测与任务条件下,预测后续动作或子任务”。

长任务还可以看成多个阶段轨迹的连接:

τ=τ(1)τ(2)τ(K)\tau=\tau^{(1)}\oplus\tau^{(2)}\oplus\cdots\oplus\tau^{(K)}

例如“清理厨房”可以由“拿起盘子”“放入水槽”“拿起杯子”“放入水槽”等 (K) 个子任务构成。

2.5 Episode:回合 (e)

Episode 是“这一次任务实验”的完整容器。它不仅包含轨迹,也包含任务结果和元数据:

e=(id,,τ,y,m)e=\left(\text{id},\ell,\tau,y,\mathcal{m}\right)

其中 id 是回合编号,(y) 是成功、失败、超时或人工中止等结果,(\mathcal{m}) 是机器人型号、相机配置、控制频率、场景和采集方式等元数据。

Trajectory 强调“随时间变化的记录”;episode 强调“这条记录属于哪一次完整尝试,以及它最后发生了什么”。简单任务中一个 episode 通常对应一条 trajectory;但 episode 也可能包含重置、人工接管、多个子任务或多段有效轨迹。

在 π0.5 中如何对应

π0.5 后训练阶段会过滤动作数据,重点使用成功且低于固定长度阈值的 episode 来专注移动操作任务。这说明 episode 的成功标签和长度不是无关紧要的附加信息;它们会直接影响哪些数据进入训练集。

2.6 Policy:策略 (\pi_\theta)

策略是从当前条件到动作分布的映射。对于只执行短动作的平坦策略,可以写作:

πθ(at:t+H1ot,)\pi_\theta\left(a_{t:t+H-1}\mid o_t,\ell\right)

这表示给定当前观测 (o_t) 和总任务指令 (\ell),预测未来 (H) 步动作。

但 π0.5 使用一个分层推理过程:先预测当前应该完成的高层语义子任务,再依据子任务预测低层连续动作。

πθ(at:t+H1,^tot,)=πθlow(at:t+H1ot,^t)低层动作推理πθhigh(^tot,)高层子任务推理\pi_\theta\left(a_{t:t+H-1},\hat{\ell}_t\mid o_t,\ell\right) = \underbrace{\pi_\theta^{\mathrm{low}}\left(a_{t:t+H-1}\mid o_t,\hat{\ell}_t\right)}_{\text{低层动作推理}} \underbrace{\pi_\theta^{\mathrm{high}}\left(\hat{\ell}_t\mid o_t,\ell\right)}_{\text{高层子任务推理}}

(\pi_\theta^{\mathrm{high}}) 根据当前场景和总任务生成文本形式的子任务,例如“拿起盘子”;(\pi_\theta^{\mathrm{low}}) 再根据当前场景和这个子任务生成细粒度动作块。两部分由同一个 π0.5 模型体系表示,而不是“一个外部 LLM 规划器 + 一个完全独立的传统控制器”。

在 π0.5 中如何对应

本文对象π0.5 论文中的具体形式作用
(o_t)多相机图像 (I_t^{(1:n)}) + 本体状态 (q_t)告诉模型场景里有什么、机器人自身在哪里
(\ell)高层任务提示,如“清理厨房”给出跨阶段的最终目标
(\hat{\ell}_t)文本子任务,如“拿起盘子”将长任务压缩为当前可执行阶段
(a_{t:t+H-1})连续动作块控制双臂、夹爪、底座和升降机构
(\pi_\theta^{\mathrm{high}})文本 token 的自回归预测利用语义、网页数据和语言监督选择当前子任务
(\pi_\theta^{\mathrm{low}})action expert 的 Flow Matching 推理将子任务转换为高频、连续的低层动作

更细一点看,π0.5 的两阶段训练对应两类策略能力:

  1. 预训练阶段:将多种数据源统一成多模态序列任务,学习文本、物体位置和离散动作 token 的预测,获得视觉、语言、语义与跨机器人知识。
  2. 后训练阶段:专门面向移动操作,加入 action expert,用 Flow Matching 生成连续动作块,同时保留文本预测能力。论文在推理时先生成高层子任务文本,再以该文本为条件进行 10 步 Flow Matching 去噪,得到低层连续动作。

论文还说明,高层推理以比低层动作推理更低的频率运行:语义阶段不必每个控制周期都改变,而动作块需要高频更新以应对物理世界细节。

因此,π0.5 不只是:

图像 + 指令 → 一个动作向量

而更接近:

总任务指令 + 当前观测

高层策略:当前的语义子任务

低层策略:未来一段连续动作

底层 PD 控制器跟踪动作目标

新观测进入下一轮闭环

3. 把六个概念放进同一个“红色杯子”示例

任务指令为:

=“把红色杯子放进水槽”\ell=\text{“把红色杯子放进水槽”}

在某个时刻 (t):

  1. 完整状态 (x_t):杯子在桌面上、水槽在右侧、夹爪张开、机器人关节处于某种姿态;其中一部分细节不可直接获得。
  2. 观测 (o_t):相机画面显示红色杯子和水槽,本体状态 (q_t) 显示手臂位置与夹爪张开程度。
  3. 高层子任务 (\hat{\ell}_t):模型可能先预测“拿起红色杯子”。
  4. 动作块 (a_{t:t+H-1}):模型输出一段“接近杯子、调整姿态、闭合夹爪”的连续控制目标。
  5. 轨迹 (\tau):从找到杯子、抓取、移动到水槽、放下杯子的全时序记录。
  6. episode (e):这一整次尝试,包括任务指令、场景、轨迹、是否成功放入水槽、是否中途超时或人工接管。

如果机器人在抓取时杯子被碰歪,新一帧观测会改变;此时它不应机械执行旧动作块,而应重新推理。这正是观测、策略、动作、轨迹和闭环之间的关系。

4. 常见误区

  • 把 (o_t) 当成 (x_t):观测只是机器人获得的部分信息,不是完整世界状态。
  • state 一律理解为完整环境状态:真实机器人代码中的 state 往往只是本体感觉向量 (q_t)。
  • 把 (a_t) 当成自然语言任务:动作是控制器可执行的低层数字,不是“抓杯子”的文字描述。
  • 认为策略只输出一个动作:现代机器人策略常输出 action chunk (a_{t:t+H-1}),并在闭环中滚动执行。
  • 认为 trajectory 与 episode 完全相同:trajectory 是时间序列;episode 还包含任务边界、结果和采集元数据。

5. 学习验收

  1. 为什么要同时使用 (x_t)、(o_t) 和 (q_t) 三个符号?
  2. images 的 shape 为 ([B,n,C,H,W]),state 的 shape 为 ([B,d_q]),它们分别对应哪个数学对象?
  3. actions 的 shape 为 ([B,H,d_a]),(B)、(H)、(d_a) 分别表示什么?
  4. 为什么图像、状态和动作必须进行时间对齐?
  5. π0.5 的 (\hat{\ell}t) 与 (a{t:t+H-1}) 各自解决什么问题?
  6. π0.5 为什么先预测子任务、再预测低层动作,而不是直接从总任务指令输出所有控制量?

6. 下一步

下一篇建议阅读 02:机器人动作与动作空间。重点是把抽象的 (a_t\in\mathbb{R}^{d_a}) 进一步拆开:每一维动作是什么、关节空间与末端执行器空间有什么区别、不同机器人怎样对齐动作表示。

参考资料