
Clean demonstrations teach one path and no way back. What the recovery-data papers measured, and how to record failure and correction on an SO-100 with LeRobot 0.6.1.
The gripper closes half a centimetre short. The cube stays on the table. And the policy carries on to the place position with nothing in its hand, because in every episode it was trained on, the cube was already between the fingers by that point in the trajectory. There is no frame anywhere in the dataset that shows an empty gripper at that height, so there is nothing for the model to imitate except moving on.
That is not a training bug. It is what the data asked for. A set of clean demonstrations describes one path through the task and says nothing about how to get back onto it. This article is about the other half of the data: recording failure and correction on purpose. What the published work measured, what it costs, and how to run it on an SO-100 with LeRobot datasets.
What you need to know
- •Ross and Bagnell (AISTATS 2010) showed that treating imitation as plain supervised learning gives a regret bound growing quadratically in the task horizon. The bound comes from the gap between the states the expert visited and the states the learner visits, and clean demonstrations do nothing to close it.
- •The fix is a change in what you record, not in the loss. RaC (2025) leaves the imitation objective untouched and only changes the data composition.
- •RaC reached 78.3 percent on a shirt-hanging task from 5 hours of data, against 75.0 percent for ALOHA Unleashed from roughly 89 hours of expert demonstrations.
- •No published ablation isolates recovery data on its own. The cleanest comparison is RaC's: same architecture, same collection budget, recover-then-correct data against batched demonstrations and against HG-DAgger collection, with a markedly steeper success-rate-versus-data-size slope for RaC.
- •Recovery and correction are two different segments. Recovery drives back to a state the policy has seen. Correction finishes the sub-task from there. Most intervention data collapses into correction only, which is the mistake.
- •More data of mixed quality is not a substitute: robomimic's multi-human sets had 300 demonstrations against 200 in the single-operator sets and scored lower.
- •On this platform the trainer minimums still apply: 50 episodes for ACT, GR00T N1.7, GR00T N1.5 and Pi0.5, 30 for SmolVLA. Recovery episodes count toward that number, they do not replace it.
A dataset of perfect runs is a dataset with a hole in it
The theory is older than every model on this site. Ross and Bagnell, in Efficient Reductions for Imitation Learning (AISTATS 2010), state that the supervised treatment of imitation leads to compounding errors and a regret bound that grows quadratically in the time horizon of the task. The follow-up, DAgger (Ross, Gordon and Bagnell, AISTATS 2011), is the standard answer: train on states the learner actually visits, not the ones the expert visited. Both papers are about distribution, not about model capacity. A bigger VLA trained on the same one-path data has the same hole in it.
The ALOHA and ACT authors put the manipulation version plainly: a small error in a predicted action produces a large difference in state, the arm drifts off its training distribution, and it lands in states from which recovery is hard. Action chunking shortens the effective horizon and reduces how fast that compounds. It does not add a recovery behaviour. If the wrist ends up a centimetre to the left of anything in the dataset, a chunked policy predicts a confident chunk from a state it has never seen, and predicts it 100 steps at a time.
| Segment type | Where it starts | Where it ends | What it teaches |
|---|---|---|---|
| Full demonstration | a valid start state | task complete | the nominal path, which is what you already have |
| Recovery segment | a failed or out-of-distribution state | back inside the demonstrated distribution | how to get from somewhere unknown to somewhere known |
| Correction segment | an in-distribution but awkward state | current sub-task complete | how to finish after something went wrong |
RaC (Hu et al., arXiv 2509.07953) ablates exactly this. Intervention data collected HG-DAgger style (Kelly et al., arXiv 1810.02890) skews heavily toward corrective frames: the operator takes over and simply drives the task forward from wherever the robot was. RaC imposes two rules. Rule 1, recover then correct: every takeover first rewinds the robot to an in-distribution state, then demonstrates the corrective segment. Rule 2, terminate after intervention: the episode ends as soon as the correction finishes, so later sub-tasks are not recorded under a mixture of policy states and human states. The paper reports that keeping Rule 2 gives better data scaling than letting the rollout continue. How rare recovery is in ordinary data: RaC analysed a 1 percent sub-sample of DROID and found only 3.68 percent of episodes contain at least one recovery segment, against 16.58 percent containing at least one correction.
What the published numbers actually say
| Work | Year | What was added to the data | Measured result |
|---|---|---|---|
| Ross and Bagnell, Efficient Reductions | 2010 | nothing, this is the bound | supervised imitation has regret growing quadratically in the horizon |
| DART (Laskey et al.) | 2017 | Gaussian noise injected into the human's control stream during demonstration | 62 percent average gain over behaviour cloning on grasping in clutter, on a Toyota HSR |
| robomimic (Mandlekar et al.) | 2021 | more demonstrations, mixed operator skill | multi-human sets (300 demos) scored below single-operator sets (200 demos) |
| Sirius (Liu et al.) | 2023 | human interventions during deployment, reweighted by approximated human trust | 8 percent higher policy success rate in simulation and 27 percent on real hardware than the compared methods |
| RACER (Dai et al.) | 2024 | scripted perturbations at expert keyframes, expert actions replayed as the correction, plus rich language annotations | 70.2 percent average over 18 RLBench tasks against 62.9 percent for the RVT baseline; 72.5 percent against 25.0 percent for RVT on 40 real-world Franka episodes |
| ADC (Huang et al.) | 2025 | a second person perturbing objects and instructions live while the operator teleoperates | models trained on 20 percent of the demonstration volume beat conventional full datasets |
| RaC (Hu et al.) | 2025 | recover-then-correct interventions on policy rollouts | shirt hanging 78.3 percent from 5 hours of data, about an order of magnitude less than the works it is compared against |
| pi-star 0.6 with RECAP (Physical Intelligence) | 2025 | demonstrations plus on-policy data plus teleoperated interventions | on the hardest tasks, throughput more than doubled and failure rate roughly halved |
The RaC comparison is worth reading carefully rather than as a headline. Their Table 1 lines up three systems on similar shirt-hanging setups: ALOHA Unleashed, a 217M diffusion transformer, about 89 hours of data (5345 demonstrations), 75.0 percent success. Seed GR-3, a 4B VLA, 116 hours, roughly 63.6 percent. RaC, a 368M flow-matching transformer, 5 hours of expert plus recovery plus correction data, 78.3 percent. The paper says itself that it approximates the ALOHA Unleashed hours at one minute per trajectory and reads the GR-3 number off a figure, that the setups are only similar rather than identical, and all three are bimanual ALOHA-class rigs. None of this is an SO-100 with two USB webcams. The mechanism transfers; the numbers do not.
RACER needs the same care, in the opposite direction. Its real-world table is often quoted as an ablation of failure augmentation, and it is not one: every RACER variant in that table is trained on failure-augmented data. The 62.5 percent row is RACER minus the failure-analysis part of the rich language annotation, against 72.5 percent for the full model, over 40 episodes on four tasks with a Franka and no seed variance reported. What the augmented data itself buys is only visible against the RVT baseline at 25.0 percent, and that comparison changes the language conditioning and the supervisor-actor structure at the same time. Useful evidence, but not a clean isolation of recovery data.
The easiest way to misread all of this is as permission to keep bad episodes. robomimic (Mandlekar et al., arXiv 2108.03298) measured the opposite: their multi-human datasets contain 100 more demonstrations than the single-operator ones (300 against 200) and policies trained on them scored lower, which the authors attribute to suboptimal and multimodal data. In their operator-quality split, plain behaviour cloning on the Can task went from 56.7 percent on the worst operator's data to 83.3 percent on the best operator's. A recovery episode is a deliberate, clean demonstration of a recovery. A fumbled episode you could not be bothered to re-record is just noise. Use the re-record key.

Three ways to get failure onto disk
1. Perturb the operator during the demonstration
DART (Laskey et al., arXiv 1703.09327, Disturbances for Augmenting Robot Trajectories) injects noise into the supervisor's control stream while the human demonstrates. The human is then forced to show the way back, and the resulting dataset contains recovery states without anyone having to plan them. The paper optimises the noise covariance so that the disturbance matches the error the trained policy is expected to make. On MuJoCo Humanoid, collecting with DART cost 5 percent of the supervisor's cumulative reward, while DAgger-driven rollouts during collection cost 80 percent. On the physical grasping-in-clutter task with four human supervisors, DART averaged a 62 percent improvement over behaviour cloning.
The ACT authors considered exactly this and rejected it: for fine manipulation, noise injected at collection time can directly cause task failure and degrades the dexterity of the teleoperation system itself. On an SO-100 doing a 2 cm insertion through a leader-follower setup, a jittering follower means the operator spends the episode fighting the arm, and you get a dataset of bad demonstrations rather than a dataset of recoveries. Perturb the scene, not the control stream.
2. Scripted disturbance episodes
RACER (Dai et al., arXiv 2409.14674) is the offline version of the same idea and it is the one that maps cleanly onto a hobby arm. Their pipeline perturbs the expert action at the keyframes that matter (aligning to an object, grasping it, releasing it) to induce a failure, then replays the original expert actions as the correction, so every perturbation yields a labelled recovery transition. They took 2250 RLBench expert episodes, perturbed each one five times, discarded the trajectories where the recovery did not succeed, and ended with 10,159 recovery episodes across 18 tasks. In their real-world Franka setup they collected 60 training demonstrations, 15 per task across four tasks, with three perturbations each.
- Nudge the target object 2 to 3 cm sideways after the reach has already started, then let the operator re-approach.
- Open the gripper one step early so the object drops, then pick it up again from wherever it landed.
- Start an episode from a pose the nominal set never begins in: gripper already low, wrist rotated, object behind the arm.
- Let a grasp slip on purpose and re-grasp without resetting the scene.
- Put a second object in the way mid-episode so the arm has to push it aside first.
- Drive the arm 3 cm past the correct approach and then correct back, which is the cheapest recovery segment there is.
The point of a scripted list is repeatability. If you can name the disturbance, you can record ten of them, and you can tell afterwards whether the checkpoint handles that specific one. ADC (Huang et al., arXiv 2503.11646) scales the same idea with a second person: while the teleoperator drives, an adversarial operator moves objects, changes conditions and rewrites the language instruction mid-episode. Their claim is that this compresses many failure-recovery behaviours into few episodes, and that models trained on 20 percent of the demonstration volume beat conventional full-volume datasets.
3. Intervene on a rollout
This is the on-policy version and it needs a trained checkpoint first, so it cannot be round zero. LeRobot 0.6.x ships it as a rollout strategy. The documented loop is: watch the policy run, trigger the pause input when failure looks imminent (the policy stops, the teleoperator moves to match the robot's position, and no frames are recorded during the pause), take over and teleoperate the recovery, then the correction, then hand control back. The docs name RaC's recover-then-correct decomposition as the protocol the dagger strategy follows, so Rule 1 is built in. Rule 2 is not: the documented loop resumes the same episode from the current state and lets you intervene again, which is exactly what RaC terminates early to avoid. If you want Rule 2 you end the episode yourself after the correction.
# LeRobot 0.6.1 (published on PyPI 2026-08-03). The HIL docs default to
# bi_openarm hardware; so_follower + so_leader are registered and CLI-selectable.
lerobot-rollout \
--strategy.type=dagger \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower_arm \
--robot.cameras='{ top: {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=so_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_leader_arm \
--policy.path=outputs/train/act_so100/checkpoints/last/pretrained_model \
--dataset.repo_id=${HF_USER}/so100_recovery_round1 \
--dataset.single_task="Put the red cube in the bowl" \
--dataset.fps=30 \
--strategy.num_episodes=30In LeRobot 0.5.1 (April 2026) there is no lerobot-rollout; policy evaluation ran through lerobot-record with a policy path. lerobot-rollout and its strategies (base, sentry, highlight, dagger, episodic) arrived with 0.6.x. Check pip show lerobot before copying commands from any tutorial, including this one. Everything here describes 0.6.1.
- 1Record the nominal set first
You cannot record a recovery from a failure you have not seen yet. Record the clean demonstrations, keep the cameras fixed, keep the task string identical across every episode.
bashlerobot-record \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower_arm \ --robot.cameras='{ top: {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}/so100_cube_nominal \ --dataset.num_episodes=50 \ --dataset.single_task="Put the red cube in the bowl" \ --display_data=true - 2Record the disturbance episodes into a separate repo id
Same task string, same cameras, different repo id. Separate ids keep the experiment reversible: if the recovery set makes things worse, you can retrain without it instead of hunting for episode indices.
bashlerobot-record \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower_arm \ --robot.cameras='{ top: {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}/so100_cube_recovery \ --dataset.num_episodes=20 \ --dataset.single_task="Put the red cube in the bowl" \ --dataset.episode_time_s=60 \ --dataset.reset_time_s=30 - 3Use the re-record key without mercy
Right Arrow or
nearly-stops the current episode (or the reset phase) and moves to the next. Left Arrow orrcancels the current episode and re-records it. Escape orqstops the session, encodes the videos and uploads the dataset. If a disturbance episode turned into a genuine mess rather than a clean recovery, press Left Arrow. The robomimic result is the reason. These are the documented bindings forlerobot-record; the rollout script prints its own controls, and the docs tell you to trust those rather than any tutorial. - 4Train round zero
Train the first checkpoint on the nominal set alone, so you have a baseline failure mode to aim the next round at.
bashlerobot-train \ --dataset.repo_id=${HF_USER}/so100_cube_nominal \ --policy.type=act \ --output_dir=outputs/train/act_so100 \ --job_name=act_so100_r0 \ --policy.device=cuda \ --steps=20000 - 5Roll out, intervene, retrain on the combination
Run the dagger strategy against that checkpoint, then fine-tune from the previous checkpoint rather than from scratch, which is what the LeRobot HIL page does between rounds and what RaC does between rounds. Note the flag:
--policy.pathloads a policy for a rollout,--policy.pretrained_pathis what the fine-tuning example passes to the trainer.bashlerobot-train \ --dataset.repo_id=${HF_USER}/so100_recovery_round1 \ --policy.type=act \ --policy.pretrained_path=outputs/train/act_so100/checkpoints/last/pretrained_model \ --output_dir=outputs/train/act_so100_r1 \ --policy.device=cuda \ --steps=20000
When you resume a recording to add recovery episodes to an existing dataset, --dataset.num_episodes is the number of additional episodes, not the target total. Setting it to your intended total silently records far too many. Resuming also requires --dataset.root="local_path", and it will not work without it. The other half of the same trap: do not prune episodes by deleting files under ~/.cache/huggingface/lerobot/{repo-id}. LeRobot ships lerobot-edit-dataset --operation.type delete_episodes --operation.episode_indices "[0, 2, 5]" for exactly this, and passing --new_repo_id keeps the original intact. The same tool merges your nominal and recovery sets with --operation.type merge. See the dataset docs and dataset rejected as v3.
How much, and when to stop
There is no published episode count for an SO-100 doing your task, and anyone who gives you one is guessing. What the literature does give you is a protocol shape: collect a round-zero budget of full demonstrations, train, look at where the rollout leaves the demonstrated path, then spend the next budget on that specific failure. RaC formalises this as alternating rounds of intervention and retraining against a fixed data-collection budget, and reports a steeper success-rate-versus-data-size slope than either batched demonstration collection or HG-DAgger style collection.
| Round | What you record | Trainer minimum that still applies | What to check before the next round |
|---|---|---|---|
| 0 | nominal demonstrations only | 50 episodes for ACT, GR00T N1.7, GR00T N1.5, Pi0.5; 30 for SmolVLA | where the rollout first leaves the demonstrated path, and whether it is the same place every time |
| 1 | scripted disturbance episodes aimed at that one failure | unchanged; a recovery episode counts as an episode | whether the arm now attempts a second try at all, rather than whether it succeeds |
| 2 | intervention data on the round-1 checkpoint | unchanged | whether your interventions still contain recovery, or have quietly become correction only |
| 3 and after | repeat against whatever fails now | unchanged | stop when the failure mode changes every round instead of repeating |
- Costs nothing at training time. RaC changed only the data composition and left the imitation objective alone, so no new loss, no new hyperparameters.
- Where it has been isolated, the effect is on the data and not on the model: RaC beats both batched demonstration collection and HG-DAgger collection at the same budget, with the same architecture and an unchanged imitation objective.
- It is cheap per unit of value. ADC reports beating full conventional datasets with 20 percent of the demonstration volume.
- It targets a failure you can name, instead of buying another hundred nominal episodes and hoping the distribution widens.
- Recovery behaviour shows up at test time as retries, which is what lets a long-horizon task finish at all. RaC found the number of recovery attempts in a rollout correlates linearly with success.
- The intervention variant needs a trained policy first, so round zero of plain demonstrations is unavoidable.
- Noise injection during teleoperation degrades fine manipulation. The ALOHA authors say so directly, so DART's mechanism does not port to a precise SO-100 task unchanged.
- Mixed-quality data measurably hurts (robomimic), so one lazy recovery episode is worse than none.
- Every published number comes from bimanual ALOHA-class hardware, a Franka, RLBench or MuJoCo. Nothing here has been measured on a 110 to 150 EUR five-joint arm, and the real-world sample sizes are small: RaC evaluates 60 trials per policy, RACER's real-world table is 40 episodes with no seed variance reported.
- It costs operator attention. Making the same failure happen on purpose, twenty times, is more tiring than doing the task correctly.
- Nothing in the toolchain labels recovery frames for you. You have to keep track of which episodes are which yourself.
Two ways to run this
Everything above runs from one pip install and your own hardware. You supply the arm, the two cameras, the USB ports and a GPU. LeRobot 0.6.1 gives you recording, training and the human-in-the-loop rollout strategies in the same package.
pip install lerobot
# find the serial ports for follower and leader
lerobot-find-port
# check the cameras and dump one test frame per device
lerobot-find-cameras
# confirm the exact version you are reading docs for
pip show lerobot | head -2- You own the failure taxonomy. Write the disturbance list down before the session, or you will record twenty variations of the same nudge.
- You own the GPU. ACT and SmolVLA fit on a 24 GB card; GR00T N1.7 and Pi0.5 want an 80 GB A100 or H100 for fine-tuning.
- You own the merge. Keep nominal and recovery data in separate repo ids and combine them with
lerobot-edit-dataset --operation.type merge; that keeps the experiment reversible if the recovery set makes things worse. - Reproducibility is uneven: lerobot's default seed is 1000, and you can set it, but the GR00T fine-tuning entry point (launch_finetune.py, a tyro CLI) exposes no seed at all.
- The docs' own recording advice still applies to disturbance episodes: at least 50 episodes, spread across starting positions, cameras fixed for the whole set.
The platform covers the recording and the training legs of the same loop. The desktop client records LeRobot-format datasets (episodes, camera streams, joint states) straight out of a teleoperation session, so a disturbance episode is recorded through exactly the same path as a nominal one. Datasets can also come from a Hugging Face repo id, from your own machine, or from the public dataset directory. The training form picks model, dataset and hyperparameters, rents a GPU on a spot market by required VRAM, and writes checkpoints to object storage.
| Tier | Models | Typical run | Price per hour | Cost per round |
|---|---|---|---|---|
| A100 80 GB or H100 80 GB | GR00T N1.7, GR00T N1.5, Pi0.5 | 3 to 6 hours | 1.20 to 2.00 USD | about 4 to 12 USD |
| RTX 4090 or any 24 GB card | SmolVLA, ACT | 2 to 5 hours | 0.30 to 0.60 USD | about 1 to 3 USD |
That per-round figure is the number that matters here, because a correction loop is several runs and not one. Four rounds of ACT retraining is 4 to 12 USD; four rounds of GR00T N1.7 is 16 to 48 USD. For inference, /api/inference/pod auto-provisions a pod that serves the policy and the local robot client talks to that endpoint; pods carry an idle watchdog and destroy themselves after an idle period, so an abandoned round does not bill quietly. The same operations are available from the CLI and from the MCP server, which is the practical way to script a round: record, train, roll out, repeat.
There is no one-click recovery recorder and no automatic detector that tells you which frames are recovery frames. The protocol above is yours to run at the table. What the platform removes is the GPU procurement, the trainer plumbing and the serving pod, not the operator discipline. If you do not own an arm yet, /live streams a physical one with no signup and /try lists the three ways to start.

What recording recovery does not fix
Recovery is reactive behaviour, which makes it the first thing that inference latency destroys. The control loop on this platform runs from 20 ms per action step for ACT to 485 ms for Pi0.5, with GR00T N1.7 at 152 ms and SmolVLA at 245 ms. Add public-internet round trips on top and a policy that would have caught a slipping cube instead notices it two chunks later. Remote inference is workable for slow pick-and-place and not for fast reactive motion. If your recovery behaviour needs to happen within 200 ms of the disturbance, inference has to sit next to the servos.
- A LeRobot v3.0 dataset crashes the GR00T loader and has to be converted down to v2.1 first. Your recovery episodes are recorded in whatever version your client writes, so check before the round starts, not after (dataset rejected as v3).
- GR00T runs are not bit-for-bit reproducible because the fine-tuning entry point exposes no seed, so a round-to-round comparison on GR00T carries seed noise you cannot remove.
- Five joints is five joints. If the recovery physically requires a wrist roll the arm does not have, no amount of data creates it (degrees of freedom).
- If the policy works on your table and nowhere else, that is a generalisation problem and recovery data is the wrong tool (policy only works in one setup).
- If the loss falls to nothing and the arm does not move, stop and look there first (loss falls, policy does nothing).
- A policy that stalls mid-motion may be modelling pauses in your demonstrations rather than lacking recovery data. The ACT authors identify pauses as a temporally correlated confounder that single-step policies handle badly (policy freezes mid-motion).
Grabbing a torque-enabled arm and shoving it is not a disturbance protocol, it is a way to strip a gearbox. Move the target object, change the start pose before the episode begins, or drive the deviation through the leader arm. And the standing hardware rule for these arms: the SO-100 and SO-101 run Feetech STS3215 bus servos on a 7.4 V rail. Feeding them 12 V destroys them, and a dead servo mid-session ends the round (servo not responding).

The protocol, compressed
- Record the nominal set to the trainer's minimum and no further. Fifty episodes for ACT, GR00T or Pi0.5, thirty for SmolVLA.
- Train round zero and watch twenty rollouts without touching anything. Write down where the arm leaves the path.
- Write a disturbance list of three to six named perturbations that produce that state.
- Record disturbance episodes into their own repo id, one perturbation type at a time, re-recording anything that turns into a mess.
- For every intervention: recover first, correct second, then end the episode. Do not let the rollout run on after a takeover.
- Retrain from the previous checkpoint on the combined data rather than from scratch.
- Evaluate against the same twenty starting conditions. Count retry attempts, not just successes.
- Stop when the failure mode changes each round rather than repeating. That is the signal that the hole is filled and something else is now the bottleneck.
Further reading on this site: how to collect high-quality VLA training data covers the nominal set this protocol sits on top of, the SO-100 complete guide covers the hardware and calibration, and the VLA overview covers what the pretrained models bring before you fine-tune them. If you want to see which architectures have been measured against each other, the arena lists 85 VLA models with 332 benchmark results, each value linked to its paper or model card.
Name the failure before you record the recovery
The failure-mode pages take the common ways an SO-100 policy comes apart one at a time, each with the check that separates it from the others. Recovery data fixes exactly one of them, and it is worth knowing whether yours is that one.
Open the fix indexHow many recovery episodes do I need?▾
There is no published number for an SO-100 doing your task. What the literature gives you is a protocol: match the round-zero budget, then spend each following round on the one failure you can name. The platform minimums stay the same either way, 50 episodes for ACT, GR00T N1.7, GR00T N1.5 and Pi0.5 and 30 for SmolVLA, and recovery episodes count toward that total rather than replacing it.
Should recovery episodes live in the same dataset as the nominal ones?▾
Train on the combination, but record into separate repo ids. RaC and the LeRobot human-in-the-loop docs both fine-tune on the merged data. Keeping the ids separate while recording means you can retrain without the recovery set if it makes things worse. When you do want them in one dataset, use lerobot-edit-dataset with --operation.type merge rather than moving files around, and delete_episodes rather than deleting frames by hand.
Does action chunking already solve compounding error?▾
It reduces it, it does not remove the hole. Chunking shortens the effective horizon by predicting k steps at a time, which is why the ACT authors introduced it, and their ablation shows how much it matters: averaged over four settings, success went from 1 percent at k=1 to 44 percent at k=100, then tapered off for larger k as the policy loses reactivity. But a chunked policy in a state no demonstration ever contained still predicts confidently from that state, and now it commits a hundred steps to the prediction. Chunking and recovery data address different halves of the same problem.
Can I use DART-style noise injection on an SO-100?▾
The mechanism is sound and the measured gain is real, 62 percent over behaviour cloning on grasping in clutter. But the ACT authors report that noise injection at collection time causes outright task failure on fine manipulation and degrades the teleoperation itself. For a coarse pick-and-place it may be fine; for anything with millimetre tolerances, perturb the scene instead of the control stream.
Will a large pretrained VLA recover on its own?▾
Not reliably. pi-star 0.6 is a large pretrained VLA and its reported gains, roughly double the throughput and roughly half the failure rate on the hardest tasks, come from RECAP, which explicitly adds on-policy rollouts and teleoperated interventions on top of demonstrations. Pretraining supplies priors, not recovery behaviour for your specific failure.
Do I need a trained policy before I can record recovery data?▾
For the intervention loop, yes, because you are recording corrections to a specific checkpoint's mistakes, and lerobot-rollout takes a --policy.path. For scripted disturbance episodes, no: RACER's pipeline perturbs expert demonstrations offline and never queries a learner. Start with disturbance episodes if you have no checkpoint yet.
Sources
- Ross and Bagnell, Efficient Reductions for Imitation Learning (AISTATS 2010)
- Ross, Gordon and Bagnell, A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning (DAgger, AISTATS 2011)
- Laskey et al., DART: Noise Injection for Robust Imitation Learning (CoRL 2017)
- Kelly et al., HG-DAgger: Interactive Imitation Learning with Human Experts
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (robomimic, CoRL 2021)
- Liu et al., Robot Learning on the Job: Human-in-the-Loop Autonomy and Learning During Deployment (Sirius, RSS 2023)
- Zhao et al., Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ALOHA and ACT)
- Dai et al., RACER: Rich Language-Guided Failure Recovery Policies for Imitation Learning
- Huang et al., Adversarial Data Collection: Human-Collaborative Perturbations for Efficient and Robust Robotic Imitation Learning
- Hu et al., RaC: Robot Learning for Long-Horizon Tasks by Scaling Recovery and Correction
- Physical Intelligence, pi-star 0.6: a VLA That Learns From Experience (RECAP)
- LeRobot documentation, Human-In-the-Loop Data Collection
- LeRobot documentation, Imitation Learning on Real-World Robots
- lerobot on PyPI (0.6.1 published 2026-08-03, 0.5.1 published 2026-04-07)
- LeRobot documentation, Using Dataset Tools (lerobot-edit-dataset)
Sources
- Ross and Bagnell, Efficient Reductions for Imitation Learning (AISTATS 2010)
- Ross, Gordon and Bagnell, A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning (DAgger, AISTATS 2011)
- Laskey et al., DART: Noise Injection for Robust Imitation Learning (CoRL 2017)
- Kelly et al., HG-DAgger: Interactive Imitation Learning with Human Experts
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (robomimic, CoRL 2021)
- Liu et al., Robot Learning on the Job: Human-in-the-Loop Autonomy and Learning During Deployment (Sirius, RSS 2023)
- Zhao et al., Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ALOHA and ACT)
- Dai et al., RACER: Rich Language-Guided Failure Recovery Policies for Imitation Learning
- Huang et al., Adversarial Data Collection: Human-Collaborative Perturbations for Efficient and Robust Robotic Imitation Learning
- Hu et al., RaC: Robot Learning for Long-Horizon Tasks by Scaling Recovery and Correction
- Physical Intelligence, pi-star 0.6: a VLA That Learns From Experience (RECAP)
- LeRobot documentation, Human-In-the-Loop Data Collection
- LeRobot documentation, Imitation Learning on Real-World Robots
- lerobot on PyPI (0.6.1 published 2026-08-03, 0.5.1 published 2026-04-07)
- LeRobot documentation, Using Dataset Tools (lerobot-edit-dataset)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started