The AY-Robots recording tutorial showing how a LeRobot dataset is captured episode by episode from a teleoperation session
teleoperationdata collectionlerobotso-100ergonomics

Teleoperation Ergonomics: Recording Sessions That Produce Clean Data

AY-Robots ResearchAugust 23, 202622 min read

Leader arm ergonomics, episode pacing, resets between episodes and what operator fatigue does to a LeRobot dataset. Real lerobot-record flags, real defaults, real numbers.

What you need to know

  • A recording session does not capture the task. It captures one human doing the task, at whatever precision that human still has in hour three.
  • lerobot-record ships with fps 30, episode_time_s 60, reset_time_s 60 and num_episodes 50. The reset window is exactly as long as the episode window, and that is not an accident.
  • The SO-101 leader uses three gear ratios so it holds its own weight and still moves with little force. On the SO-100 you physically remove the leader gears. Both are ergonomic fixes.
  • In the 54-user RoboTurk real-robot study, completion times dropped steadily as users gained experience. Your first episodes are your worst episodes.
  • robomimic's Multi-Human sets (6 operators, 300 trajectories) score lower than its single-operator Proficient-Human sets (200), despite containing 100 more demonstrations.
  • Record in short blocks, mark bad episodes as you go, and prune afterwards with lerobot-edit-dataset delete_episodes. Pruning is cheaper than retraining.

The dataset does not record the task, it records you

Every frame in a LeRobot dataset has an action column, and that column is the position your hand put the leader arm in at that instant. There is no filter between your wrist and the training target. Overshoot a grasp and correct back, and the correction is in the data. Pause because you lost track of which cube is next, and those sixty frames of stillness are in the data. Approach from a slightly higher arc than you did an hour ago, and the policy sees two approach distributions for what you call one task.

This is the whole premise of imitation learning: the model fits actions given observations, and it cannot know which parts of your behaviour were the task and which were you. The ACT paper notes that all human demonstrations are inherently stochastic even when a single person collects all of them. That stochasticity is why action chunking exists at all. Chunking absorbs some of it. It does not absorb a fatigued operator.

What tiredness changes in the operatorWhat it becomes in the datasetWhat the policy learns
Slower reaction to a misgraspLonger correction segments near the objectHesitation as a normal part of approach
Larger holding tremorHigh-frequency noise on wrist_flex and wrist_rollA jittery action head, or noise averaged into a blurred target
Shoulder drifts higher over the sessionApproach trajectory distribution splits in twoA bimodal approach that resolves to neither mode
Gripper squeezed less consistentlyNarrower, inconsistent gripper spanGrasps that close too early or never fully close
Attention drops, restarts get missedEpisodes containing two attempts instead of oneRetry behaviour triggered at random
Reset done sloppilyObject start pose spreads without labelsApparent generalisation that is really unlabelled variance

That table lists mechanisms, not measured effects on your arm. The direction is the part that is well supported: in the RoboTurk real-robot study covered further down, task completion times dropped steadily as users gained experience. Operators change over a session, and the dataset is the integral of that change.

The leader arm is ergonomic hardware, and it shows

A leader-follower rig is the cheapest good teleoperation interface there is, because the mapping is joint to joint and your proprioception does the inverse kinematics for free. The catch is that you hold the leader up against gravity for the whole episode. Every design in this space has spent effort on that one problem.

On the SO-101, the follower uses six STS3215 motors with 1/345 gearing, but the leader uses three different gear ratios. The LeRobot docs state the reason directly: the leader uses differently geared motors to make sure it can both sustain its own weight and be moved without requiring much force. On the older SO-100 the fix is cruder. The assembly guide has you remove the gears from all six leader motors, so that you only use the position encoding of the motor and reduce friction to more easily operate the leader arm.

Leader jointMotor idSO-101 gear ratioSO-100 leader
Base / shoulder pan11 / 191gears removed, encoder only
Shoulder lift21 / 345gears removed, encoder only
Elbow flex31 / 191gears removed, encoder only
Wrist flex41 / 147gears removed, encoder only
Wrist roll51 / 147gears removed, encoder only
Gripper61 / 147gears removed, encoder only

The shoulder lift keeps the high 1/345 ratio on the SO-101 because it carries the most static load. The wrist joints drop to 1/147 because you move them constantly and the friction there is what wears your hand out. If you expect to record hundreds of episodes, read the SO-100 versus SO-101 comparison with that in mind, and the full SO-100 guide for the build itself. The parts cost difference is around 20 EUR. The difference in how your forearm feels after ninety minutes is larger than that.

7.4 V, not 12 V

Feetech STS3215 bus servos on the SO-100 and SO-101 run at 7.4 V. A 12 V supply destroys them. Koch v1.1 uses Dynamixel motors on 5 V and 12 V rails, LeKiwi uses 7.4 V for the arm and 12 V for the base, so a bench with several arms carries several supplies that look interchangeable and are not. Label the bricks before you label anything else. If an arm misbehaves after a swap, start at servo not responding.

The bimanual ALOHA setups went the same way. The original design added a 3D-printed handle and scissor mechanism to the leader specifically to reduce the force required from the operator to backdrive the motor, plus a rubber band mechanism to partially counteract gravity on the leader side. ALOHA 2 replaced the scissor gripper with a low-friction rail design and swapped the rubber bands for passive gravity compensation built from off-the-shelf parts. Two hardware generations, both spent on operator effort.

Bench setup before the first episode

Everything fiddly should be fiddly before you record, not between episodes. Ports first, because they change when you replug. Cameras second, because they change when you reboot. Calibration third, because it is the one step that silently poisons every later episode if you rush it.

  1. 1
    Find and pin the serial ports

    Run this once per arm, unplugging when prompted. Write the two paths on tape and stick it on the USB hub. On Linux you may also need to relax permissions on the tty device.

    bash
    lerobot-find-port
    
    # example output
    # ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is /dev/ttyACM1
    
    sudo chmod 666 /dev/ttyACM0
    sudo chmod 666 /dev/ttyACM1
  2. 2
    Enumerate the cameras and note their real profile

    The identifiers can change after a reboot or a replug, and the default stream profile is often not what you want. A camera advertising 1920x1080 at 15 fps will not feed a 30 fps recording loop.

    bash
    lerobot-find-cameras opencv
    
    # --- Detected Cameras ---
    # Camera #0:
    #   Name: OpenCV Camera @ 0
    #   Id: 0
    #   Default stream profile:
    #     Width: 1920
    #     Height: 1080
    #     Fps: 15.0
  3. 3
    Calibrate both arms in the same session

    Move every joint to the middle of its range, press Enter, then sweep each joint through its full range. Do the leader and the follower back to back so the two calibration files describe the same physical geometry. The id you pass here is the id you must reuse when recording.

    bash
    lerobot-calibrate \
      --robot.type=so101_follower \
      --robot.port=/dev/ttyACM0 \
      --robot.id=my_follower_arm
    
    lerobot-calibrate \
      --teleop.type=so101_leader \
      --teleop.port=/dev/ttyACM1 \
      --teleop.id=my_leader_arm
  4. 4
    Drive it for five minutes with the visualiser on

    This is the dry run. Watch the camera feeds while you drive, not the arm. If you cannot do the task looking only at the camera images, the policy cannot either, and no amount of episodes will fix a view that does not show the contact.

    bash
    lerobot-teleoperate \
      --robot.type=so101_follower --robot.port=/dev/ttyACM0 \
      --robot.id=my_follower_arm \
      --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
      --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 \
      --teleop.id=my_leader_arm \
      --display_data=true
  5. 5
    Set the bench so you are not reaching

    The leader base, your elbow and the work surface should let you drive with your upper arm close to your body. If you are recording standing with the leader at chest height, the shoulder lift joint carries your arm weight as well as the leader's, and that is the joint that decides how your approach trajectories drift.

The leader arm must not appear in the camera frames

The LeRobot dataset guidance is explicit: only the follower arm and the manipulated objects should move in frame, and the leader arm should not appear. If your hand or the leader drifts into the front camera view halfway through a session, the model gets a shortcut feature that will not exist at inference time. That failure has its own page: policy only works in one setup.

What lerobot-record actually assumes about you

The defaults below are read from lerobot's own recording config, src/lerobot/configs/dataset.py on the main branch, on 23 August 2026. They are worth reading as a statement about pacing, because that is what they are. For how the format itself is laid out on disk, see the dataset documentation and the LeRobot dataset glossary entry.

FieldDefaultWhat it implies about the session
fps3030 action rows per second. A 60 s episode is 1800 rows.
episode_time_s60One minute is the assumed upper bound for a single attempt.
reset_time_s60You get as long to reset the scene as you had to do the task.
num_episodes50The default session is 50 episodes, roughly 100 minutes of wall clock at the other defaults.
videotrueFrames are encoded to MP4 rather than kept as PNG.
push_to_hubtrueThe dataset uploads when the session ends unless you disable it.
num_image_writer_threads_per_camera4Four writer threads per camera. Too many blocks the main loop, too few starves the cameras.
num_image_writer_processes0Threads only by default. Raise it if fps is unstable.
streaming_encodingfalseOff by default. Turning it on makes save_episode near-instant.
no_stampfalseA datetime tag is appended to repo_id at creation, so each session gets a unique name.

Fifty episodes at one minute each plus a minute of reset is a hundred minutes of continuous fine motor work with no break structure at all. The defaults describe a budget; the protocol is yours to add. Fifty does line up with the minimum episode counts the trainers here want: 50 for ACT, GR00T N1.7 and Pi0.5, 30 for SmolVLA. That is a floor, not a target.

bash
lerobot-record \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.id=my_follower_arm \
  --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
  --teleop.type=so101_leader \
  --teleop.port=/dev/ttyACM1 \
  --teleop.id=my_leader_arm \
  --display_data=true \
  --dataset.repo_id=${HF_USER}/cube_to_bin \
  --dataset.single_task="Pick the red cube and drop it in the bin" \
  --dataset.num_episodes=12 \
  --dataset.episode_time_s=25 \
  --dataset.reset_time_s=15 \
  --dataset.fps=30 \
  --dataset.push_to_hub=false
One recording block: 12 episodes, 25 s each, 15 s reset. About 8 minutes of work, then you stand up.

Two flags do the pacing work. episode_time_s=25 is roughly twice the time the task actually takes you, so a clean run finishes early and a fumbled one gets cut off instead of becoming a two-attempt episode. num_episodes=12 ends the block while you are still sharp. Resuming into the same dataset later is supported, and the flag semantics are easy to get wrong.

On resume, num_episodes means additional episodes

When you re-run the same command with --resume=true, --dataset.num_episodes must be set to the number of additional episodes to record, not the target total. You also have to pass --dataset.root pointing at the local path. Get this wrong and you either stop 12 episodes short or record 50 more than you meant to. To start over from scratch you must delete the dataset directory by hand; the recorder will not do it for you.

Pacing: the three keys that make a session survivable

Three keys control the flow during recording, and they are the difference between a session you can prune afterwards and one you cannot. On Linux they work on X11, Wayland and headless or SSH sessions with no $DISPLAY setup: when no global keyboard backend is available, lerobot-record reads the same keys from the terminal, so it has to run in an interactive TTY that has focus. That fallback covers the recording control flow only. Keyboard teleoperation, where the keyboard replaces the leader arm, still needs a global key backend.

  • Right arrow or n: end the current episode or reset phase early and move to the next. This is your main tool. A clean run at 12 seconds should not sit there burning the remaining 13 seconds of episode_time_s with the arm parked.
  • Left arrow or r: cancel the current episode and re-record it. The episode buffer is cleared and nothing is written. Use it the moment you know the attempt is bad, not at the end.
  • Escape or q: stop the session, encode the videos and upload. This is the honest exit when you notice your hand is shaking.

The re-record key deserves a habit, not just knowledge. When an episode goes wrong at second 3 the instinct is to recover and finish, because finishing feels productive. That instinct is what fills a dataset with recovery behaviour. Press r; it costs ten seconds. Leaving the episode in costs a retraining run at 4 to 12 USD on the A100 tier or 1 to 3 USD on the 4090 tier, plus the hours.

The AY-Robots recording tutorial page at /learn/record-your-first-dataset, showing the step by step flow for capturing a LeRobot dataset from a teleoperation session
The recording walkthrough at /learn/record-your-first-dataset. The same episode, reset and re-record loop, with the client handling the LeRobot format on disk.

ALOHA is the useful reference for session structure. Teleoperation and recording both run at 50 Hz there, episodes last 8 to 14 seconds depending on task complexity, which is 400 to 700 timesteps, and they recorded 50 demonstrations per task except Thread Velcro, which got 100. Short episodes, moderate counts. Five blocks of 12 episodes at a 25 s cap is about 8 minutes of recording each:

BlockAfter the block
1Stand up, replay episode 0, check the wrist view
2Break, 5 min, hands off the leader
3Move the object start zone, note the change
4Break, review any episode you flagged
5Stop for the day at 60 episodes

That schedule is assembled from the pieces above, not a measured protocol. What is not negotiable: a short episode cap, real breaks, and reviewing something between blocks. Five blocks of twelve clears the 50-episode floor for ACT on the SO-100 with a margin for the ones you will delete.

The reset is part of the data, even when it is not recorded

In lerobot-record the reset phase calls the same control loop as the episode, with the teleoperator live and the dataset argument left out. The arm still follows your leader; nothing is written. That is deliberate. You drive the follower back to its start pose with the same interface you just used, so the arm never gets yanked by hand and the servos never get back-driven against their gearing. The recorder also skips the reset after the last episode of a run, which is why a block that ends cleanly ends faster than the arithmetic suggests.

The effect on the dataset is indirect but strong. The object start pose at frame 0 of the next episode is entirely determined by how you reset. Place the cube by eye, let your eye drift over the session, and you have added a variable the dataset does not label. The LeRobot guidance is roughly 10 episodes per object location, and to avoid adding too much variation too quickly. That only works if the locations are actual locations.

Two ways to reset, and what each one costs
Marked positions on the table
  • The start pose distribution is discrete and countable, so 10 episodes per location is a real claim
  • You can tell a training failure from a coverage gap, because you know exactly which locations were covered
  • Resets get faster over the session instead of slower, which protects the tail episodes
  • A second operator can reproduce your session next week
Free placement by eye
  • Variation is limited to the marks you drew, so the policy may cling to those exact poses
  • The marks are visible in the camera frames and become a feature the policy can use
  • Slower to set up, and you have to redo it if the camera moves
  • Free placement covers more of the workspace per episode, if you can keep it honest
Use the reset window, do not skip it

At episode 40 the temptation is to hammer the right arrow through every reset and keep the arm moving. Resist it. The reset is the only structured pause the recording loop gives you, and reset_time_s defaults to a full 60 seconds for that reason. Cutting it to 15 seconds is reasonable. Cutting it to zero means your last twenty episodes are recorded by a more tired operator than your first twenty.

What the evidence says about operator variance

The clearest experiment here is robomimic's dataset design. The Proficient-Human sets came from 1 operator on the RoboTurk platform, 200 successful trajectories each. The Multi-Human sets came from 6 operators, 50 trajectories each for 300 total, rated 2 worse, 2 okay, 2 better. The result worth carrying around: success rates are lower on the Multi-Human sets than on the Proficient-Human sets even though the Multi-Human sets contain 100 more demonstrations. The study attributes that to suboptimal and multimodal data, and separately reports that batch reinforcement learning methods are proficient on machine-generated data but poor on human data, while history-dependent models do markedly better on it.

That is usually read as a statement about multiple people. It is equally a statement about one person across a long session: the operator at episode 45 is not the one from episode 5. RoboTurk's real-robot deployment, which extended the platform from simulation onto three Sawyer arms, saw the drift in the other direction: 54 users in one week produced 2144 demonstrations and 111.25 hours across three tasks at a mean task length of 186 seconds, completion times dropping steadily with experience. There is a warm-up curve and a fatigue curve, and your dataset sits on both. The RoboTurk write-up covers that platform in more detail.

SourceCollection designNumber that matters here
robomimic (CoRL 2021)PH: 1 operator, 200 trajectories. MH: 6 operators, 50 each, 300 totalMH scores lower than PH despite 100 more demonstrations
RoboTurk real robot (IROS 2019)54 users, 1 week, 3 tasks, 3 Sawyer arms2144 demonstrations, 111.25 hours, mean task length 186 s
ALOHA (2023)Single-operator bimanual leader-follower at 50 Hz50 demonstrations per task, 100 for Thread Velcro, 8 to 14 s per episode
DemInf (2025)Mutual-information based quality scoring and filtering5 to 10 percent improvement on RoboMimic from curating the dataset
DQAF (2026)Episode-level quality feedback during collection, 3-operator pilotThe operator given automated post-episode feedback improved faster; no effect size reported

The DemInf result is the practical one: filtering a dataset by an automatic quality score, rather than collecting more of it, bought a 5 to 10 percent improvement on RoboMimic tasks plus better performance on real ALOHA and Franka setups. A 2026 framework called DQAF closes the loop during collection instead, scoring each episode on sub-task progress, motion smoothness, stalls and kinematic limits and turning that into natural-language feedback right after the episode. Read that one at its actual size: in a pilot with three novice operators, the one who got the automated feedback improved faster than those who did not, with no effect size reported. Neither tool ships with LeRobot today, so the manual equivalent is you, a notebook and the data quality checklist.

Two ways to run the session

Everything runs on the machine the arms are plugged into. Install LeRobot with the Feetech extra, calibrate, then record in blocks. Commands verified against the LeRobot main branch docs and source on 23 August 2026.

bash
pip install -e ".[feetech]"

# one block of 12 short episodes, stays local
lerobot-record \
  --robot.type=so101_follower --robot.port=/dev/ttyACM0 \
  --robot.id=my_follower_arm \
  --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
  --teleop.type=so101_leader --teleop.port=/dev/ttyACM1 \
  --teleop.id=my_leader_arm \
  --dataset.repo_id=${HF_USER}/cube_to_bin \
  --dataset.root=./data/cube_to_bin \
  --dataset.single_task="Pick the red cube and drop it in the bin" \
  --dataset.num_episodes=12 \
  --dataset.episode_time_s=25 \
  --dataset.reset_time_s=15 \
  --dataset.push_to_hub=false \
  --display_data=true

# next block, same dataset: num_episodes is ADDITIONAL episodes
lerobot-record \
  ... same flags ... \
  --dataset.root=./data/cube_to_bin \
  --dataset.num_episodes=12 \
  --resume=true

# review a specific episode before you trust the block
lerobot-dataset-viz --repo-id ${HF_USER}/cube_to_bin \
  --root ./data --mode local --episode-index 7

You own the pacing, the marks on the table and the pruning. You also own the ffmpeg install, the USB bandwidth budget across two cameras and the fact that identifiers change on reboot. Budget an evening for the first setup and treat the first block of 12 as throwaway warm-up.

Prune the episodes fatigue ruined

Pressing r during the session catches the obvious failures. It misses the slow ones, where the task succeeded but the trajectory wandered. Those you find afterwards: open the visualiser, step through the episodes you flagged, and delete the ones that are technically successful and behaviourally wrong.

bash
# look at one episode: camera streams, joint states and actions on a timeline
lerobot-dataset-viz \
  --repo-id ${HF_USER}/cube_to_bin \
  --root ./data --mode local \
  --episode-index 41

# how many episodes and frames do I actually have
lerobot-edit-dataset \
  --repo_id ${HF_USER}/cube_to_bin \
  --operation.type info

# drop the bad ones into a NEW dataset, keeping the original intact
lerobot-edit-dataset \
  --repo_id ${HF_USER}/cube_to_bin \
  --new_repo_id ${HF_USER}/cube_to_bin_pruned \
  --operation.type delete_episodes \
  --operation.episode_indices "[7, 41, 42, 55]"
Always write to --new_repo_id. Without it, delete_episodes modifies the original dataset in place.

Two habits make this cheap. Keep a text file open with one line per episode index and a two-word note, because at review time you will not remember why episode 41 felt wrong. And keep one task string for the whole session: the guidance is 25 to 50 characters clearly describing the objective. To fix wording later, modify_tasks can rewrite it, but that operation edits in place and ignores new_repo_id.

The AY-Robots public dataset directory at /directory, listing recorded LeRobot datasets available to browse and train on
The public dataset directory at /directory. Browsing other people's episode counts and task strings is the fastest way to calibrate what a session should look like.
The warning that means your data is already damaged

If the recording loop cannot keep up, LeRobot logs: Control loop is running slower (X Hz) than the target FPS (30 Hz). Dataset frames might be dropped and robot control might be unstable. It lists the causes as camera FPS not keeping up, policy inference taking too long, and CPU starvation. Do not record through this. Frames dropped unevenly mean the timestamps in your dataset no longer describe the motion you performed, and every episode recorded after the warning appeared is suspect. Stop, fix the camera resolution or the writer thread count, restart the block.

Where none of this helps

Three honest limits. First, no amount of pacing discipline fixes a camera that cannot see the contact. The LeRobot rule of thumb is that you should be able to do the task yourself looking only at the camera images. If you cannot, stop recording and move a camera. Camera problems are cheaper to fix than dataset problems.

The AY-Robots download page for the desktop client that records LeRobot datasets straight from a teleoperation session
The desktop client at /download. It removes the plumbing around a recording session. It does not remove the session.

Second, this platform does not measure your fatigue. There is no posture check, no break timer, no per-episode smoothness score. The prototypes that score episodes on smoothness and stalls exist in papers, not in the tooling you have today. Your substitute is a short block, a notebook and the discipline to stop.

Third, distance. Driving an arm over the public internet works, and the no-hardware entry points exist for exactly that. But every round trip you add sits between your hand and the follower, and the same physics governs the return path at inference time. The control loop runs at 20 ms per action step for ACT, 152 ms for GR00T N1.7, 165 ms for GR00T N1.5, 245 ms for SmolVLA and 485 ms for Pi0.5. Adding public-internet round trips on top of inference latency turns a working policy into a hesitant one. Remote inference is viable for slow pick-and-place, not for fast reactive motion, and the same applies to remote recording of fast tasks.

The one-sentence version

Short episodes, real resets, deliberate breaks, and a habit of pressing r the moment an attempt goes wrong. That combination costs you an hour of session time and saves you a training run.

Get paid to record clean episodes

Operators drive real SO-100 arms and record LeRobot datasets from anywhere. The pacing habits in this article are the job.

Become an operator
How long should a single episode be?

Set episode_time_s to roughly twice the time the task takes you when it goes well, then end each clean run early with the right arrow. The LeRobot default is 60 seconds; ALOHA episodes ran 8 to 14 seconds at 50 Hz, or 400 to 700 timesteps. A cap that is too generous turns a fumbled attempt into a two-attempt episode, which is worse than a discarded one.

Should one person record the whole dataset, or several?

For a first working policy, one person. robomimic built its Proficient-Human sets from 1 operator with 200 trajectories and its Multi-Human sets from 6 operators with 50 each, rated 2 worse, 2 okay, 2 better, and the Multi-Human sets scored lower despite holding 100 more demonstrations. Add operators once the single-operator policy works, and record their episodes as separate datasets so you can drop one without redoing everything.

How many episodes do I need before training is worth it?

The minimums here are 50 episodes for ACT, GR00T N1.7 and Pi0.5, and 30 for SmolVLA. Those are floors for the trainer to accept the job, not targets for a policy that works. Record past the floor so you can delete the ones you spoil. A run costs 4 to 12 USD on the A100 or H100 tier and 1 to 3 USD on the RTX 4090 tier.

Is the reset between episodes recorded?

No. lerobot-record runs the same control loop for the reset but without passing the dataset, so the arm still follows your leader and nothing is written; the reset after the final episode is skipped entirely. Drive the follower back rather than pushing it by hand. The object start pose you set during the reset silently determines the first frame of the next episode.

What is the difference between the SO-100 and SO-101 leader arm for long sessions?

The SO-101 leader uses three gear ratios across its six joints: 1/191 on base and elbow, 1/345 on the shoulder lift, 1/147 on the three wrist and gripper joints, so it holds its own weight while still moving with little force. On the SO-100 you remove the gears from all six leader motors, so only the position encoder is used and friction drops. Both target the same problem: how much force your hand supplies for an hour.

I recorded 60 episodes and 8 of them are bad. Do I retrain or re-record?

Neither immediately. Delete them with lerobot-edit-dataset delete_episodes, writing to a new repo id so the original survives. Curating an existing dataset bought a 5 to 10 percent improvement on RoboMimic tasks in the DemInf work, which is cheaper than another session and much cheaper than training on data you know is wrong.

Sources

Sources

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started