第一课先不碰 ACT、Diffusion Policy、OpenVLA、π0 这些具体模型,而是只解决最基础的一条链:
Camera / Language / Robot State → Policy → Action → Robot Controller → Real Robot
并重点弄清楚 Observation、Robot State、Language、Action,以及 Action 为什么还不是电机命令。 Pasted text
1. 先用一句话理解 VLA
VLA,全称:
Vision-Language-Action
可以先粗略翻译为:
看见环境 + 听懂任务 → 决定机器人下一步做什么。
例如给机器人一句指令:
"把桌上的红色方块放进左边盒子。"
机器人可能同时拿到:
- 相机图像;
- "把红色方块放进左边盒子"这句话;
- 当前机械臂关节位置;
- 当前夹爪开合状态。
然后模型输出:
下一步机械臂应该采取什么动作。
所以整个问题,本质上可以先画成:
环境
↓
相机看到什么
+
人要求做什么
+
机器人现在是什么姿态
↓
VLA / Robot Policy
↓
下一步动作
↓
机器人控制系统
↓
机器人真的运动
这一课最重要的事情,就是把上面每一个词弄明白。
2. VLA 最核心的数学形式
以后你会看到大量复杂模型,但最底层都可以先抽象成:
\ a_t = \\pi(o_t, l) \\
先不要害怕这个公式。
这里:
- \(\pi\):policy,策略;
- \(o_t\):机器人在时刻 \(t\) 得到的 observation;
- \(l\):language instruction,语言指令;
- \(a_t\):时刻 \(t\) 输出的 action。
中文就是:
策略根据当前观察和任务指令,决定当前应该采取什么动作。
如果把机器人的自身状态单独写出来,也经常写成:
\ a_t = \\pi(I_t, s_t, l) \\
其中:
- \(I_t\):图像;
- \(s_t\):Robot State;
- \(l\):语言;
- \(a_t\):动作。
这其实就是 VLA 最核心的一条线。
以后 ACT、Diffusion Policy、OpenVLA、π0 再复杂,最终我们都要回来问:
它到底怎么从这些输入,算出了 Action?
3. Observation 到底是什么?
这是第一个必须真正理解的词。
3.1 Observation = 机器人当前"能够观察到的信息"
假设你站在房间里。
房间真实情况可能包含:
- 桌子的准确三维位置;
- 所有物体的位置;
- 空气温度;
- 每个物体的质量;
- 每个物体内部结构;
- 所有人的位置。
但你的眼睛并不能直接知道所有这些东西。
你实际拿到的是:
- 眼睛看到的图像;
- 耳朵听到的声音;
- 手感觉到的力;
- 身体姿态感觉。
这些东西就是你的 Observation。
机器人也是一样。
它并不是直接知道"世界真相"。
它只能通过传感器观察。
3.2 机器人常见 Observation
例如一个机械臂系统可能拥有:
RGB Camera
Depth Camera
Joint Position
Joint Velocity
Gripper State
Force Sensor
Previous Action
历史图像
这些都可能属于 Observation。
例如:
\ o_t = \\{ I_t, q_t, g_t \\} \\
这里:
- \(I_t\):当前相机图像;
- \(q_t\):当前关节角;
- \(g_t\):当前夹爪状态。
所以:
Observation 并不等于"图片"。
这是初学 VLA 非常容易出现的第一个误区。
4. Vision 到底给模型什么?
现在先只考虑 RGB 相机。
机器人看到一张图片:
桌子
红色方块
蓝色方块
盒子
机械臂
计算机当然看不到"红色方块"这几个汉字。
它真正收到的是一个数字数组。
一张 RGB 图片通常可以表示成 Tensor:
\ I \\in \\mathbb{R}\^{3\\times H\\times W} \\
这里:
- \(3\):RGB 三个颜色通道;
- \(H\):图片高度;
- \(W\):图片宽度。
如果加入 batch:
\ I \\in \\mathbb{R}\^{B\\times 3\\times H\\times W} \\
其中:
- \(B\):一次送入模型多少张图片。
例如:
images
shape = [B, 3, H, W]
现在先不用关心具体到底是 224×224、256×256 还是别的尺寸。
不同模型不同。
真正重要的是:
VLA 的 Vision 输入,本质上最终都会变成 Tensor。
5. Robot State 是什么?
这是第二个很容易混淆的概念。
Robot State 可以理解为:
机器人对"自己当前是什么状态"的描述。
最常见的是关节位置。
假设机械臂有 6 个关节:
\ q_t = \[q_1,q_2,q_3,q_4,q_5,q_6 \]
例如:
\ q_t = \[0.2,-0.7,1.1,0.3,-0.5,0.8 \]
这些数字可以代表 6 个关节当前的位置。
于是:
robot_state
shape = [6]
如果加入 batch:
robot_state
shape = [B, 6]
但 Robot State 不一定只有 Joint Position。
还可能有:
Joint Position
Joint Velocity
End-Effector Pose
Gripper State
Force / Torque
5.1 为什么只有图片还不够?
假设相机看到:
夹爪在杯子附近。
但机器人自己最好还要知道:
我的 6 个关节现在到底在哪。
否则仅凭图像,很难非常精确地知道自己的机械状态。
你可以类比人类。
你闭上眼睛,把手伸出去。
即使看不到手,你大概也知道:
我的手在哪里。
这种身体内部状态感知叫:
Proprioception
中文通常翻译为:
本体感觉 / 本体感知
在 Robot Learning 里非常重要。
所以你以后会经常看到:
proprioception
大多数时候,可以先理解成:
机器人自己身体状态的信息。
6. Language 到底怎么进入模型?
现在假设人输入一句:
Pick up the red block.
计算机不能直接处理这句话。
最基本过程是:
文字
↓
Tokenizer
↓
Token
↓
Token ID
↓
Embedding
↓
神经网络
这一课暂时不用深入 Transformer。
只需要知道:
Language 最终也要被转换成数字。
例如一句话经过 tokenizer 后,可能变成:
[101, 2345, 117, 8912, 102]
这只是示意,不对应任何特定模型。
可以抽象成:
\ L \\in \\mathbb{N}\^{B\\times N} \\
其中:
- \(B\):batch size;
- \(N\):token 数量。
随后模型把 Token ID 转换成向量。
7. 为什么必须有 Language?
如果没有 Language,机器人看到:
红色方块
蓝色方块
杯子
盒子
它并不知道:
你到底想让我干什么?
同一幅画面可以有无数种任务:
拿红色方块
拿蓝色方块
把杯子移动到右边
把红色方块放进盒子
把蓝色方块推走
视觉告诉机器人:
世界现在是什么样。
语言告诉机器人:
你希望世界变成什么样。
这个区别非常重要。
8. Policy 到底是什么?
现在三个东西准备好了:
Image
Robot State
Language
于是进入:
Policy
Policy 可以先理解成:
决定机器人该怎么行动的函数。
也就是:
\ \\pi: (\\text{Observation},\\text{Language}) \\rightarrow \\text{Action} \\
例如:
Image
+
Robot State
+
Language
↓
Policy
↓
Action
Policy 可以是:
- 很简单的神经网络;
- Transformer;
- Diffusion Model;
- VLM + Action Head;
- Flow Matching 模型;
- 其他结构。
但先不用管。
第一课只要记住:
Policy 的任务不是"理解世界"就结束了,而是最终必须产生可以用于机器人行为的 Action。
这就是 Robot Learning 和普通图像分类、普通聊天模型最大的区别之一。
9. Action 到底是什么?
这是整门课最重要的概念之一。
很多初学者看到:
action = model(obs)
会自然认为:
Action 就是电机转多少。
实际上通常不是。
Action 是:
Policy 输出的机器人行为表示。
具体表示什么,要看模型怎么定义 Action Space。
10. 常见 Action 类型
以后你会反复遇到这些。
第一类:Joint Position
直接输出目标关节位置:
\ a_t = \[q_1\^\*,q_2\^\*,...,q_n\^\* \]
意思是:
希望各个关节运动到这些位置。
第二类:Joint Delta
输出:
\ \\Delta q \\
例如:
\ \\Delta q = \[0.01,-0.02,0,0.01,0,0 \]
表示:
在当前关节位置基础上稍微移动一点。
于是:
\ q_{target}=q_t+\\Delta q \\
第三类:Joint Velocity
输出:
\ \\dot q \\
也就是:
每个关节应该以什么速度运动。
第四类:End-Effector Pose
不是直接控制每个关节,而是告诉机器人:
我要夹爪到这个位置和姿态。
例如:
\ a_t = \[x,y,z,r_x,r_y,r_z \]
然后由后面的运动学和控制系统决定各关节怎么运动。
第五类:Delta End-Effector Pose
输出:
\ \[\\Delta x,\\Delta y,\\Delta z, \\Delta r_x,\\Delta r_y,\\Delta r_z \]
含义是:
夹爪相对于当前姿态,再移动一点。
这种表示在 Robot Learning 中非常常见。
第六类:Gripper Action
例如:
\ g\\in\\{0,1\\} \\
可以表示:
0 → 打开
1 → 闭合
也可能采用连续值。
11. 一个 Action Tensor 可能长什么样?
假设某个机器人策略定义:
Δx
Δy
Δz
Δrx
Δry
Δrz
gripper
那么:
\ a_t = \[ \\Delta x, \\Delta y, \\Delta z, \\Delta r_x, \\Delta r_y, \\Delta r_z, g \]
Action Dimension 就是:
\ D_a=7 \\
Tensor 可能是:
action
shape = [B, 7]
但是一定要记住:
这个 7 只是这个示例的 Action Space。
不能看到别的 VLA 就默认:
Action Dimension = 7
以后看真实论文和 GitHub,我们都会重新查。
12. 最重要的问题:Action 是电机命令吗?
通常不是。
这是第一课最应该彻底弄清的一点。
例如 VLA 输出:
\ \\Delta x=0.01m \\
它表达的是:
末端向 x 方向移动 1 cm。
但电机根本不认识:
向 x 方向移动 1 cm
电机底层可能只认识:
目标位置
目标速度
目标电流
PWM
Step Pulse
Torque Command
所以中间还有很多层。
13. 真正的机器人执行链
一个典型系统可以粗略写成:
VLA
↓
Action
↓
Action Adapter
↓
Robot Controller
↓
Joint Command
↓
Servo / Motor Driver
↓
Motor
↓
Robot Motion
比如 VLA 输出:
\ \\Delta x=1cm \\
之后可能发生:
末端向右移动 1 cm
↓
计算新的末端目标位置
↓
逆运动学 IK
↓
目标关节位置
↓
轨迹规划 / 插值
↓
关节控制器
↓
电机驱动器
↓
电机转动
所以:
VLA 决定"做什么动作",底层控制系统负责"怎样让电机把这个动作执行出来"。
这是一个非常关键的层级关系。
14. 一个特别重要的分层
可以把整个机器人系统粗略分成三层。
第一层:决策 / Policy
回答:
我现在应该干什么?
例如:
夹爪向杯子靠近
第二层:运动 / Control
回答:
为了让夹爪这样运动,各个关节应该怎么动?
例如:
Joint 1 → 0.31 rad
Joint 2 → -0.72 rad
Joint 3 → 1.14 rad
...
第三层:Motor
回答:
为了让关节真的运动,电机应该输出什么?
例如:
位置环
速度环
电流环
PWM
脉冲
所以不能把:
VLA Action
直接等同于:
Motor Command
15. 用一个完整例子走一遍
现在假设任务是:
把红色方块放进盒子。
第一步:Vision
Camera 拍到:
红色方块
盒子
机械臂末端
桌面
得到:
\ I_t \\
第二步:Language
语言:
Put the red block into the box.
经过 tokenizer 和语言编码,得到语言信息:
\ l \\
第三步:Robot State
机器人当前知道:
\ s_t \\
里面可能包含:
Joint Position
Gripper State
第四步:Policy
输入:
\ (I_t,s_t,l) \\
经过 Policy:
\ a_t=\\pi(I_t,s_t,l) \\
第五步:Action
假设输出:
末端向前移动 2 cm
末端向左移动 1 cm
夹爪保持打开
也就是:
\ a_t \\
第六步:机器人控制系统
Action 被转换为:
目标末端姿态
↓
IK
↓
目标关节位置
↓
控制器
↓
电机
机械臂真的移动一点。
16. 然后是不是结束了?
不是。
机器人运动之后:
世界已经变了。
于是下一时刻重新拍图:
\ I_{t+1} \\
同时机器人状态也变成:
\ s_{t+1} \\
然后再运行:
\ a_{t+1} = \\pi(I_{t+1},s_{t+1},l) \\
所以实际运行往往是一个循环:
Observe
↓
Policy
↓
Action
↓
Execute
↓
Observe Again
↓
Policy
↓
Action
↓
...
这就是非常重要的:
闭环执行思想。
17. 为什么机器人需要不断重新观察?
想象你闭着眼睛抓杯子。
你提前规划:
手向前 30 cm
向右 5 cm
手指闭合
然后从头到尾不再看。
只要:
- 杯子位置偏了;
- 手的位置偏了;
- 桌子碰了一下;
- 前面的动作有一点误差;
最后就可能抓空。
因此 Robot Policy 很重要的一件事是:
机器人执行动作之后,可以重新观察环境,再决定下一步。
后面我们学习:
- Action Chunking;
- Receding Horizon;
- Diffusion Policy;
- VLA 推理循环;
都会重新遇到这个思想。
18. VLA 和传统机器人到底是什么关系?
这是第三个特别容易误解的问题。
有些宣传容易让人产生一种感觉:
有了 VLA,以前机器人学全部不要了。
这是错误的理解。
传统机器人系统
传统机器人通常可能采用:
Camera
↓
Object Detection
↓
Pose Estimation
↓
Task Planning
↓
Motion Planning
↓
IK
↓
Trajectory
↓
Controller
↓
Motor
每个模块职责比较明确。
例如:
视觉模块:
杯子坐标在这里。
规划模块:
先移动到杯子上方。
IK:
对应哪些关节角?
Controller:
怎么让关节稳定运动过去?
19. VLA 做了什么改变?
VLA 希望学习:
Vision
+
Language
+
Robot State
↓
Policy
↓
Action
也就是说,一部分原来需要人工设计规则、视觉算法、任务逻辑的过程,可以由学习模型完成。
例如过去可能需要:
if object == red_block:
locate(red_block)
plan_grasp()
move_to(...)
而学习型 Policy 则希望从 demonstration 中学习:
\ \\text{Observation} \\rightarrow \\text{Action} \\
但是后面的:
Safety
Control
Motor Driver
Motor
仍然存在。
所以更准确的理解是:
VLA 并不是把整个机器人控制系统替掉,而是把视觉、语言理解和机器人行为决策连接起来。
20. VLA 和 VLM 最大区别是什么?
你以后还会学 VLM。
VLM:
Vision-Language Model
例如输入:
图片
+
问题
输出:
文本
例如:
图片:桌上有一个红色方块
问题:桌上有什么?
输出:
There is a red block.
它完成的是:
\ Vision + Language \\rightarrow Language \\
VLA 则更强调:
\ Vision + Language \\rightarrow Action \\
例如:
图片
+
"拿起红色方块"
↓
机器人动作
所以关键区别在最后一个字母:
L
Language
vs
A
Action
VLA 最终必须和行为联系起来。
21. 一个很重要的认识:Action 不是唯一标准形式
VLA 并没有规定:
所有模型必须输出同一种 Action。
完全不是。
不同方法可能输出:
Joint Position
Joint Delta
Joint Velocity
End-Effector Pose
Delta End-Effector Pose
Action Chunk
Discrete Action Token
Continuous Action
以后我们阅读任何模型,都必须先问:
这个模型的 Action 到底是什么?
这是后续读论文时非常重要的习惯。
22. 再区分两个非常容易混淆的词
State
理论上描述系统真正状态。
例如:
物体真实 3D 坐标
真实速度
真实机器人姿态
Observation
机器人实际能够测到的东西。
例如:
RGB 图像
深度图
关节编码器
夹爪状态
现实机器人里经常不能直接获得完整 State。
所以 Policy 通常更准确地写成:
\ a_t=\\pi(o_t) \\
而不是默认:
\ a_t=\\pi(s_t) \\
在强化学习里我们以后还会专门讲 State 和 Observation 的区别。
23. 把今天所有东西压缩成一张图
现在应该建立下面这个脑图:
Language
│
│
Camera ──────→ Observation
│
Robot Sensors ─→ Robot State
│
▼
Policy
│
▼
Action
│
▼
Action Adapter
│
▼
Robot Controller
│
▼
Motor Command
│
▼
Robot
│
▼
Environment
│
└────→ Camera
注意这是一个循环。
不是:
Input → Model → Output
之后就结束。
而是:
\ o_t \\rightarrow a_t \\rightarrow o_{t+1} \\rightarrow a_{t+1} \\rightarrow\\cdots \\
24. 今天真正应该记住的 7 句话
① Observation
机器人通过传感器实际获得的信息。
② Robot State
机器人自身状态,例如关节位置、夹爪状态等。
③ Language
描述当前任务目标。
④ Policy
根据 Observation 和任务生成 Action。
\ a_t=\\pi(o_t,l) \\
⑤ Action
Policy 输出的机器人行为表示。
⑥ Action ≠ Motor Command
中间通常还有运动学、轨迹、控制器、驱动器等环节。
⑦ VLA 不等于替代传统机器人控制
它主要负责:
感知 + 语言理解 + 行为决策
底层机器人控制依然非常重要。
25. 第一课自测
先不要查答案,看看现在能不能自己解释下面 6 个问题。
1. 为什么相机图像属于 Observation,但 Observation 不等于相机图像?
2. Robot State 和相机图像有什么区别?
3. 下面这个公式每一项是什么意思?
\ a_t=\\pi(I_t,s_t,l) \\
4. 如果 Policy 输出"末端向右移动 2 cm",为什么不能直接把它发给电机?
5. VLA 和普通 VLM 最核心的输出区别是什么?
6. 为什么真实机器人往往需要执行 Action 后重新获取 Observation,而不是一次生成所有动作然后盲目执行?