三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

GaP 方法通俗讲解 - S-X

GaP 方法通俗讲解 - S-X

GaP 方法通俗讲解:让大语言模型给机器人画一张会执行的流程图


0. 用一个例子,30 秒看懂 GaP

假设我们要让机器人完成:

找到蓝黄色罐头,把它抓起来,再放进篮子。

传统固定程序可能会记住一个固定坐标:

去桌面左边 30 cm 的位置抓取。

但下一次罐头换了位置,程序就会抓空。

GaP 不死记坐标,而是让机器人按照一张流程图做事。这里会用到大语言模型(下文简称 LLM):

flowchart LRA["任务:把罐头放进篮子"] --> B["LLM 设计流程图"]C["机器人技能库"] --> BB --> D["找罐头 → 找篮子 → 抓取 → 放入 → 检查"]D --> E["流程执行器"]F["实时相机与机器人状态"] --> EE --> G["机器人动作"]G --> F

整套方法可以记成四步:

  1. 画流程:LLM 根据任务和技能库,生成机器人操作流程图。
  2. 试流程:在许多不同的仿真场景里完整试跑。
  3. 改流程:根据真实物理结果,找到失败步骤并修改。
  4. 跑流程:固定流程图,机器人根据实时观察长期执行。

可以把各部分想成:

GaP 中的部分 生活化理解
LLM 流程设计师
技能库 工具箱
可执行图 操作手册
图执行器 严格照手册工作的执行者
仿真排练 正式上岗前的彩排

最重要的结论是:

GaP 不是一个新的机器人神经网络。它是一套“生成流程、检查流程、试跑流程、执行流程”的方法。


1. GaP 想解决什么问题

GaP 主要面向这种场景:

  • 工作台、机器人和相机基本固定;
  • 任务会重复很多次;
  • 但物体的位置、朝向、大小或种类会变化。

论文把它叫作 Variational Automation(变化型自动化)。通俗地说,就是:

工位是熟悉的,但每次桌面上的具体情况不完全一样。

flowchart LRA["固定脚本"] --> A1["可靠,但物体一移动就容易失败"]B["直接根据图像生成动作的整体模型"] --> B1["灵活,但过程难检查、难定位错误"]C["GaP"] --> C1["用显式流程组织感知、规划和控制"]C --> C2["既能适应变化,又能逐步检查"]

GaP 的思路不是让 LLM 直接控制电机,而是让它做更擅长的事情:

从已有能力中挑选合适工具,并把它们组织成一个完整流程。

真正负责看图像、算三维位置、规划轨迹和驱动机器人关节的,仍然是专门的视觉、几何、规划和控制模块。


2. 最核心的原理:图本身就是策略

在机器人领域,“策略”可以简单理解为:

当前看到这种情况时,下一步应该做什么。

GaP 把这个“做事方法”直接写成一张图。

flowchart TDS["开始"] --> A["寻找目标罐头"]A --> B{"找到了吗"}B -->|是| C["计算抓取位置"]B -->|否| R["换视角或重试"]R --> AC --> D["执行抓取"]D --> E{"真的抓住了吗"}E -->|是| F["移动到篮子并释放"]E -->|否| X["换抓法或结束"]F --> G["完成"]

这张图里只有四种东西:

图中的东西 它表示什么
步骤 做一件事,例如检测、抓取、移动
箭头 下一步去哪里
分支 根据结果选择不同路线
数据 上一步交给下一步的信息

例如,感知步骤不会只说“找到了”。它还会交出目标的位置、大小和朝向;抓取步骤据此决定夹爪应从哪里、以什么角度接近;路线计算步骤再给出一条不碰障碍的移动路线。

因此,这张图不是一张供人阅读的示意图,而是一个真的可以执行的程序:

  • 步骤可以调用真实工具;
  • 箭头决定执行顺序;
  • 分支处理成功、失败和重试;
  • 数据在步骤之间传递;
  • 结果检查判断物理任务是否真的完成。

这就是 Graph-as-Policy 这个名字的含义:

Graph(图)本身就是 Policy(机器人做事的方法)。


3. GaP 的整体结构

GaP 由四部分组成:LLM、机器人技能库、可执行流程图和流程执行器。

LLM 根据任务和技能库写出流程;流程图保存步骤、分支、数据和检查规则;部署时,执行器读取实时观察并严格照图调用技能。

生成好的图可以保存、查看、修改和重复运行。如果任务逻辑不变,就不需要每次都让 LLM 重新设计。

通常情况下,负责写图的 LLM 不参与每一个在线控制步骤。所以 GaP 的核心是一套组合系统,而不是一个新训练的机器人网络。


4. 一句话任务怎样变成可执行图

面对一个完整机器人任务,LLM 容易漏步骤、接错数据或忘记失败处理。GaP 因此先把任务拆成几个阶段,再按顺序为每个阶段组合技能,最后合并并检查整张图。

例如“把罐头放进篮子”会被拆成:找罐头、找篮子、抓取、运输和结果检查。论文实现会让多个专门角色分工,但理解核心方法时,只需要记住“先拆阶段,再写小流程,最后统一验证”。

4.1 技能库有什么作用

技能库可以理解为机器人的工具箱。里面可能有:

  • 检测指定物体;
  • 分割目标轮廓;
  • 计算物体在三维空间中的位置、大小和朝向;
  • 决定夹爪从哪里、以什么角度接近;
  • 计算一条不碰障碍的移动路线;
  • 打开或闭合夹爪;
  • 检查接触、位置或覆盖关系。

LLM 的工作不是凭空发明这些能力,而是选择、配置和连接已有能力。

4.2 生成后为什么还要验证

flowchart TDA["LLM 生成流程"] --> B{"结构检查通过吗"}B -->|否| C["指出缺失步骤、错误连接或类型不匹配"]C --> D["有限次数修复"]D --> BB -->|是| E["得到可执行图"]E --> F["进入仿真或真实执行"]

结构检查会发现这类问题:

  • 箭头指向不存在的步骤;
  • 某个阶段没有出口;
  • 抓取步骤需要“目标位置”,上一步却没有提供;
  • 成功和失败路线没有接完整。

但要注意:

结构正确,只说明流程“能运行”;它不保证机器人在物理世界里一定成功。


5. 图在机器人上怎样运行

图生成完成后,在线执行并不神秘。它就是不断重复:

看当前情况 → 执行当前步骤 → 读取结果 → 选择下一条箭头。

flowchart TDA["读取最新相机和机器人状态"] --> B["执行当前步骤"]B --> C["得到位置、轨迹或成功状态"]C --> D{"结果是什么"}D -->|成功| E["沿成功箭头继续"]D -->|失败| F["重试、换方案或结束"]E --> G{"到终点了吗"}F --> GG -->|否| AG -->|是| H["返回本次执行结果"]

在线数据大致会经历“彩色图像和距离信息 → 找到目标 → 恢复三维位置 → 计算抓法和移动路线 → 控制机械臂 → 再次观察”。这里最值得理解的不是数据格式,而是:

  • 图并不是提前写死一串关节动作;
  • 它会在关键步骤重新观察环境;
  • 后续动作根据当前物体位置重新计算;
  • 失败时可以走另一条路线。

这是一种“边做边看”的执行方式,机器人领域称为闭环,而不是“一次规划后盲目做到底”。

5.1 为什么必须检查真实物理结果

调用“闭合夹爪”成功,只能说明命令执行了,不能说明目标真的被抓住。

flowchart TDA["夹爪闭合命令执行完成"] --> B{"检查真实接触和物体状态"}B -->|"目标在两指之间并随夹爪移动"| C["抓取通过"]B -->|"夹爪空闭合"| D["抓取失败"]B -->|"抓错物体"| E["感知失败"]B -->|"目标随后滑落"| F["稳定性失败"]

GaP 因此会使用结果检查(论文和代码中称 checkpoint)验证任务完成后的真实状态。

它不是“保存模型权重的 checkpoint”,而是在问:

  • 目标真的被夹住了吗?
  • 物体真的进入容器了吗?
  • 插头真的插进接口了吗?
  • 锅和炉盘的覆盖关系真的满足要求吗?

这一步把“程序正常返回”和“任务真的成功”区分开来。论文在仿真排练中可以直接读取接触和物体位置;真实机器人则需要额外传感器或任务评测逻辑来完成这些检查。


6. GaP 怎样通过仿真排练变得更好

这是论文中最容易被误解的部分。

GaP 所说的“学习”,主要不是训练神经网络权重,而是:

在许多仿真场景中试跑流程,找到经常失败的步骤,再让 LLM 修改流程图。

flowchart LRA["生成初始流程图"] --> B["随机生成多种物体位置和朝向"]B --> C["并行仿真试跑"]C --> D["记录接触、位置和失败步骤"]D --> E["分析失败原因"]E --> F["LLM 修改局部流程"]F --> G{"表现稳定了吗"}G -->|否| BG -->|是| H["固定流程并部署"]

它可能修改的内容包括:

发现的问题 可能怎样改
经常认错物体 修改感知描述,或换感知技能
经常抓空 换抓取方法,增加候选姿态
抓住后容易滑落 调整抓取方向、力度或等待时间
物体经常放偏 调整释放位置和偏移量
某条失败路线无效 修改分支、重试或阶段顺序

极简伪代码如下:

def 通过排练改进流程(初始流程, 场景分布):流程 = 初始流程for _ in range(最大改进轮数):# 中文注释:每轮都在许多不同物体位置和朝向下完整试跑试跑结果 = 并行仿真(流程, 从场景分布采样())# 中文注释:用真实位置、接触和任务结果定位失败步骤失败报告 = 分析物理失败(试跑结果)if 已经足够稳定(试跑结果):return 流程# 中文注释:改的是步骤、连线、提示或数值参数,不是网络权重流程 = LLM修改局部流程(流程, 失败报告)流程 = 再次检查结构(流程)return 流程

6.1 怎样判断流程变得更好

判断标准很简单:成功率更高,同时完成时间更短。论文会综合成功奖励和执行效率,为不同流程打分。

GaP 没有专属的神经网络 Loss,也不通过反向传播训练权重;它比较试跑结果,然后保留更好的流程。

论文的爆米花案例中,初始流程的仿真成功率约为 33%。在更换抓法、改变感知目标并调整放置偏移后,仿真成功率达到 94%,实机达到 18/20。


7. 贯穿示例:把蓝黄罐头放进篮子

现在把前面的概念合在一起。

一次成功执行大致是:

  1. 相机看到桌面;
  2. 感知步骤找到罐头,并估计它现在在哪里;
  3. 感知步骤找到篮子;
  4. 抓取步骤根据罐头当前位置重新计算抓法;
  5. 抓取阶段结束后,可运行结果检查并记录罐头是否被夹住;严格检查失败时,本次运行会中止;
  6. 运输步骤计算到篮子的安全轨迹;
  7. 机器人下降、打开夹爪并离开;
  8. 最终是否成功,由环境评测规则或额外的放置检查确认。

7.1 失败时,GaP 知道该改哪里

flowchart TDA["任务失败"] --> B{"失败发生在哪一阶段"}B -->|"目标识别错误"| C["改感知描述或感知技能"]B -->|"夹爪没有抓住"| D["改夹爪接近位置、角度或抓取技能"]B -->|"物体没有放进篮子"| E["改释放位置或运输流程"]B -->|"流程结构错误"| F["改步骤、箭头或重试路线"]

这正是显式流程图的价值:

  • 失败能够定位到某个阶段;
  • 修改可以只影响局部;
  • 其余已经可靠的步骤不必全部重做;
  • 人也能看懂机器人为什么这样做。

需要注意:当前 quickstart 只提供抓取后的 target_held 检查,没有最终放置检查。流程到达 placedsuccess 出口,只表示控制流走到了那里,不能单独证明物体真的放好。


8. GaP 最终输出什么

GaP 最重要的输出是一份可保存、可查看、可执行的机器人流程文件。仿真排练还会产生成功率和失败报告;在线执行会留下任务结果、检查结果和执行记录。

这份流程文件可以长期复用。它不是一串临时动作,也不是新训练出的权重文件。


9. 这个方法什么时候最有价值

GaP 最适合同时满足三点的任务:工位和任务类型基本已知;物体位置、朝向或种类会变化;机器人已经拥有可靠的感知、路线计算和控制能力。

如果环境完全开放,或者连基础机器人能力都没有,GaP 就不是最自然的首选。

9.1 主要优势

  • 看得懂:策略是显式流程,不是黑盒动作序列。
  • 容易排错:能知道失败发生在感知、抓取还是放置。
  • 容易组合:传统算法、学习模型和控制器都可以成为图中的步骤。
  • 容易复用:可靠的小流程可以在其他任务中重复使用。
  • 适合长期任务:固定后的图可以在边缘设备上重复执行。

9.2 主要限制

  • 依赖已有技能库;没有真实能力,LLM 不能凭文字创造出来。
  • 更适合边界已知的固定工位,不是为完全开放世界设计的。
  • 仿真和真实世界存在差距,仍然需要实机标定与验证。
  • LLM 生成的图仍需严格检查,不能直接盲目信任。

10. 论文方法和当前公开代码的边界

当前目录同时包含论文和公开代码。两者不是完全相同的范围:

能力 论文完整方法 当前公开代码 v1
从语言任务生成流程图
结构检查和有限修复
执行流程、结果检查和记录
在许多机器人仿真场景中并行排练 未发布
把执行失败自动反馈给 LLM 并反复改图 未发布

因此:

  • 论文完整方法包含“排练 → 分析 → 改图”的自学习闭环;
  • 当前公开代码可以生成、检查和执行图;
  • 但不能直接端到端复现论文中的完整自动自学习系统。

这是理解论文和运行代码时最重要的版本边界。


11. 最后只记住这六句话

  1. GaP 把机器人策略表示成一张可执行流程图。
  2. LLM 负责设计和修改流程,不直接负责底层电机控制。
  3. 节点调用已有技能,箭头表示顺序、分支和重试。
  4. 执行器根据实时观察边做边看,而不是盲目执行固定动作。
  5. 论文中的“学习”是仿真试跑后修改流程图,不是反向传播训练 GaP 权重。
  6. 固定图部署后,写图的 LLM 通常不再参与在线动作循环。

← 返回列表