Your Robot Learned to Push — Can It Slide?

First Evidence of Cross-Environment Experience Transfer in Robots
March 2026 · 6 min read

We did an experiment: train a robot to push objects in MuJoCo FetchPush, then drop it into FetchSlide — an environment it has never seen. Baseline success rate: 4%. With memory from the wrong task: 12%.

No model fine-tuning. No architecture changes. The robot used experience from a completely different task to perform better in a new one.

This shouldn't work. Pushing and sliding are different skills — different dynamics, different force profiles, different success criteria. But it did work. Here's why.

Why This Matters

Transfer learning is a well-studied problem: take a model trained on Task A and fine-tune it for Task B. It works, but it requires retraining — gradient updates, frozen layers, domain adaptation.

What we did is different. We didn't transfer model weights. We transferred memories.

The robot in FetchPush learned things like: "approaching from angle 0.34 with peak force 12.5N works for targets at distance 0.15m." These are experience parameters — not tied to a specific task, but to the physics of robotic manipulation.

FetchPush and FetchSlide share the same robot (7-DOF Fetch arm), similar workspace geometry, and overlapping physical constraints — distance estimation, force calibration, approach strategy. The memories don't store "how to push." They store "what physical parameters worked in this spatial context."

That's why a pushing memory can help with sliding.

The Experiment

We used robotmem to store and retrieve experience across environments. Three phases, 50 episodes each:

Cross-environment transfer: Without memory 4%, With FetchPush memory 12%

FetchSlide success rate. Left: no memory (4%). Right: with FetchPush memory (12%). +8 percentage points from cross-environment experience transfer.

+8 percentage points doesn't sound like much — until you consider what's happening. The robot has zero training in FetchSlide. It's using memories from a different task, with different dynamics, to improve on Day 1. This is experience transfer, not transfer learning.

The Code

The key insight is in how memories are stored and recalled. When the FetchPush robot succeeds, it stores the physical parameters with structured context:

from robotmem import learn, recall

# After a successful push (in 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}}'
)

# In FetchSlide: recall successful FetchPush experiences
memories = recall(
    "push object toward target",
    context_filter={"task.success": True},
    spatial_sort={"field": "spatial.target", "target": slide_target}
)

The context_filter ensures we only retrieve successes. The spatial_sort ranks memories by proximity to the current target — physically nearby experiences are more relevant than distant ones.

The retrieved parameters (force, angle, approach distance) are blended into the FetchSlide policy as initial biases. The robot doesn't blindly copy — it uses past experience as a starting point and adapts.

Reproduce It Yourself

git clone https://github.com/robotmem/robotmem
cd robotmem
pip install -e . gymnasium-robotics
cd examples/fetch_push
PYTHONPATH=../../src python experiment.py   # Build FetchPush memory first
PYTHONPATH=../../src python cross_env.py    # Test cross-environment transfer
# Output: Phase A 4% → Phase B 12% (+8%)

The cross-environment experiment requires FetchPush memory from experiment.py first (~5 min), then runs 150 FetchSlide episodes (~10 min). You'll see the improvement in the terminal output.

Give Your Robot Cross-Environment Memory

Learn once, use everywhere. Open source, pure CPU.

pip install robotmem