你的机器人学会了推 — 它能滑吗?

机器人跨环境经验迁移的首个实证
2026 年 3 月 · 阅读约 6 分钟

我们做了一个实验:在 MuJoCo FetchPush 中训练机器人推物体,然后将它放入 FetchSlide — 一个它从未见过的环境。基线成功率:4%。使用来自错误任务的记忆:12%。

无需模型微调。无需架构更改。机器人使用来自完全不同任务的经验,在新任务中表现更好。

这不应该有效。推和滑是不同的技能 — 不同的动力学、不同的力分布、不同的成功标准。但它确实有效。原因如下。

为什么这很重要

迁移学习是一个被广泛研究的问题:将在任务 A 上训练的模型微调用于任务 B。它有效,但需要重新训练 — 梯度更新、冻结层、域适应。

我们做的不同。我们没有迁移模型权重。我们迁移了记忆

FetchPush 中的机器人学到了这样的经验:"以 0.34 的角度、12.5N 的峰值力接近,对距离 0.15m 的目标有效。"这些是经验参数 — 不绑定于特定任务,而是与机器人操作的物理特性相关。

FetchPush 和 FetchSlide 共享同一个机器人(7 自由度 Fetch 机械臂)、相似的工作空间几何结构和重叠的物理约束 — 距离估计、力校准、接近策略。记忆存储的不是"如何推"。它们存储的是"在这个空间上下文中,什么物理参数有效。"

这就是为什么推的记忆可以帮助滑的任务。

实验

我们使用 robotmem 在不同环境之间存储和检索经验。三个阶段,每个阶段 50 个 episode:

跨环境迁移:无记忆 4%,有 FetchPush 记忆 12%

FetchSlide 成功率。左:无记忆(4%)。右:有 FetchPush 记忆(12%)。跨环境经验迁移提升了 +8 个百分点。

+8 个百分点听起来不多 — 直到你考虑到正在发生什么。机器人在 FetchSlide 中零训练。它使用来自不同任务、不同动力学的记忆,在第一天就提升了表现。这是经验迁移,不是迁移学习。

代码

关键洞察在于记忆的存储和检索方式。当 FetchPush 机器人成功时,它存储带有结构化上下文的物理参数:

from robotmem import learn, recall

# 成功推动后(在 FetchPush 中)
learn(
    insight="FetchPush: success, dist 0.012m, 28 steps, force=12.5N, angle=0.34",
    context='{"task": {"success": true}, "spatial": {"target": [1.3, 0.7, 0.42]}, "params": {"force_peak": 12.5, "approach_angle": 0.34}}'
)

# 在 FetchSlide 中:检索成功的 FetchPush 经验
memories = recall(
    "push object toward target",
    context_filter={"task.success": True},
    spatial_sort={"field": "spatial.target", "target": slide_target}
)

context_filter 确保我们只检索成功的经验。spatial_sort 按与当前目标的距离对记忆排名 — 物理上较近的经验比较远的更相关。

检索到的参数(力、角度、接近距离)作为初始偏置融合到 FetchSlide 策略中。机器人不是盲目复制 — 它以过去的经验作为起点并进行适应。

自己复现

git clone https://github.com/robotmem/robotmem
cd robotmem
pip install -e . gymnasium-robotics
cd examples/fetch_push
PYTHONPATH=../../src python experiment.py   # 先构建 FetchPush 记忆
PYTHONPATH=../../src python cross_env.py    # 测试跨环境迁移
# 输出:阶段 A 4% → 阶段 B 12%(+8%)

跨环境实验需要先通过 experiment.py 构建 FetchPush 记忆(约 5 分钟),然后运行 150 个 FetchSlide episode(约 10 分钟)。你会在终端输出中看到提升。

赋予你的机器人跨环境记忆

学一次,到处用。开源,纯 CPU。

pip install robotmem