一句话定位
把机器人操作任务的每个阶段表示成一组作用在 3D 语义关键点上的 Python 约束函数(Relational Keypoint Constraints,ReKep),用大视觉模型(DINOv2+SAM)自动提关键点、用 GPT-4o 通过视觉提示自动写约束代码,再交给现成数值优化器分层求解出 SE(3) 末端位姿序列——全程零训练、零任务专属数据、零环境模型,闭环运行约 10 Hz。
背景与定位
ReKep 属于”用 VLM 生成约束 / code-as-policy 做操作”这一范式,作者为 Stanford(Wenlong Huang、Chen Wang、Ruohan Zhang、Li Fei-Fei)+ Columbia(Yunzhu Li)。它要解决的核心矛盾:如何表示操作约束,使其同时满足三点——1) 广泛适用(多阶段、in-the-wild、双臂、可反应);2) 可规模化获取(能被基础模型自动化);3) 实时可优化(现成 solver 能高频求解)。
论文对比的两类既有做法都各有短板:用刚体相对位姿表示约束(TAMP 主流)需要预先建物体几何/动力学模型、对可形变物体无能为力;纯数据驱动学习约束虽灵活,但约束数量随物体×任务组合爆炸、数据难收集。ReKep 的关键洞见是把约束写成”关键点之间的算术关系”,既避开了显式建模,又借基础模型自动生成。
系统建立在几条既有工作上:约束优化 formulation 直接采用 Toussaint 等的 Sequence-of-Constraints MPC(受其启发做 receding-horizon 求解),关键点思想承接 kPAM(keypoint affordances,刚性假设也来自它),感知栈用 dinov2(细粒度自监督特征)+ segment-anything(objectness 先验)+ AnyGrasp(抓取检测)。同期可对比的视觉提示操作工作有 voxposer(本文主基线)、MOKA、PIVOT——ReKep 强调自己独有的优势:能做 6~12 DoF 任务、把高层规划与低层动作统一进一个连续数学规划、高频闭环执行、生成黑盒约束。
模型架构
ReKep 不是一个”学出来的策略网络”,而是一套感知—约束—优化的模块化系统,动作以 SE(3) 末端位姿序列表示。
约束表示(ReKep 本体):单条 ReKep 是一个无状态 Python 函数 f(keypoints) → cost,把 K 个关键点数组映射到一个无界标量代价,cost ≤ 0 表示约束满足。函数体是关键点上的 NumPy 算术运算(可非线性、非凸)。每个关键点是场景表面一个语义 3D 点(世界坐标系笛卡尔坐标,如茶壶把手、壶嘴)。多个关键点在强制刚性时可共同表示线、面乃至完整 SO(3) 旋转。
任务分解:一个任务被拆成 N 个阶段,每阶段 i 有两类约束——子目标约束(sub-goal,阶段结束时须满足)和路径约束(path,阶段内每一状态都须满足)。以倒茶为例:3 阶段=grasp/align/pour;stage-1 子目标把末端拉向壶把,stage-2 子目标要求壶嘴在杯口上方、stage-2 路径约束要求壶保持竖直防洒,stage-3 子目标指定倾倒角度。
关键点提议模块:输入 RGB → DINOv2(带 registers 的 ViT-S14)取 patch 特征 → 双线性上采样到原图尺寸;SAM 抽出场景所有 mask;每个 mask 内用 PCA 把特征降到 3 维(去掉纹理细节利于聚类),再用 k-means 聚类(每 mask 内 k=5)取簇的中值中心作为候选关键点 → 用标定 RGB-D 投到世界坐标。工作空间外的点、以及 Mean Shift(去掉彼此过近的点)过滤掉。同一 mask 的候选点会被记录,供优化时的刚性假设使用。
约束生成模块:把候选关键点以数字标号叠加到 RGB 上,连同语言指令喂给 GPT-4o,视觉提示它输出阶段数与每阶段的 sub-goal/path 约束 Python 代码。提示中不含 image-text in-context 示例(只有少量纯文本示例说明格式),大多数被测任务并未在提示里出现——即 VLM 靠内化世界知识生成约束。约束函数不直接操作关键点数值,而是指定 L2 距离、点积等算术关系,只在被真实关键点位置调用时才实例化。这样 VLM 只需在 (x,y,z) 笛卡尔空间里推理关键点关系,就能隐式指定完整 3D 旋转,把”直接预测 6-DoF/旋转”这个 VLM 做不好的事交给数值 solver。
动作/控制配置:末端位姿 SE(3);单臂 6-DoF、双臂 12-DoF。分层优化——子目标 solver 解下一子目标位姿+切换时机,路径 solver 解 receding-horizon 轨迹。关键点前向模型用刚性假设:末端与”被抓关键点”刚性绑定,给定末端位姿变化 ΔT 用同一刚体变换算关键点新位置(其余点视为静止),仅在短horizon(0.1s)内成立,真实关键点位置由视觉在 20 Hz 追踪并注入每个新问题。
数据
ReKep 全流程不训练、不用任何任务专属数据、不用环境模型——这正是其卖点,因此没有训练集/数据配比。相关”数据”体现在评测与仿真基线:
- 真机评测协议:每个 setting 10 次试验,物体位姿随机化,人工按每任务的成功判据打分。扰动实验里每次试验预设一个扰动(人手改变物体位姿);可形变物体任务关闭碰撞检测。
- 泛化实验:单任务”叠衣服”上测 8 类衣物(毛衣/衬衫/连帽衫/背心/连衣裙/裤子/短裤/围巾),每类 10 次,GPT-4o 只给通用指令、无 in-context 示例。
- 仿真基线的示教数据:OmniGibson 里的 Pour Tea 对照实验中,单体式 transformer 基线(RVT 架构)用 100 条脚本策略专家示教做模仿学习训练;ReKep 本身仍是 zero-shot 不训练。成功率在 100 次试验上平均。
关键点来源=DINOv2 特征聚类,非人工标注(Annotated 变体除外,用于对照上限)。感知输入=标定 RGB-D 相机(Orbbec Femto Bolt)在固定频率捕获 RGB 与点云。
训练方法
无训练目标、无梯度更新、无策略学习——这是 training-free / zero-shot 系统。“方法”核心在推理期的分层约束优化(把式(1)整体控制问题分解为只优化当前阶段的下一子目标+到达该子目标的路径):
- 子目标问题:决策变量=单末端位姿(位置+欧拉角,双臂则两个位姿),归一化到 [-1,1];目标=满足该阶段 sub-goal 约束 + 辅助代价(场景避碰、可达性、位姿正则、解一致性、双臂自碰)。抓取阶段额外并入抓取度量(用 AnyGrasp,因其昂贵不进优化环,改为返回离指定”抓取关键点”最近的抓取)。
- 路径问题:从当前末端位姿解一条到子目标的轨迹(中间位姿数按距离/固定步长确定),辅助代价含避碰、可达、路径长度、一致性、双臂自碰;到子目标距离小于容差即进入下一阶段。解出后用样条拟合再密采样执行。
- 回溯(backtracking):每个控制环检查上一阶段 sub-goal 约束是否仍成立,若被破坏(如杯子被拿走)就迭代回溯到仍满足其条件的前一阶段重规划。
- 求解器细节:全部用 SciPy 实现,决策变量归一化。首次迭代用 Dual Annealing(全局采样)+ SLSQP(局部精修),约 1 秒;后续基于上一解只跑局部优化器,约 10 Hz。梯度用有限差分(作者称精度/频率对本文任务足够)。约束违反以大权重代价项实现。
Infra(训练 / 推理工程)
- 训练算力:无(training-free,无 GPU-hours、无并行/精度配置)。
- 推理频率/延迟:优化器首次迭代约 1 秒,之后约 10 Hz 闭环;关键点视觉追踪 20 Hz;ESDF(nvblox)在独立进程 20 Hz;点跟踪器整个流程固定 20 Hz 运行。控制器:单臂位置控制 20 Hz、双臂两臂同时 20 Hz 控制(末端位姿目标下发后线性插值:位置步长 5mm、旋转步长 1°)。
- 感知/求解工程栈:DINOv2 ViT-S14(实时)做关键点提议与跟踪;SAM 分割;点跟踪基于 DINOv2 特征余弦相似匹配(多相机聚合参考特征、取 top 匹配、中值偏差剔除离群、末端均匀滤波);避碰用 nvblox_torch 算 ESDF、cuRobo 分割机械臂、Cutie 做被抓物 mask 跟踪;子目标/路径 solver 里可达性用 PyBullet 解 IK(约占目标函数 40% 时间,为提速把夹爪+被抓物点用最远点采样降到 ≤30 点);抓取检测 AnyGrasp。作者建议把 subgoal_solver / path_solver / keypoint_tracker / sdf_reconstruction / mask_tracker / grasp_detector 拆进独立进程并行以免串行延迟累积。VLM=GPT-4o 走 OpenAI API,每任务查询一次(非控制环内)。
- 硬件:① 轮式单臂平台=Franka 臂装在 Vention 框架轮式底座(无电机、靠人推移动出实验室),2 台 Orbbec Femto Bolt RGB-D 相机分置两侧;② 固定双臂平台=两台 Franka 臂朝桌面,3 台 Orbbec Femto Bolt(左/右/后)。低层用 Deoxys 关节阻抗控制器,PyBullet 解 IK,线性插值执行。
- 代码开源:GitHub 官方 demo 基于 OmniGibson 仿真(不含真机感知栈——关键点/mask 跟踪、SDF 重建在仿真里直接取真值),提供 pen-in-holder 任务与扰动演示。
评测 benchmark
所有数字取自论文原文。
真机成功率(无扰动,Tab.1,每格/10 次):基线 voxposer vs ReKep-Auto(基础模型自动生成)vs ReKep-Annotated(人工标注约束,作对照上限)。
- Pour Tea 0 / 3 / 8;Recycle Can 3 / 6 / 8;Stow Book 0 / 3 / 6;Tape Box 4 / 7 / 8(以上单臂);Fold Garment 0 / 5 / 6;Pack Shoes 0 / 3 / 5;Collab. Folding 0 / 4 / 7(以上双臂)。
- 总计:VoxPoser 10.0% / ReKep-Auto 44.3% / ReKep-Annotated 68.6%。
真机成功率(外部扰动,Tab.2,每格/10 次):
- Pour Tea 0 / 2 / 4;Tape Box 2 / 3 / 5;Collab. Folding 0 / 3 / 5。
- 总计:VoxPoser 6.7% / Auto 26.7% / Annotated 46.7%。
叠衣泛化(8 类衣物,Fig.4,每格/10 次):Strategy Success(关键点+约束是否可行)总 52.5%(sweater 6/shirt 4/hoodie 4/vest 6/dress 3/pants 7/shorts 7/scarf 5);Execution Success(给定可行策略的执行成功)总 73.8%(6/5/6/9/7/8/9/9)。
仿真对照(OmniGibson Pour Tea,A.12,100 次平均):
| 方法 | Seen Poses | Unseen Poses | Unseen Objects |
|---|---|---|---|
| Monolithic Policy(RVT 式 transformer,100 示教 IL) | 0.93 | 0.31 | 0.14 |
| ReKep(Zero-Shot) | 0.75 | 0.68 | 0.72 |
| 单体策略在训练分布内更强,但一到未见位姿/物体就崩;ReKep 零示教下泛化显著更稳。 |
系统误差分解(Fig.5,人工归因失败案例):点跟踪器贡献最大一块误差(频繁间歇遮挡导致跟踪不准);关键点提议与 VLM 也占相当比例(漏点、指错点);优化模块尽管时间预算有限但失败占比小(每问题常有多解);分割/3D 重建/低层控制器影响较小。
基线:主基线 VoxPoser(同用 GPT-4o、同相机输入、增补本文提示;用 OWL-ViT 检测、SAM 首帧分割、Cutie mask 跟踪);仿真里对照单体 RVT 式 transformer。
创新点与影响
贡献:1) 提出把操作任务表述成”关系式关键点约束”的分层优化问题;2) 用大视觉模型+VLM 自动指定关键点与约束的流水线;3) 两个真机平台上从语言指令+RGB-D 直接产出多阶段/in-the-wild/双臂/可反应行为,全程无任务数据、无训练、无环境模型。
它改变了什么:给出一个”VLM 只在笛卡尔坐标里推理关键点关系、真正的 6~12 DoF 旋转交给数值 solver”的解耦范式,绕开了当时 VLM 无法可靠预测 6-DoF/旋转的瓶颈(论文引 MOKA、PIVOT 自陈的局限);并把高层任务规划与低层动作组织进单一连续数学规划(受 TAMP 启发),从而天然处理跨阶段几何依赖、支持失败时回溯重规划、且高频闭环。约束以黑盒 Python 代码(可含任意算术、构造向量/面/体)的形式由视觉提示生成,是对 code-as-policy 视觉提示路线的一次有影响力的推进。ReKep 后续成为大量”VLM 生成约束/关键点做操作”工作的对标基线。
论文自陈局限:① 前向模型依赖刚性假设(靠高频反馈缓解精度要求);② 强依赖精确点跟踪,而重度间歇遮挡下的 3D 点跟踪本身很难(也是最大误差源);③ 假设每个任务是固定阶段序列(skeleton),换 skeleton 重规划需高频跑关键点提议+VLM,算力上难;④ 多阶段、强时序依赖任务里 VLM 提示鲁棒性不足;⑤ 任务空间规划不显式考虑机器人运动学,偶尔产出难达位姿;⑥ 未涉及铰接物体(需超出当时 VLM 的空间推理,可用微调扩展);⑦ 双臂协调在语义推理与求解搜索空间上都更难。
原始链接
- arXiv:https://arxiv.org/abs/2409.01652 (PDF:https://arxiv.org/pdf/2409.01652)
- 项目主页:https://rekep-robot.github.io/
- 代码(官方,OmniGibson demo):https://github.com/huangwl18/ReKep
- 视频:https://youtu.be/2S8YhBdLdww
一手源存档(sources/)
- rekep—project-page — 项目主页快照(sources/embodied/2024/rekep—project-page.md)
- rekep—github-readme — 官方 GitHub README 快照(sources/embodied/2024/rekep—github-readme.md)
- arXiv 2409.01652 全文 PDF/HTML 未入 git,见上方 arXiv 链接