25 min

Two ways to do this module

A real arm hands you two separate things at once, real data and a closed loop, and without one you can still buy each of them separately.

Where you are. You have trained policies on data you generated in simulation and measured them with an evaluation harness you wrote yourself. The next lesson opens with a bill of materials and a total of about $230. This lesson is the fork in front of it.

Ninety seconds, and eleven thousand frames

Open a terminal and pull down somebody else’s afternoon.

from huggingface_hub import hf_hub_download
import pandas as pd

path = hf_hub_download("lerobot/svla_so101_pickplace",
                       "data/chunk-000/file-000.parquet", repo_type="dataset")
frames = pd.read_parquet(path)
print(frames.shape)          # (11939, 7)

That is 11,939 rows. Fifty episodes of a real arm, on a real bench, in somebody’s real room, picking up a pink lego brick and putting it in a transparent box. Thirty rows per second. Six joint angles measured, six commanded, two camera streams at 480 by 640. A human hand drove every one of those rows.

Nothing was simulated and nothing was synthesised. It cost ninety seconds and no money.

So here is the question this lesson answers: what did the person who spent $230 get that you just did not?

The idea in one paragraph

A physical arm on your bench supplies two things at the same time, and they are separable. It supplies real data, with the noise, the backlash and the hesitating human hand that no model of a robot contains. And it supplies a closed loop, a way to put a trained policy back into the world and find out whether the task actually gets done. Buying an arm buys both in one purchase, which is why the two get discussed as one thing. Without an arm you can still buy each of them, separately: real robot data is published on the Hub by the hundred, and a closed loop is what MuJoCo has been giving you since Module 2. What you cannot buy separately is both at once, and that gap is precisely where most of the difficulty in real robotics lives. This module runs on either path. The milestone at the end has two acceptance criteria, and neither of them is the easy one.

with an arm: one purchase a real arm $230 and four weeks real data a human hand made it a closed loop around the world without one: two substitutions a public dataset 50 episodes, 90 seconds real data and no loop at all a MuJoCo scene resets for free a closed loop around a model never joined
A real arm supplies real data and a closed loop together; without one, a public dataset supplies real data with no loop and a simulator supplies a loop with no real data

Wider than the screen; scroll it sideways.

What each path actually supplies

Hardware pathSimulation path
Training datarecorded by your hand, 50-60 episodes, one afternoondownloaded, 50-206 episodes, ninety seconds; or teleoperated in MuJoCo
Evaluation20 physical trials, roughly 12 seconds and a human reset each200 or more scripted trials, seconds each, reset by a function call
Cost of a trialirreversible; a dropped brick stays droppedfree; the seed reproduces it exactly
What the number meansthe task, on your bench, in your lightthe task, in a model whose every constant is a guess
Confidence interval at 70%about 48-85% on 20 trialsabout 63-76% on 200 trials
Money$230 to $400, plus weeks of lead timenone

The interval row is worth reading twice, because it points the wrong way from the usual assumption. The reader with the arm publishes a wide, honest interval because trials are expensive. The reader without one has no excuse for a wide interval at all, and the milestone holds them to it.

Track A: real data, no robot

The Hub hosts LeRobot datasets in the same format Module 3 consumed. They are parquet files plus JSON metadata plus MP4 video, so pandas and pyarrow read them with no robotics library installed at all.

That first dataset is the closest public match to what this module asks you to record: same class of arm, same joint count, same frame rate, two cameras, one task sentence. Train on it and you are training on a real robot, driven by a real hand, with everything that implies.

Public data also arrives unpruned, which is a feature. lerobot/svla_so100_stacking contains an episode one frame long, and three shorter than thirty frames. Nobody removed them for you. Deciding what to drop and writing down the rule you dropped by is the same discipline the hardware reader learns with the discard key, arriving from a different direction.

Track B: a closed loop, no real data

The MuJoCo scene from Module 2 is the other half. It has an SO-101 model, a task, a success predicate that needs no human to judge it, and a reset that costs a function call. It is where your policy gets to fail two hundred times before dinner.

That loop is what lets a simulation reader do the thing this module is actually about: turn the data-quality loop. Record, train, roll out, watch the failures, sort them, aim the next batch of episodes at the biggest bucket, and turn it again. The loop is the content. The bench is the venue.

What you are actually giving up

Not a small thing, and this is where an honest account earns its keep. Four properties of a physical robot are missing from every simulator, and between them they account for most of what makes real robotics hard.

What is missingWhat it does on a real benchWhat sim does instead
Calibration driftThe map from encoder counts to joint angles moves. A servo is nudged, a bracket loosens, and a dataset recorded on Tuesday quietly means something else on Thursday.The model is exact and stationary. Frame conventions never move under you.
Lighting changeThe sun crosses the window and the policy stops seeing the object. Pixels are the observation space and pixels are not stable.Rendering is deterministic. You can randomise light, but only along axes you thought of.
Servo heatingA stalled joint dissipates every watt as heat. Torque sags, the arm droops, and the last ten trials of an afternoon are not the same experiment as the first ten.Actuators never get tired. Trial 200 is identical to trial 1.
Demonstration qualityYour hand is the label. It is careful at episode one, grooved by episode four, cutting the corner by episode eight, and it hesitated once because your phone buzzed.A scripted controller is perfectly consistent, which is a kind of data no human produces. Keyboard teleoperation is inconsistent in ways no human hand is.

Those four are not a footnote on the simulation path. They are three of the four topics in debugging by symptom, and the fourth is the entire subject of what makes a good demonstration.

How the rest of the module reads

Lessons 1 through 17 each carry a short section headed Without hardware, sitting just before their Check-yourself questions. It names the public dataset that replaces the recording step, the simulated task that replaces the physical one, and the thing to measure instead. The prose above it is unchanged and worth reading on either path, because the mechanism is the content: you should understand what a servo id collision does whether or not six motors are sitting on your desk.

Lessons 1 through 6 are the build, and on the simulation path they are read rather than done. Lessons 7 through 17 are the loop, and on the simulation path they are done. The milestone in lesson 18 states both acceptance criteria in full.

lessons 1-6 lessons 7-17 lesson 18 hardware path build it screws, ids, calibration run the loop record, train, deploy, diagnose 20 trials wide interval simulation path read it nothing to assemble run the loop public data and a MuJoCo bench 200 trials narrow interval the only place the paths diverge
Across lessons 1 to 6 the hardware reader builds and the simulation reader reads; both run the loop across lessons 7 to 17 and both reach the milestone, at twenty trials and two hundred respectively

Wider than the screen; scroll it sideways.

Check yourself

1. A real arm supplies two things that a reader without one has to buy separately. Name both, and say which is harder to substitute.

Real data and a closed loop. Real data substitutes well: public LeRobot datasets are recordings of real arms driven by real hands, in the same format your own recording would produce, and downloading one costs ninety seconds. The closed loop substitutes badly, because a simulated loop is closed around a model rather than around the world, so its success rate measures the model. The join is what is genuinely unavailable: you cannot evaluate a policy in a closed loop against real physics without a real robot, and that join is where the reality gap lives.

2. You train a policy on lerobot/svla_so101_pickplace and report an action-prediction error on held-out episodes. Why is that not a success rate?

Because it is measured open loop. Every prediction is scored against a recording the policy could not influence, so a mistake at frame 200 never changes what the policy sees at frame 201. On a robot, mistakes move the arm somewhere the demonstrations never visited and the errors compound; that is covariate shift, and it is the thing offline metrics structurally cannot see. Two policies with the same held-out error can have very different success rates, which is why the simulation milestone asks you to measure that disagreement rather than assume it.

3. Which of the four missing properties makes a dataset recorded on Tuesday mean something different on Thursday, and why does no amount of extra data fix it?

Calibration drift. The dataset stores joint angles, but the angles are only meaningful through the count-to-angle map that was in force when they were recorded. If a servo horn is nudged or the arm is recalibrated under a new id, the same stored number now names a different physical pose, so the old episodes and the new ones disagree about what the task is. Adding episodes recorded under the second calibration makes the contradiction bigger rather than smaller. The fix is upstream: one calibration per arm, backed up, and a replay check before you trust an afternoon.

4. Your simulated policy clears 200 trials at 88%. What may you claim, and what must the sentence contain?

You may claim that a policy trained on your simulated demonstrations completed your simulated task 88% of the time under a success predicate you wrote, and the sentence has to carry the venue, the trial count, the seed, and the predicate. What you may not claim is anything about hardware. A simulator is kinder than the world about contact and drift, and harsher than the world when a contact parameter you never tuned makes a real grasp impossible in the model, so the error is not even signed. The interval is also part of the claim: 88% over 200 trials is roughly 83-92%, which is a genuinely tighter statement than a hardware reader can make on 20 trials, and it is tighter about a smaller thing.

5. Why does the simulation milestone ask for 200 evaluation trials when the hardware milestone asks for 20?

Because the constraint on the hardware reader is wall-clock, and it is real: 20 trials is roughly an hour of resetting a bench by hand, and the resulting interval near 70% runs from about 48% to 85%. In simulation a trial costs milliseconds and a reset costs a function call, so the same wide interval would be a choice rather than a constraint. Equal rigour between the two paths does not mean equal trial counts; it means each path is held to what it can afford. The simulation path can afford a tight interval, so it is required to produce one.

Do this

Twenty minutes, and it decides the next six weeks.

1. Pull a real dataset and print its metadata. Nothing but pandas, pyarrow and huggingface_hub in the environment you already have.

import json
from huggingface_hub import hf_hub_download

info = json.load(open(hf_hub_download(
    "lerobot/svla_so101_pickplace", "meta/info.json", repo_type="dataset")))

print(info["codebase_version"], info["robot_type"], info["fps"])
print(info["total_episodes"], "episodes,", info["total_frames"], "frames")
for key, spec in info["features"].items():
    print(f"  {key:32s} {spec['dtype']:8s} {spec.get('shape')}")

Read the feature list against the frame anatomy in lesson 12. Every field the recording lesson describes is in there, produced by somebody else’s hand.

2. Confirm your simulator still runs. Open the Module 2 scene, run one scripted episode, and check the success predicate fires. If it does not, fix that now rather than in six weeks with a training run waiting on it.

3. Choose, and write it down. One line in your lab log: which path, and why. Cost, lead time, what you want the artefact at the end to be. If you order hardware later, this line is the dated note that says what you expected to gain.

4. Write the sentence you intend to publish, with the numbers left blank. "__% over __ trials on [bench], success criterion: ______". Both paths fill in the same sentence. Only one of them gets to leave the venue out, and it is neither.

What you can now do

You can say exactly what a physical robot supplies that a simulator does not, in terms of two separable goods rather than one vague advantage. You can load a real LeRobot dataset with three ordinary Python packages and read its metadata rather than trusting its name. You can name the four properties of real hardware that no simulator reproduces, and point at the lessons in this module that exist because of them. And you can state a robotics result with its venue attached, which is the one habit that makes numbers from the two paths comparable at all.

What you can now do

You can choose the hardware path or the simulation path for the rest of this course on stated grounds, name the four things the simulation path cannot give you, and say what your published number is worth on either.