大模型驱动的机器人
大语言模型(LLM)和视觉语言模型(VLM)拥有丰富的常识知识和推理能力,但它们并不直接理解物理世界的约束。如何将LLM/VLM的"大脑"连接到机器人的"身体"?本文系统梳理LLM/VLM驱动机器人的核心方法。
1. 问题定义:接地问题
LLM驱动机器人的核心挑战是接地问题(Grounding Problem):
LLM可以生成"打开冰箱门"这样的指令,但如何确保:
- 物理可行性:机器人当前状态下能否执行这个动作?
- 语义准确性:LLM理解的"打开"是否与机器人的动作原语匹配?
- 环境感知:LLM是否知道冰箱在哪里?门的把手位置?
2. SayCan:可行性约束的语言规划
2.1 核心思想
SayCan(Ahn et al., Google, 2022)是LLM驱动机器人的奠基工作。核心公式:
其中:
- \(\mathcal{C}\):预定义的技能库(如 "pick up X", "go to Y", "place X on Y")
- \(l\):用户的自然语言指令
- \(h\):对话历史(已完成的动作序列)
- \(V^{c_i}(s)\):技能 \(c_i\) 在当前状态 \(s\) 下的value function,作为affordance score
2.2 架构流程
graph TB
USER[用户指令<br/>"I spilled my drink, can you help?"] --> LLM[LLM<br/>PaLM 540B]
LLM --> SCORE["对每个技能评分<br/>p(skill | instruction, history)"]
ENV[环境状态<br/>机器人观测] --> AFF["Affordance评估<br/>每个技能的value function"]
SCORE --> MUL["联合评分<br/>p(skill) × V(skill)"]
AFF --> MUL
MUL --> SELECT["选择最佳技能<br/>argmax"]
SELECT --> EXEC["执行技能<br/>底层RL/BC策略"]
EXEC --> FB["执行结果<br/>成功/失败"]
FB --> LLM
style LLM fill:#e3f2fd
style AFF fill:#e8f5e9
style MUL fill:#fff3e0
2.3 关键细节
技能库设计:SayCan预定义了551个短程技能,每个技能对应一个预训练的RL策略。技能用自然语言描述:
"pick up the red bull can"
"go to the counter"
"place the sponge in the sink"
"open the top drawer"
Affordance评估:每个技能的affordance通过训练一个value function来估计:
当机器人离目标物体很远或者目标不在视野内时,\(V^{c_i}(s)\) 自然会很低。
局限性:
- 依赖预定义的技能库,无法处理技能库外的任务
- 每个技能需要单独训练一个RL策略
- 无法处理需要创造性解决方案的任务
3. Code as Policies:LLM生成代码
3.1 核心思想
Code as Policies(Liang et al., 2023)让LLM直接生成Python代码来控制机器人,而非选择预定义技能:
3.2 示例
用户指令:"把所有蓝色的方块排成一行"
LLM生成的代码:
# 获取所有蓝色方块的位置
blue_blocks = detect_objects("blue block")
# 按x坐标排序
blue_blocks.sort(key=lambda b: b.position[0])
# 设定目标排列位置
start_x = 0.3
spacing = 0.08
for i, block in enumerate(blue_blocks):
target_pos = [start_x + i * spacing, 0.5, block.position[2]]
pick_and_place(block.id, target_pos)
3.3 API设计
关键在于设计合适的机器人API供LLM调用:
| API层级 | 示例 | 说明 |
|---|---|---|
| 高层语义 | pick_and_place(obj, target) |
抽象操作 |
| 中层运动 | move_to(position, orientation) |
运动规划 |
| 底层控制 | set_joint_angles(angles) |
关节控制 |
| 感知 | detect_objects(description) |
视觉检测 |
| 空间推理 | get_position(obj) |
位置查询 |
优点:
- 组合性强:代码天然支持循环、条件、函数调用
- 可解释:生成的代码可以人工审查
- 灵活:不受预定义技能库的限制
缺点:
- LLM可能生成语法正确但语义错误的代码
- 需要精心设计API接口
- 错误处理和异常恢复困难
4. ProgPrompt:程序化提示
ProgPrompt(Singh et al., 2023)结合了结构化程序和自然语言提示:
核心创新:在prompt中提供:
- 环境中可用物体的列表
- 可用动作的函数签名
- 断言函数(用于检查前置条件)
示例Prompt结构:
# 可用物体: mug, plate, table, sink, sponge
# 可用动作: find(obj), pick_up(obj), place(obj, location),
# open(obj), close(obj)
# 断言: is_holding(obj), is_at(location), is_open(obj)
def clean_the_mug():
find("mug")
pick_up("mug")
find("sink")
place("mug", "sink")
# 检查前置条件
assert is_at("sink")
open("faucet")
...
与Code as Policies的区别:
- ProgPrompt更强调前置条件检查和断言
- 提供了系统化的prompt工程模板
- 更适合需要严格执行顺序的任务
5. VoxPoser:3D空间推理
5.1 核心思想
VoxPoser(Huang et al., 2023)将LLM的语言推理能力映射到3D体素空间:
5.2 工作流程
- 语言理解:LLM解析指令,生成代码描述目标区域和约束
- 视觉定位:VLM(如OWL-ViT)定位场景中的物体
- 体素地图生成: - Affordance Map \(\mathbf{V}_{\text{aff}} \in \mathbb{R}^{X \times Y \times Z}\):目标区域得分高 - Constraint Map \(\mathbf{V}_{\text{con}} \in \mathbb{R}^{X \times Y \times Z}\):障碍/禁区得分高
- 运动规划:在体素地图上运行MPC,生成无碰撞轨迹
组合得分:
优点:
- 无需任何机器人训练数据
- 可以处理复杂的空间约束("把杯子放在盘子和花瓶之间")
- 组合了语言推理和3D空间推理
6. Inner Monologue:闭环反馈
6.1 核心思想
Inner Monologue(Huang et al., Google, 2022)在LLM规划中引入了感知反馈闭环:
之前的方法(如SayCan)是开环的——LLM生成计划后直接执行,不考虑执行过程中的意外。Inner Monologue让LLM持续接收环境反馈并动态调整计划。
6.2 反馈类型
| 反馈类型 | 来源 | 示例 |
|---|---|---|
| 成功/失败检测 | 视觉分类器 | "pick up succeeded" |
| 场景描述 | 图像描述模型 | "I see a red cup on the table" |
| 物体检测 | 目标检测模型 | "Objects: cup(0.3, 0.5), plate(0.6, 0.4)" |
| 人类反馈 | 人类操作员 | "No, I meant the other cup" |
6.3 闭环执行流程
graph TB
INST[用户指令] --> LLM[LLM规划器]
LLM --> PLAN[子任务计划]
PLAN --> EXEC[执行当前子任务]
EXEC --> SENSE[感知系统]
SENSE --> FB["反馈汇总<br/>1. 成功/失败<br/>2. 场景描述<br/>3. 物体检测"]
FB --> LLM
LLM --> |"根据反馈调整计划"| PLAN
EXEC --> |"任务完成"| DONE[完成]
style LLM fill:#e3f2fd
style SENSE fill:#e8f5e9
style FB fill:#fff3e0
与SayCan的关键区别:
- SayCan:LLM选技能 → 执行 → 选下一个技能(无反馈)
- Inner Monologue:LLM选技能 → 执行 → 收集环境反馈 → LLM根据反馈调整(有反馈)
7. Statler:状态维护
Statler(Yoneda et al., 2023)在LLM规划中引入显式状态表征:
问题:LLM的上下文窗口有限,长序列任务中可能"忘记"环境状态。
解决方案:维护一个结构化的世界状态表征:
World State:
- Robot Location: kitchen counter
- Holding: nothing
- Objects:
- red_cup: on table, upright, empty
- blue_plate: on counter, clean
- sponge: in sink, wet
两个LLM模块:
- Inner State LLM:根据执行结果更新世界状态
- Outer State LLM:根据当前世界状态决定下一步动作
这种分离使得LLM可以更可靠地跟踪长时间任务中的环境变化。
8. 方法对比总结
| 方法 | 年份 | 动作输出方式 | 是否闭环 | 需要训练 | 3D推理 |
|---|---|---|---|---|---|
| SayCan | 2022 | 选择预定义技能 | 部分 | 每个技能需训练 | 否 |
| Code as Policies | 2023 | 生成Python代码 | 否 | 否 | 有限 |
| ProgPrompt | 2023 | 生成程序+断言 | 部分(断言) | 否 | 否 |
| VoxPoser | 2023 | 3D体素值图 → MPC | 否 | 否 | 是 |
| Inner Monologue | 2022 | 选择技能+反馈 | 是 | 底层技能需训练 | 否 |
| Statler | 2023 | 选择技能+状态 | 是 | 否 | 否 |
关键权衡
灵活性 vs 可靠性:
- Code as Policies最灵活(可以生成任意代码),但可靠性最低(代码可能有bug)
- SayCan最可靠(每个技能都经过训练),但灵活性最低(受限于技能库)
零样本 vs 需训练:
- VoxPoser、Code as Policies、ProgPrompt、Statler都是零样本方法,不需要机器人训练数据
- SayCan、Inner Monologue需要预训练底层技能
9. 局限性与未来方向
9.1 当前局限
- 推理延迟:LLM推理通常需要数百毫秒到数秒,不适合实时控制
- 幻觉问题:LLM可能生成看似合理但物理不可行的计划
- 空间推理弱:纯文本LLM的空间推理能力有限
- 错误累积:长序列任务中错误会累积
- 安全性:LLM生成的代码可能导致危险动作
9.2 发展趋势
- VLM替代LLM:使用视觉语言模型(如GPT-4V)直接从图像理解场景,减少语言描述的信息损失
- 与VLA融合:高层用LLM规划,底层用VLA执行(如pi0.5架构)
- 主动感知:LLM不仅被动接收反馈,还主动指导机器人收集信息("先看看桌子上有什么")
- 多智能体协作:多个LLM Agent协调控制多台机器人
- 持续学习:从执行经验中改进LLM的规划能力
参考文献:
- Ahn et al., "Do As I Can, Not As I Say: Grounding Language in Robotic Affordances" (SayCan), 2022
- Liang et al., "Code as Policies: Language Model Programs for Embodied Control", ICRA 2023
- Singh et al., "ProgPrompt: Generating Situated Robot Task Plans using Large Language Models", ICRA 2023
- Huang et al., "VoxPoser: Composable 3D Value Maps for Robotic Manipulation with Language Models", CoRL 2023
- Huang et al., "Inner Monologue: Embodied Reasoning through Planning with Language Models", CoRL 2022
- Yoneda et al., "Statler: State-Maintaining Language Models for Embodied Reasoning", CoRL 2023