The AY-Robots teleoperator page: become a robot operator from anywhere in the world, with a photo of the SO-100 arm operators drive
Data collectionTeleoperationSO-100LeRobotOperationsDataset quality

Building a Small Robot Data Collection Team: 2 to 5 Seats

AY-Robots ResearchAugust 23, 202625 min read

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 seatWhat it isWhy it matters with more than one seat
Follower arm6 x Feetech STS3215, all 1/345 gearingIdentical across seats, so spares are interchangeable.
Leader arm6 x STS3215 with mixed gearing: 1/191 on base and elbow, 1/345 on shoulder lift, 1/147 on wrist flex, wrist roll and gripperYou cannot build a leader from follower motors. Order leader and follower sets separately, per seat.
Controller board plus USB cableOne per arm, so two per seatEach arm is its own serial port. Five seats is ten ports, and the names move between reboots.
CamerasTwo views, at least 480x640, about 30 fpsLeRobot guidance asks for two views, steady mounts and stable neutral lighting. Two seats with different geometry produce two datasets, not one.
Host machineOne per seat, runs lerobot-recordUSB bandwidth and video encoding are per host. Two arms and four camera streams on one machine is where dropped frames start.
Power7.4 V for STS3215Same supply type on every seat. See the warning below.
Parts cost229.88 USD / 226.30 EUR for the SO-101 leader plus follower pair, per the upstream bill of materials checked in August 2026AY-Robots lists SO-100 parts at about 110 to 150 EUR per arm and SO-101 at about 130 to 170 EUR.
7.4 V, and the same 7.4 V on every seat

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.

bash
# 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_leader
Per-arm setup, run once per seat. The id is what the calibration file is named after.

The 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.

bash
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=true
One seat, one operator, one shift. Note the per-operator repo id and no_stamp: merge later, never during.
lerobot-record renames your dataset unless you stop it

In 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.

CollectionOperators and hardwareWhat was recordedRate you can derive from it
RoboTurk-Real, IROS 201954 remote users, 3 Sawyer arms, 1 week2,144 demonstrations, 111.25 hours, 186 s average task lengthAbout 19 demonstrations per hour of demonstration time, on tasks that take minutes each
DROID, RSS 202450 data collectors, 18 robots, 13 institutions, 52 buildings, 12 months76,000 successful episodes, 350 hours, 564 scenes, 86 tasksAbout 16.6 s per episode; collectors took up to 100 trajectories or roughly 20 minutes of interaction per scene before moving
BridgeData V2Low-cost arm, VR teleoperation, 84 percent human and 16 percent scripted60,096 trajectories across 24 environmentsCameras, objects and workspace position re-randomised every 50 trajectories
RT-1Fleet of 13 robots, 17 monthsAbout 130,000 episodes, over 700 tasksRoughly 590 episodes per robot-month sustained
AgiBot WorldOver 100 robots in a 4,000 m2 facility with over 3,000 objectsOver 1 million trajectories, 217 tasksThree-phase pipeline: standards first, local validity check, then per-episode review
The hours in those papers are demonstration time, not shift time

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

SeatsWhat the extra seat buysWhat breaks first
1Fastest 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.
2You 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.
3A 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.
5Shift 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.

  1. 1
    Pre-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.

    bash
    lerobot-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
  2. 2
    Record 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.

    bash
    lerobot-dataset-viz \
        --repo-id ${HF_USER}/cube2bin-seat2-day02 \
        --root ~/.cache/huggingface/lerobot \
        --mode local \
        --episode-index 0
  3. 3
    Record 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
  4. 4
    Re-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.

  5. 5
    Review 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.

    bash
    lerobot-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.

The trap: counting episodes as if they were interchangeable

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 subsetLiftCanSquareTransport
Proficient-Human (PH)48 +/- 6116 +/- 14151 +/- 20469 +/- 54
Multi-Human (MH)104 +/- 44209 +/- 114269 +/- 123653 +/- 201
MH-Better72 +/- 24143 +/- 29185 +/- 46461 +/- 56
MH-Okay94 +/- 30181 +/- 47265 +/- 78636 +/- 128
MH-Worse145 +/- 40304 +/- 148357 +/- 150778 +/- 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.

python
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 completed
Per-seat episode length statistics. Run it at the end of every shift, before anything gets merged.

Above 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.
The AY-Robots public dataset directory listing recorded LeRobot datasets with their episode counts
The public dataset directory. Browsing datasets recorded by other people is the cheapest way to calibrate what a block of episodes should look like before you commit five seats to a protocol.

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.

bash
# 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"}'
Drop the bad episodes per seat, then merge. lerobot-edit-dataset, LeRobot 0.6.1.
Merge requires identical features, and that is stricter than it sounds

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.

  1. 1
    Build 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.

  2. 2
    Write 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.

  3. 3
    Record per seat, per day

    Separate repo ids. Never two operators into one dataset directory.

    bash
    lerobot-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
  4. 4
    Gate 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.

  5. 5
    Train, 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.

The hidden cost is review, not recording

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.

Running two to five seats, honestly assessed
What the extra seats genuinely buy
  • 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.
What they cost you
  • 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 itemFigureSource of the number
Arms, per seat229.88 USD / 226.30 EUR for the SO-101 leader plus follower pairUpstream 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 armAY-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 USDAY-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 USDAY-Robots pricing, spot market
Inference podAuto-provisioned per run, with an idle watchdog that destroys the pod after an idle periodAY-Robots platform behaviour
Review labourScales linearly with seats; no published figure existsNot sourced, and be suspicious of anyone who quotes one
The AY-Robots pricing page showing GPU tiers and what a training run costs
The pricing page. Worth reading before you plan headcount: at 1 to 12 USD per run, the GPU is almost never the constraint on a small team. Operator hours and review hours are.

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 programme
How 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

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started