
Hardware per seat, shift structure, quality gates and real throughput for a 2 to 5 operator robot data team. Why robomimic's 300-demo six-operator dataset lost to its 200-demo single-operator one.
One person and one arm can record a dataset. This page is about what changes when two, three or five people record the same task in parallel: what each seat costs in hardware, how to structure a shift so the episodes stay comparable, what to check before an operator goes home, and how many usable episodes an hour of teleoperation actually produces.
The short version from the published record is uncomfortable. More operators reliably buy you more episodes. They do not reliably buy you a better policy. The one study that shipped both versions of the same dataset found the six-operator version worse than the one-operator version, despite having 50 percent more demonstrations in it. So a team is worth building only if you also build the thing that measures it.
What you need to know
- •The arithmetic ceiling for one seat is 30 episodes an hour: lerobot-record defaults to 60 s of episode plus 60 s of reset. Shorten both and the ceiling rises, but re-records and scene changes eat the difference.
- •robomimic shipped each task twice: 200 demonstrations from one proficient operator, and 300 from six operators of mixed skill. The 300-demonstration version trained worse policies. Operator count is not a proxy for data quality.
- •DROID took 50 collectors, 18 robots and 13 institutions 12 months to reach 76,000 successful episodes. Roughly 16,000 more were labelled not successful; they ship inside the same release but do not count towards the 76,000. Budget a discard rate from day one.
- •RoboTurk's 54 remote users got one supervised hour and a 5 minute tutorial each, then produced 2,144 demonstrations totalling 111.25 hours. Training an operator is cheap; the expensive part is reviewing what they record.
- •A leader-follower seat is two arms with different motors, not one arm twice. The upstream SO-101 bill of materials prices the pair at 229.88 USD.
- •Mean episode length per operator is the cheapest quality signal you have. In robomimic's own numbers the worse operator group took about twice as long per demonstration, with up to five times the spread.
A seat is two arms, one host and two cameras
The unit of planning is the seat, not the operator. A seat is everything one person needs to produce one episode without touching anyone else's equipment: a follower arm, a leader arm, a controller board and USB cable for each, two cameras, a host machine, and a calibration file per arm. Two operators sharing one seat in shifts is a different operation from two seats running at once, and the second is what people usually mean by team.
| Per seat | What it is | Why it matters with more than one seat |
|---|---|---|
| Follower arm | 6 x Feetech STS3215, all 1/345 gearing | Identical across seats, so spares are interchangeable. |
| Leader arm | 6 x STS3215 with mixed gearing: 1/191 on base and elbow, 1/345 on shoulder lift, 1/147 on wrist flex, wrist roll and gripper | You cannot build a leader from follower motors. Order leader and follower sets separately, per seat. |
| Controller board plus USB cable | One per arm, so two per seat | Each arm is its own serial port. Five seats is ten ports, and the names move between reboots. |
| Cameras | Two views, at least 480x640, about 30 fps | LeRobot guidance asks for two views, steady mounts and stable neutral lighting. Two seats with different geometry produce two datasets, not one. |
| Host machine | One per seat, runs lerobot-record | USB bandwidth and video encoding are per host. Two arms and four camera streams on one machine is where dropped frames start. |
| Power | 7.4 V for STS3215 | Same supply type on every seat. See the warning below. |
| Parts cost | 229.88 USD / 226.30 EUR for the SO-101 leader plus follower pair, per the upstream bill of materials checked in August 2026 | AY-Robots lists SO-100 parts at about 110 to 150 EUR per arm and SO-101 at about 130 to 170 EUR. |
Feetech STS3215 servos run at 7.4 V. Feeding them 12 V destroys them, usually slowly and one joint at a time, which reads as a control bug for a week. On a single-seat setup you notice. On a five-seat setup somebody borrows a brick from the LeKiwi base or a spare bench supply and one seat starts quietly producing torque-limited episodes that pollute the merged dataset. Label the supplies. If a joint has gone soft, start at servo not responding and arm twitches then sags.
The other thing that changes at more than one seat is calibration. LeRobot keys the calibration file to the id you pass on the command line, not to the serial port and not to the arm. That is convenient until two seats use the same id, or somebody swaps a follower between benches after a repair. Give every arm a unique id at build time, write it on the arm in marker, and never reuse it.
# find the port, one arm at a time (unplug when prompted)
lerobot-find-port
# write motor ids and baudrate into EEPROM, once per arm
lerobot-setup-motors \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0
# calibrate, and use a seat-unique id
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=seat2_follower
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=seat2_leaderThe throughput ceiling, and where it actually lands
Start from the recording tool, because it sets the ceiling. In LeRobot 0.6.1 (released 3 August 2026), lerobot-record defaults to --dataset.episode_time_s=60, --dataset.reset_time_s=60 and --dataset.num_episodes=50. At those defaults one episode costs two minutes of wall clock, so one seat tops out at 30 episodes an hour and the default 50-episode run takes 100 minutes.
pip install 'lerobot[core_scripts,feetech]'
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=seat2_follower \
--robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30} }" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=seat2_leader \
--dataset.repo_id=${HF_USER}/cube2bin-seat2-day03 \
--dataset.single_task="Pick up the red cube and place it in the bin" \
--dataset.num_episodes=25 \
--dataset.episode_time_s=20 \
--dataset.reset_time_s=15 \
--dataset.push_to_hub=false \
--dataset.no_stamp=trueIn LeRobot 0.6.1 the recorder appends a date-time tag to whatever you pass as --dataset.repo_id at dataset creation time, so cube2bin-seat2-day03 lands on disk as cube2bin-seat2-day03_20260824_101500. On one seat that is a curiosity. Across five seats and a fortnight it means every repo id in your merge command is wrong, and you find out at merge time. Pass --dataset.no_stamp=true to keep the name you chose; the flag exists in the config for exactly this reason, self-managed names intended for a later lerobot-edit-dataset merge. Everything else on this page assumes you passed it.
A tabletop pick-and-place on an SO-100 does not need 60 seconds. Set the episode window to 20 s and the reset to 15 s and the cycle drops to 35 s, which puts the ceiling near 100 episodes an hour. That number is arithmetic, not experience. Everything below the ceiling is the interesting part, and the published collections, from RoboTurk to DROID, tell you roughly how much gets taken off it.
| Collection | Operators and hardware | What was recorded | Rate you can derive from it |
|---|---|---|---|
| RoboTurk-Real, IROS 2019 | 54 remote users, 3 Sawyer arms, 1 week | 2,144 demonstrations, 111.25 hours, 186 s average task length | About 19 demonstrations per hour of demonstration time, on tasks that take minutes each |
| DROID, RSS 2024 | 50 data collectors, 18 robots, 13 institutions, 52 buildings, 12 months | 76,000 successful episodes, 350 hours, 564 scenes, 86 tasks | About 16.6 s per episode; collectors took up to 100 trajectories or roughly 20 minutes of interaction per scene before moving |
| BridgeData V2 | Low-cost arm, VR teleoperation, 84 percent human and 16 percent scripted | 60,096 trajectories across 24 environments | Cameras, objects and workspace position re-randomised every 50 trajectories |
| RT-1 | Fleet of 13 robots, 17 months | About 130,000 episodes, over 700 tasks | Roughly 590 episodes per robot-month sustained |
| AgiBot World | Over 100 robots in a 4,000 m2 facility with over 3,000 objects | Over 1 million trajectories, 217 tasks | Three-phase pipeline: standards first, local validity check, then per-episode review |
RoboTurk reports 2,144 demonstrations and 111.25 hours at an average of 186 s. Multiply it out: 2,144 x 186 s is 110.8 hours. The reported figure is the sum of the demonstrations themselves. Resets, scene changes, calibration, tutorials, re-records and the ten minutes somebody spent finding a USB port are not in it. When you compare a paper's hours against your team's timesheet, you are comparing two different quantities, and yours will always look worse.
Working down from the ceiling with the published discard rate gives a planning number rather than a promise. DROID recorded roughly 92,000 trajectories and counted 76,000 of them, so about 17 percent were marked not successful by the collector at the moment of recording. Take a 35 s cycle, remove 17 percent for re-records, and remove the block boundaries where the scene gets rebuilt, and a short tabletop task lands somewhere around 40 to 60 usable episodes per operator-hour. Measure your own first session before you plan a month on that figure.
What actually changes at two, three and five seats
| Seats | What the extra seat buys | What breaks first |
|---|---|---|
| 1 | Fastest iteration. One calibration, one camera geometry, one person who knows why every episode looks the way it does. | Nothing scales. A sick day is zero episodes, and operator habits are indistinguishable from task difficulty. |
| 2 | You can A/B a protocol change in one afternoon: one seat keeps the old grasp, one tries the new. One records while the other reviews. | Camera geometry drift. Two tripods nudged differently are two visual domains, and the policy learns the seat instead of the task. |
| 3 | A proficiency spread becomes visible in the numbers, so per-operator statistics start being worth computing. | Merging. Feature keys, fps and camera names must match exactly across three recordings or the merge refuses. |
| 5 | Shift coverage, and enough volume that a policy trained on the merge differs measurably from one trained on any single seat. | Review. At 50 episodes per seat per hour, five seats produce more footage than one reviewer can watch. |
The jump that surprises people is two to three, not one to two. With two seats you can still hold both benches in your head. With three you cannot, and every difference you have not written down becomes a difference in the data. This is the point where the AgiBot World approach becomes worth copying: before formal collection, they ran preliminary acquisition to validate each task and establish written collection standards, and only then let teleoperators start.
Structuring a shift
A shift is not a block of hours, it is a sequence of blocks with a defined reset between them. Borrow the block size from BridgeData V2, which re-randomised camera poses, objects and workspace position every 50 trajectories. On a small team, 25 is easier to review and still large enough that a block is a meaningful unit.
- 1Pre-flight the seat, every time
Ports move across reboots and a nudged camera is invisible until you look at the frame. Ten minutes here is cheaper than a discarded block. Confirm the calibration id matches the arm, then teleoperate for a minute with the camera view up.
bashlerobot-teleoperate \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=seat2_follower \ --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30} }" \ --teleop.type=so101_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=seat2_leader \ --display_data=true - 2Record the reference episode against yesterday's
One episode, then play back the same episode index from the previous day's dataset and compare frames. If the camera moved or the object start pose drifted, you find out in two minutes instead of at merge time.
bashlerobot-dataset-viz \ --repo-id ${HF_USER}/cube2bin-seat2-day02 \ --root ~/.cache/huggingface/lerobot \ --mode local \ --episode-index 0 - 3Record a block of 25 with a fixed task string
The task string is a feature of the dataset, not a comment. Keep it identical across all seats: the LeRobot dataset guidance asks for a specific description of 25 to 50 characters, not task1 or demo2. Different wording per seat splits your task index and silently turns one task into three.
bash--dataset.single_task="Pick up the red cube and place it in the bin" --dataset.num_episodes=25 - 4Re-randomise between blocks
Move the object start region, swap distractors, adjust the workspace position relative to the arm. Do not move the cameras unless the whole team moves them together and you record the change. Camera pose is the variation that most often turns into a policy that only works in one setup.
- 5Review the block before the operator leaves
Re-recording a bad block on the spot costs 15 minutes. Discovering it a week later costs the block plus everything you concluded from it. This is the step small teams skip and then regret.
bashlerobot-edit-dataset \ --repo_id ${HF_USER}/cube2bin-seat2-day03 \ --operation.type info \ --operation.show_features true
Shift length should follow the task, not the clock. RoboTurk had every participant fill in a NASA-TLX form, and the total workload varied by task from 51.5 for the Laundry Layout task to 76.9 for the open-ended Tower Stacking task, with frustration nearly doubling between the two. An open-ended task with no clear success point exhausts operators far faster than a bounded pick-and-place, and the exhaustion shows up as longer, sloppier episodes before anybody says they are tired.
- Bounded task with a crisp success condition: two-hour blocks with a short break between them.
- Open-ended or long-horizon task: shorten the blocks, and expect the last block of the day to be your worst.
- Rotate operators across seats only if every seat is calibrated and the camera geometry is genuinely identical. Otherwise rotation mixes two variables.
- Have the operator mark success or failure at the moment of recording, the way DROID's GUI did. Nobody reconstructs it from video a week later.
- New operators get one supervised session first. RoboTurk gave its 54 users a 5 minute tutorial plus one supervised hour, then let them collect alone.
Quality control, or why the six-operator dataset lost
The single most useful experiment for anyone building a team is in robomimic. The authors collected each simulated task twice through RoboTurk. The Proficient-Human set is 200 demonstrations from one experienced operator. The Multi-Human set is 300 demonstrations from six operators: two rated better, two okay, two worse, 50 each. Same tasks, same interface, same pipeline.
Policies trained on the 300-demonstration multi-operator sets performed worse than policies trained on the 200-demonstration single-operator sets. The paper attributes it to suboptimal and multimodal data: six people solve a task six ways, and behaviour cloning has to fit all six. When the authors split the multi-operator data by proficiency, plain behaviour cloning showed a gap of roughly 27 and 35 percentage points between the better and worse 100-demonstration subsets on two of the tasks, and adding 100 worse demonstrations to a good 100 made most algorithms decline rather than improve.
A team dashboard that shows episodes per operator per day will make you optimise the wrong number. The operator who records 80 short clean episodes and the one who records 80 with three different grasp strategies produce the same green bar and very different training sets. If you only build one metric, build a per-operator quality metric, not a per-operator count. Ending up with a dataset the trainer accepts but the policy cannot learn from is exactly the failure described in loss falls but the policy does nothing.
You do not need a rating panel to get a proficiency signal. robomimic's own appendix says it plainly: trajectory length is a proxy for quality, because less proficient operators take longer. Their numbers, averaged per demonstration in simulator steps, show what that looks like. Lift, Can and Square are single-arm tasks, where the proficient set is 200 demonstrations from one operator and each MH subset is 100 demonstrations from two. Transport needs two arms, so its proficient set is 300 demonstrations recorded jointly by two proficient operators and its MH subsets are 50-demonstration operator pairings. Read that column as a trend, not as the same comparison.
| robomimic subset | Lift | Can | Square | Transport |
|---|---|---|---|---|
| Proficient-Human (PH) | 48 +/- 6 | 116 +/- 14 | 151 +/- 20 | 469 +/- 54 |
| Multi-Human (MH) | 104 +/- 44 | 209 +/- 114 | 269 +/- 123 | 653 +/- 201 |
| MH-Better | 72 +/- 24 | 143 +/- 29 | 185 +/- 46 | 461 +/- 56 |
| MH-Okay | 94 +/- 30 | 181 +/- 47 | 265 +/- 78 | 636 +/- 128 |
| MH-Worse | 145 +/- 40 | 304 +/- 148 | 357 +/- 150 | 778 +/- 221 |
Read the standard deviations, not just the means. On the Can task the better group averaged 143 steps with a spread of 29; the worse group averaged 304 with a spread of 148. Twice as slow, five times as inconsistent. Both signals are computable from a LeRobot dataset without watching a single frame, which makes them the right first gate for a small team.
import numpy as np
from lerobot.datasets import LeRobotDataset
SEATS = ["seat1", "seat2", "seat3"]
DAY = "day03"
for seat in SEATS:
ds = LeRobotDataset(f"local/cube2bin-{seat}-{DAY}")
meta = ds.meta
lengths = np.array(
[meta.episodes[i]["length"] for i in range(meta.total_episodes)],
dtype=float,
)
secs = lengths / meta.fps
print(
f"{seat}: n={len(secs):3d} "
f"mean={secs.mean():5.1f}s sd={secs.std():5.1f}s "
f"cv={secs.std() / secs.mean():4.2f} "
f"p05={np.percentile(secs, 5):5.1f}s p95={np.percentile(secs, 95):5.1f}s"
)
# What to look at:
# mean far above the team mean -> that operator is struggling with the task
# cv above ~0.35 -> that operator is not repeating one strategy
# p95 near the episode_time_s -> episodes are being truncated, not completedAbove that gate sits a checklist. The LeRobot dataset guidance is specific about what belongs in frame and what does not, and it is worth turning into a one-page card taped to each bench, because these are the errors that survive a merge and only surface during fine-tuning.
- Two camera views, steady mounts, at least 480x640 at about 30 fps.
- Neutral stable lighting with no colour cast, and consistent focus and exposure across the whole block.
- The leader arm must not be visible in frame. Neither should hands, arms or anybody walking past.
- Nothing else moving in frame except the follower arm and the manipulated object.
- Camera keys named by location, not by device: images.top, images.front, images.wrist.left, never images.laptop.
- One task string, 25 to 50 characters, identical on every seat.
- A last check that costs nothing: can you do the task yourself from the camera images alone? If not, neither can the policy.

AgiBot World runs the same idea at industrial scale, and the shape of their pipeline transfers down. Phase one is preliminary collection to validate each task and write the standards. Phase two is collection against those standards, with a local validity check that catches mechanical problems like missing frames before upload. Phase three is per-episode review against the phase-one standards. They also keep a human-in-the-loop cycle: record a small set, train, deploy, and let the failure tell you what to change about the recording. One concrete example from that paper is a model that paused at the start of every action, traced back to inconsistent transitions and idle time in the recordings, and fixed by changing the protocol and stripping idle frames in post-processing.
Merging seats into one dataset
Record per seat and per day, merge at the end. A single shared repo id across five operators means one bad block cannot be removed without disturbing the rest, and it means two people writing to the same dataset directory. The dataset docs cover the format side; the operational rule is that the merge is the last step, never the first.
# 1. per seat: remove the episodes review rejected, into a new repo id
lerobot-edit-dataset \
--repo_id ${HF_USER}/cube2bin-seat2-day03 \
--new_repo_id ${HF_USER}/cube2bin-seat2-day03-clean \
--operation.type delete_episodes \
--operation.episode_indices "[4, 11, 12, 19]"
# 2. merge the cleaned per-seat datasets, in a fixed order
lerobot-edit-dataset \
--repo_id ${HF_USER}/cube2bin-day03-merged \
--operation.type merge \
--operation.repo_ids "['${HF_USER}/cube2bin-seat1-day03-clean', '${HF_USER}/cube2bin-seat2-day03-clean', '${HF_USER}/cube2bin-seat3-day03-clean']"
# 3. confirm what came out the other side
lerobot-edit-dataset \
--repo_id ${HF_USER}/cube2bin-day03-merged \
--operation.type info \
--operation.show_features true
# optional: unify wording that drifted between seats
lerobot-edit-dataset \
--repo_id ${HF_USER}/cube2bin-day03-merged \
--operation.type modify_tasks \
--operation.task_replacements '{"Put the red cube in the bin": "Pick up the red cube and place it in the bin"}'The merge operation concatenates episodes in the order you list the repo ids and requires the datasets to have identical features. Identical means the same camera keys, the same resolutions, the same fps and the same state and action dimensions. A seat where somebody named a camera front instead of top, or recorded at 640x360 instead of 640x480, will not merge, and finding that out on day 12 means 12 days of that seat need re-encoding. Decide the camera key names and resolutions once, before anyone records. If a merged v3.0 dataset then gets rejected by a trainer, dataset rejected as v3 covers the conversion path, and camera not detected covers the enumeration problems that cause key drift in the first place.
One version detail worth writing on the wall: GR00T N1.7 and GR00T N1.5 need LeRobot v2.0 or v2.1 datasets and will crash on a v3.0 one, while ACT, SmolVLA and Pi0.5 expect v3.0. If your team is heading for a GR00T run, the merged dataset has to be converted down to v2.1 before it goes near the trainer. Decide that before you have 5,000 episodes to convert.
Two ways to run this
You own the arms, the benches, the schedule and the review queue. Nobody can change the tooling under you, and the datasets are unambiguously yours. You are also the one buying five sets of leader motors and debugging why seat 4's wrist camera enumerates as /dev/video6 on Tuesdays.
- 1Build and number the seats
Two arms per seat, unique ids per arm, matching camera mounts. Print a second wrist bracket now; you will break one. SO-100 getting started covers the build, and SO-100 data collection covers the recording rig.
- 2Write the collection standard before anyone records
Task string, camera names, resolutions, fps, object start region, what counts as success, what counts as a re-record. One page. AgiBot World validated theirs with a preliminary collection round before starting for real, which is a day well spent.
- 3Record per seat, per day
Separate repo ids. Never two operators into one dataset directory.
bashlerobot-record ... --dataset.repo_id=${HF_USER}/cube2bin-seat2-day03 \ --dataset.num_episodes=25 --dataset.episode_time_s=20 --dataset.reset_time_s=15 --dataset.no_stamp=true - 4Gate on numbers, then on eyes
Per-seat mean and spread of episode length first, because it is free. Then watch the outliers. Then delete and merge.
- 5Train, and let the result change the protocol
A cheap run on ACT answers whether the merge is learnable at all before you spend another week recording. ACT on SO-100 has the exact command.
Five seats at 40 usable episodes an hour is 200 episodes an hour arriving in the review queue. Watching them at 1x is not possible. Plan for automated gating on episode length and frame integrity, plus spot-checking the tails, or plan for a reviewer per two seats.
The platform removes two specific problems: operators who do not own an arm, and the gap between a recorded dataset and a trained policy. It does not remove the review work, and it does not make five inconsistent operators consistent.
- The operator programme is how someone joins as an operator without buying hardware. The operator overview covers what the work involves.
- /live has a physical arm streaming with no signup, queue-based, which is the cheapest way to test whether a candidate can actually drive an arm before you commit a seat to them.
- The desktop client records LeRobot-format datasets straight out of a teleoperation session, so each seat produces the same format without each operator maintaining a Python environment.
- The dataset directory lists public datasets, and datasets can also come from a Hugging Face repo id or from an operator's own machine.
- Training takes a form: model, dataset, hyperparameters. The backend rents a GPU on a spot market by required VRAM and writes checkpoints to object storage, so nobody on the team has to own an A100.
- The CLI and the MCP server expose the same operations, which is what you want when the per-shift merge and stats need to run unattended.
- The operator guide and the sessions docs are the reference for how a session maps to recorded episodes.
Remote teleoperation adds network round trips on top of the control loop, and inference latency runs from 20 ms for ACT to 485 ms for Pi0.5 before any network is involved. For recording demonstrations of slow, deliberate tabletop tasks that is workable. For fast reactive motion it is not, and no amount of scheduling fixes it. The original RoboTurk paper found that poor network conditions, low bandwidth and high delay, did not substantially affect remote users' ability to complete demonstrations, but that was a simulator study over emulated links on tasks running 15 to 120 s.
- Wall-clock time. Five seats on one protocol collect a 2,000-episode dataset in a fifth of the days, and days are usually the constraint.
- Robustness to one person's habits. A single operator's idiosyncratic grasp becomes the policy's only grasp.
- You can A/B protocol changes within a single afternoon instead of across two weeks.
- Scene diversity scales with benches. DROID's generalisation came from 564 scenes across 52 buildings, not from any one operator being excellent.
- Operator skill improves measurably. RoboTurk found completion times fell with experience while exertion stayed flat: users learned finer motion, they did not just rush.
- Multi-operator data can train worse policies than single-operator data at higher episode counts. robomimic measured exactly that, 300 demonstrations losing to 200.
- Review scales linearly with seats and nothing else does. This is the real headcount cost.
- Every seat is a second camera geometry, a second lighting condition and a second set of calibration files that can drift.
- Merging is unforgiving. One mismatched camera key or frame rate and a seat's whole output has to be reprocessed.
- Hardware failures multiply. Five seats is five USB trees, ten serial ports and sixty servos, and STS3215 failures are usually silent.
- Coordination overhead at three or more seats is the line nobody budgets for.
Where more operators do not help
Some problems look like throughput problems and are not. Adding seats to any of these makes the situation worse, because you produce more of whatever was already wrong.
- The task is not learnable from your camera views. More episodes of an unobservable task just produce a policy that guesses.
- The policy fails on a variation you never recorded. That is coverage, not volume: you need different scenes, objects and start poses, and one seat can produce those by changing the setup.
- You are below the trainer minimum anyway. The floors are 30 episodes for SmolVLA and 50 for ACT, GR00T N1.7, GR00T N1.5 and Pi0.5, and one operator clears those in an afternoon.
- The bottleneck is the training loop, not the data. If you are waiting on results rather than on episodes, more seats change nothing.
- Operators are recording rescue attempts. An episode where the grasp failed and the operator recovered teaches the model that retreating is the correct response to a good approach. AgiBot World keeps such trajectories deliberately, annotated with failure reasons, and they are about one percent of that dataset. Deliberate recovery data is useful; accidental recovery data mixed into ordinary episodes is not.
What a month actually costs
Hardware is a one-off, and small. Five leader-follower seats at the upstream parts price is roughly 1,150 USD of arms, plus cameras, hosts and mounting. The recurring costs are people and GPU time, and GPU time is the smaller one by a wide margin.
| Line item | Figure | Source of the number |
|---|---|---|
| Arms, per seat | 229.88 USD / 226.30 EUR for the SO-101 leader plus follower pair | Upstream SO-ARM100 bill of materials, checked August 2026 |
| Arms, per seat (platform catalogue) | About 110 to 150 EUR per SO-100 arm, 130 to 170 EUR per SO-101 arm | AY-Robots robot catalogue |
| One training run, 24 GB tier (SmolVLA, ACT) | 2 to 5 hours, 0.30 to 0.60 USD per hour, about 1 to 3 USD | AY-Robots pricing, spot market |
| One training run, A100 or H100 tier (GR00T N1.7, GR00T N1.5, Pi0.5) | 3 to 6 hours, 1.20 to 2.00 USD per hour, about 4 to 12 USD | AY-Robots pricing, spot market |
| Inference pod | Auto-provisioned per run, with an idle watchdog that destroys the pod after an idle period | AY-Robots platform behaviour |
| Review labour | Scales linearly with seats; no published figure exists | Not sourced, and be suspicious of anyone who quotes one |

That asymmetry is the planning insight. A five-seat team can afford to throw away a week of recording and start over on a better protocol, and can afford to run a cheap ACT training run after every single day of collection just to see whether the curve is moving. Teams that do not do this discover on day 20 that days 1 through 19 shared a fixable defect. The data quality guide goes deeper on what those defects look like.
Become a robot operator
Drive real SO-100 class arms from anywhere and record the demonstrations that policies are trained on. No hardware of your own required, and no prior robotics experience assumed.
See the operator programmeHow many episodes per hour can one teleoperator actually record?▾
The arithmetic ceiling at the lerobot-record defaults is 30 an hour, because the defaults are 60 s of episode plus 60 s of reset. For a short tabletop pick-and-place you can cut that cycle to about 35 s, which puts the ceiling near 100. Once you subtract re-records at roughly DROID's 17 percent rate and the time spent rebuilding the scene between blocks, 40 to 60 usable episodes per operator-hour is a reasonable planning figure. Measure your first session rather than trusting it.
Is a dataset from five operators better than one from a single operator?▾
Not automatically, and the one controlled comparison says the opposite. robomimic collected each task twice: 200 demonstrations from one proficient operator, and 300 from six operators of mixed skill. The 300-demonstration multi-operator sets trained worse policies, which the authors attribute to suboptimal and multimodal data. Several operators help with scene and strategy diversity, but only if you gate on consistency.
Should each operator record into the same dataset or their own?▾
Their own, one repo id per seat per day. It lets you compute per-operator statistics, delete one seat's bad block without touching the others, and re-record a single day. Merge afterwards with lerobot-edit-dataset --operation.type merge. Two people writing into one dataset directory is how you end up with a dataset you cannot repair.
What is the cheapest way to spot a weak operator?▾
Mean and standard deviation of episode length, computed per operator from the dataset metadata. robomimic states directly that trajectory length is a proxy for quality because less proficient operators take longer, and their numbers show the worse group averaging about twice the duration of the better group with up to five times the spread. It costs nothing and needs no video review.
Do all seats need identical cameras and resolutions?▾
For merging, yes. The merge operation requires identical features, which means the same camera keys, resolutions, frame rate and state and action dimensions. Beyond the merge mechanics, differing camera geometry between seats creates separate visual domains, so a policy can learn to recognise the seat instead of the task. Fix the camera names and resolutions before anybody records.
How long does it take to train a new operator?▾
Less than people expect. RoboTurk gave each of its 54 remote participants a 5 minute tutorial and one supervised hour, after which they were allowed to collect unsupervised. The same paper found task completion times kept falling with experience while physical exertion stayed flat, meaning operators were learning finer control rather than simply rushing. The expensive part of onboarding is not teaching the interface, it is teaching the collection standard.
Sources
- RoboTurk: A Crowdsourcing Platform for Robotic Skill Learning through Imitation (CoRL 2018)
- Scaling Robot Supervision to Hundreds of Hours with RoboTurk (IROS 2019): 2,144 demonstrations in 111.25 hours across 54 users, plus the NASA-TLX workload table and the 5 minute tutorial protocol
- What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (robomimic): the PH versus MH comparison
- robomimic v0.1 datasets: 1 operator and 200 demos (PH) versus 6 operators and 300 demos (MH), split into better, okay and worse
- DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset (RSS 2024): 50 collectors, 18 robots, 13 institutions, 76k successful episodes and roughly 16k labelled not successful
- BridgeData V2: 60,096 trajectories across 24 environments, re-randomisation every 50 trajectories
- RT-1: Robotics Transformer, about 130k episodes gathered with 13 robots over 17 months
- AgiBot World Colosseo: over 1 million trajectories, three-phase collection pipeline with human-in-the-loop verification
- LeRobot: Imitation Learning on Real-World Robots, the lerobot-record defaults and keyboard controls
- LeRobot: Using Dataset Tools, the lerobot-edit-dataset operations including merge and delete_episodes
- lerobot v0.6.1 source: pyproject.toml (the core_scripts and feetech extras, and the lerobot-record / lerobot-edit-dataset / lerobot-dataset-viz console scripts) and configs/dataset.py (episode_time_s 60, reset_time_s 60, num_episodes 50, fps 30, and no_stamp)
- Hugging Face blog: what makes a good LeRobot dataset, the in-frame and naming rules
- TheRobotStudio/SO-ARM100: bill of materials for the SO-101 leader plus follower pair
- LeRobot SO-101 guide: leader gear ratios, lerobot-find-port, lerobot-setup-motors, lerobot-calibrate
- lerobot on PyPI: version 0.6.1, released 3 August 2026
Sources
- RoboTurk: A Crowdsourcing Platform for Robotic Skill Learning through Imitation (CoRL 2018)
- Scaling Robot Supervision to Hundreds of Hours with RoboTurk (IROS 2019): 2,144 demonstrations in 111.25 hours across 54 users, plus the NASA-TLX workload table and the 5 minute tutorial protocol
- What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (robomimic): the PH versus MH comparison
- robomimic v0.1 datasets: 1 operator and 200 demos (PH) versus 6 operators and 300 demos (MH), split into better, okay and worse
- DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset (RSS 2024): 50 collectors, 18 robots, 13 institutions, 76k successful episodes and roughly 16k labelled not successful
- BridgeData V2: 60,096 trajectories across 24 environments, re-randomisation every 50 trajectories
- RT-1: Robotics Transformer, about 130k episodes gathered with 13 robots over 17 months
- AgiBot World Colosseo: over 1 million trajectories, three-phase collection pipeline with human-in-the-loop verification
- LeRobot: Imitation Learning on Real-World Robots, the lerobot-record defaults and keyboard controls
- LeRobot: Using Dataset Tools, the lerobot-edit-dataset operations including merge and delete_episodes
- lerobot v0.6.1 source: pyproject.toml (the core_scripts and feetech extras, and the lerobot-record / lerobot-edit-dataset / lerobot-dataset-viz console scripts) and configs/dataset.py (episode_time_s 60, reset_time_s 60, num_episodes 50, fps 30, and no_stamp)
- Hugging Face blog: what makes a good LeRobot dataset, the in-frame and naming rules
- TheRobotStudio/SO-ARM100: bill of materials for the SO-101 leader plus follower pair
- LeRobot SO-101 guide: leader gear ratios, lerobot-find-port, lerobot-setup-motors, lerobot-calibrate
- lerobot on PyPI: version 0.6.1, released 3 August 2026
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started