
A step-by-step account of one human-gated DAgger round on an SO-100 arm: run the policy and record it, take over when it goes wrong, file the run as a correction, compose a mixed dataset, and continue training from a checkpoint. Includes the keyboard and slider takeover path for people without a leader arm, and the four mistakes that make a round worthless.
Your policy runs. It reaches for the cube, closes the gripper a centimetre too early, and keeps going as if it had it. Nothing errors, and no amount of staring at the training loss explains it. The fix is not another 20 000 gradient steps on the same demonstrations. It is to put your hand back on the arm exactly where it goes wrong, record what you did instead, and train the next checkpoint on the old data plus that correction. That is a DAgger round, and this is how one runs on an SO-100 with a vision-language-action policy.
The theory is elsewhere: why dataset aggregation works at all మరియు what human gating changes about it. This is the operating manual, and it assumes a trained checkpoint, a working camera set, and an arm that moves. The six steps below are the loop as implemented on the DAgger page of this platform, but the sequence is the same from your own scripts.
One round in short
- •Run the trained policy and record it, with the task text of the run rather than a generic teleoperation label.
- •Take over the moment the behaviour goes wrong: a mirror handover with a leader arm, immediate and manual over keyboard or sliders without one.
- •Triage every run: file it as a correction, keep it as an evaluation episode, or discard it.
- •Compose the mix by hand - original demonstrations plus corrections, episodes chosen per source. Never train on corrections alone.
- •Continue training from the last checkpoint, and note which checkpoint produced which mix.
- •The number that says whether the round was worth anything is the intervention rate, not the training loss.
Why the second round is not just more data
Behaviour cloning trains on the states a human visited. At test time the policy visits the states it causes, and small action errors compound into states no demonstration covered. Ross, Gordon and Bagnell formalised that failure for AISTATS 2011 and answered it with an iterative algorithm that trains a stationary deterministic policy and, under their reduction, has to perform well under the state distribution it induces: run the current policy, have the expert label the states it actually reached, add those to the dataset, retrain, repeat. Kelly et al. made the query practical with HG-DAgger, where the human decides when to take control instead of labelling states without holding the controls; they report improved performance over both DAgger and behaviour cloning on a simulated and a real autonomous driving task. Human gating is what makes the loop tolerable on a desk arm - you only move your hands when something is going wrong.
Two consequences matter more in practice than the theory does. Corrections are not ordinary demonstrations: they concentrate at the bottleneck regions Mandlekar et al. describe, where a small deviation drops the policy into states the demonstrations never covered. And a dataset made only of those hard parts is a badly shaped dataset - Belkhale, Cui and Sadigh argue from the data side that state diversity is not always beneficial, and that action divergence and transition diversity together decide dataset quality. The mixed dataset is not a compromise, it is the point.
Freeze these before round one
A DAgger round compares a policy against itself across time. Anything you change between rounds that is not the dataset makes that comparison meaningless.
- Camera positions and mounts, wrist camera included. Loosen one clamp and you changed the observation distribution, not the policy.
- Exposure and white balance, if your capture stack lets you pin them. Auto-exposure drifting between rounds is a slow, invisible domain shift.
- Arm calibration and servo zero positions. If you must recalibrate, treat everything recorded before it as a separate dataset.
- The task text. Every VLA here conditions on it; rewording it mid-loop is a different task.
- Lighting, table surface, object set. A new object is a new experiment, not the next round.
- The recording frame rate. Comparing intervention rates across two sampling rasters produces differences that come from the raster.
Hsu et al. compared a hand-centric view against the usual third-person view and found the eye-in-hand perspective consistently improved training efficiency and out-of-distribution generalisation, despite seeing less of the scene. On a five-joint arm, gripper timing is usually what your corrections are fixing, and gripper timing is what the wrist view carries.
The round, end to end
- 1Run inference and record it
Start the run against the checkpoint you want to improve, then start the recording into the inference root. Recorded that way it inherits the run's own task text, which is what the policy was trained on, rather than the default teleoperation label. Without the recording you can watch the failure but not train on it.
bash# two calls, not one: the run, then its recording POST /inference/start # model_id, and hf_repo_id = the checkpoint to drive POST /recording/start # root=inference # root=inference also makes the recording inherit the run's task text - 2Take over when it goes wrong
Press Take over and choose the input mode: leader arm, keyboard or sliders. The runner pauses, you correct, you hand back. Frames recorded while you were driving are flagged as interventions automatically.
bashPOST /inference/takeover/start # input = leader | keyboard | sliders POST /inference/takeover/nudge # keyboard, relative delta per call POST /inference/takeover/set # sliders, absolute target POST /inference/takeover/stop # back to the policy - 3Triage the episodes
Decide per episode: file as correction, keep as evaluation, or discard. A run the policy completed without help is evaluation data.
- 4Sync the correction dataset
Corrections collect in a local dataset per policy and go to cloud storage through the automatic sync. Nothing is mixed in that you did not put there.
- 5Compose the mixed dataset
Combine the original dataset with the corrections, choosing episodes explicitly per source. The result is an ordinary dataset from that point on.
bashPOST /training/datasets/compose sources = [ original_dataset, korrekturen_<policy> ] episodes = explicit selection per source - 6Continue training from the checkpoint
Train the mix from the previous checkpoint rather than the base model. Note which checkpoint and which mix; without that pair the round is not reproducible.
bash# field on the training job base_checkpoint = s3://ay-robots/checkpoints/<run>/<checkpoint> # the platform passes it to the training pod as BASE_CKPT_S3
Step 2 in detail: the two ways to take over
నేత చేయితో
లో నేత-అనుసరణ mode the takeover is a handover between two arms that are not in the same pose. Pressing Take over pauses the runner and drives the leader onto the follower's current pose, so nothing jumps when torque transfers. If that alignment drive times out, you align the leader by hand and release only once the two are within five degrees. From then on you teleoperate normally and the action column records what you commanded.
Be honest about this path: the alignment drive and the torque handover are the least tested part of the loop on real hardware. Test the handover on a slow, harmless pose before you rely on it in a run you care about. A leader arm produces the smoothest corrections of the three modes, and also has the most that can go wrong mechanically.
Without a leader arm: keyboard and sliders
Most people reading this own one arm. That is enough. Choose keyboard or slider input at the moment you press Take over, and the takeover is immediate and manual - there is no second arm to align, so there is no alignment step. The follower holds its pose and waits for input.
| Input mode | How the arm moves | Per-call limit enforced by the server | Locked when |
|---|---|---|---|
| Leader arm | The mirror drives the follower from the leader's joint angles | No nudge or set calls in this mode; the mirror writes follower goals continuously | Never locked, and the default if no input mode is given - but it needs a second arm; without a leader id the takeover is refused |
| Keyboard | Relative nudge per key press, sent to the takeover nudge endpoint | Hard clamp at 2 degrees per joint, 4 degrees for the gripper | Rejected with 409 if the takeover was started in leader mode |
| Sliders | Absolute target pose, sent to the takeover set endpoint | At most 6 degrees of travel toward the target per call; the interface keeps sending about ten times a second | Rejected with 409 if the takeover was started in leader mode |
The clamps are enforced server-side, not in the interface, because a mistyped delta on a bus-servo arm is a collision. Keyboard corrections come out stepwise and slightly coarse; slider corrections are smoother, because the server walks toward the target while the interface keeps streaming. Either way the action column receives the full commanded pose vector and the intervention marking is identical to the leader path, so keyboard corrections land in the same dataset without a format difference.
Q / A joint 1 R / F joint 4
W / S joint 2 T / G joint 5
E / D joint 3 Z / X gripper
When to press the button
Early rather than late. A correction that starts after the gripper has closed on nothing teaches recovery from a failure the policy should not have entered, and recovery data is worth far less than avoidance data. Interrupt at the first moment you are confident the trajectory is wrong, correct through the difficult part, hand back as soon as the state is one the policy handled before. ThriftyDAgger automates that decision by gating interventions on novelty and estimated risk under a fixed human budget, but on a single arm with a human already watching, the human gate is cheaper and better calibrated than anything you will tune.
Doable with the open-source stack and a few scripts. What it costs is bookkeeping, and bookkeeping is where DAgger rounds die.
- Write frames from your own inference script into a LeRobot dataset, with the task string the policy was trained on.
- Pause the policy loop, switch the command source, and flag every frame you drive as an intervention. Without the flag, corrections look like ordinary demonstrations.
- Decide deliberately what happens to the transition frames between the policy releasing control and your first input.
- Keep corrections in their own dataset per policy, and track episode indices by hand so the mix can be reconstructed.
- Point the fine-tuning entry point at the previous checkpoint, and check in the log that it loaded those weights.
The same six steps exist as buttons. What is automated is what is easy to get wrong by hand: the per-frame intervention flag, the split between corrections and evaluations, and the record of which checkpoint produced which mix. Nothing enters a composed dataset that you did not select.
It does not decide for you. Which run counts as a correction, which episodes go into the mix, and when to stop remain judgement calls. The fields are documented under training, the input modes under teleoperation.
Step 3 in detail: triage decides the quality
After the run you have a recording with some frames marked as interventions. Three destinations exist, and the wrong one quietly poisons the next round.
- File as correction when the intervention was a genuine fix: the policy was heading somewhere wrong and your input showed the right thing from a state the policy itself produced.
- Keep as evaluation for clean autonomous runs and for runs you took over out of caution. Evaluation episodes are how you measure the next checkpoint, and they must never be trained on.
- Discard runs ruined by something unrelated - a dropped camera frame, a stalled servo, an object you knocked over. A messy correction is worse than no correction.
Between the policy releasing control and your first input, the arm holds still while the recorder keeps writing - a run of identical poses paired with slightly different images. Here those handover frames stay in the raw recording and out of the correction dataset. If you build the loop yourself, cut them deliberately: a policy trained on them learns to pause where it should act.
Step 5 in detail: composing the mix
Composition takes the original dataset plus the correction dataset and produces a new, ordinary LeRobot డేటాసెట్ that trains like any other. The important property is that the episode selection is explicit per source - nothing is blended in automatically. That sounds minor until the first time a policy behaves strangely and you have to reconstruct what it was trained on.
The open question is the ratio, and nobody has a number that transfers. What the literature does agree on is that corrections should count for more than their frame share. Mandlekar et al. retrain iteratively on the data their intervention system collects, so the policy learns to traverse the bottlenecks, and report that agents trained that way outperform agents trained on an equivalent number of samples from non-interventional demonstrators. Sirius goes further and re-weights training samples by approximated human trust, reporting an 8 percent gain in simulation and 27 percent on real hardware in policy success rate against the methods it compares with, at twice the convergence speed. None of the training entry points here expose a sample-weighting knob, so the crude substitute is to keep every correction episode while subsampling the original demonstrations - and to write down what you did.

Step 6 in detail: what continuing from a checkpoint really means
Training the mix from the base model works but throws away the previous round and costs a full run. Continuing from the previous checkpoint is faster and usually better. It is also more limited than the phrase suggests.
A weights-only checkpoint contains the parameters and nothing else. Loading it gives the next run a better starting point than the base model, but optimizer moments, learning-rate schedule position and data order all start from zero. Expect a loss spike at the beginning of the continued run, do not read it as a failure, and do not call the round a resume. It is a warm start.
| Policy | Size | GPU tier | Inference per action step | Dataset format | Episodes before it is worth trying |
|---|---|---|---|---|---|
| GR00T N1.7 | about 3 B, roughly 40 M trained during fine-tuning | A100 80 GB or H100 80 GB | about 152 ms | LeRobot v2.0 or v2.1 | 50 |
| GR00T N1.5 | about 3 B | A100 80 GB or H100 80 GB | about 165 ms | LeRobot v2.0 or v2.1 | 50 |
| Pi0.5 | about 3 B on a PaliGemma backbone | A100 80 GB or H100 80 GB | about 485 ms | LeRobot v3.0 | 50 |
| SmolVLA | about 450 M | RTX 4090 or any 24 GB card | about 245 ms | LeRobot v3.0 | 30 |
| ACT | about 80 M, trained from scratch | RTX 4090 or any 24 GB card | about 20 ms | LeRobot v3.0 | 50 |
Latency compounds inside a DAgger loop in a way it does not during a demo: at roughly 485 ms per action step you take over because the arm hesitated, not because it was wrong, and hesitation corrections are not useful training data. If you are iterating on data rather than chasing a final success rate, iterate on a fast model. Shukor et al. describe SmolVLA as designed to train on a single GPU and deploy on consumer GPUs or CPUs, with an asynchronous inference stack that decouples action prediction from execution to allow higher control rates - the property that keeps a takeover loop responsive.
The dataset formats are not interchangeable either. GR00T takes LeRobot v2.0 or v2.1, and the Isaac-GR00T repository describes its input as a flavour of the LeRobot v2 format with an added modality description file; the newer trainers here expect v3.0. A mix composed in the wrong version fails at load time rather than producing a bad policy - the better failure mode, still a wasted queue slot. The dataset documentation lists which format each trainer takes.
The loop, with the bookkeeping already done
Takeover with a leader arm, keyboard or sliders; per-frame intervention marking; filing runs as corrections or evaluations; composing a mixed dataset with an explicit episode selection per source; and continuing training from a checkpoint instead of the base model. What stays your decision is which run counts as a correction, what goes into the mix, and when the intervention rate has stopped falling.
See how the DAgger loop is wiredFour ways to waste a round
1. Training on the corrections alone
The most common failure and the most tempting shortcut. A correction-only dataset is almost entirely the difficult middle of the task, with approach and retreat missing; the policy gets better at the hard part and forgets how to arrive there. Aggregation is not an implementation detail of the method, it is the mechanism: the old data is what holds the rest of the behaviour in place while the corrections move one part of it.
2. Moving a camera between rounds
A camera that shifts two centimetres between rounds produces a policy worse than the one you started with, and a diagnosis that costs a day. Every VLA here conditions on images; joint state alone does not disambiguate where the object is. Photograph the setup before the first round and check that photograph before each later one.
3. Letting handover artefacts into training
Covered above, and on the list because it is invisible. The symptom is a policy that stalls for a fraction of a second exactly where the previous round's operator took over. It looks like hesitation; it is imitation.
4. Calling a warm start a resume
If you believe optimizer state carried over, the initial loss spike reads as a bug and you go hunting for corrupted data. If you know the optimizer started fresh, the spike is expected and you look at what comes after it. Same numbers, opposite conclusions.
Measuring the round
The metric for a human-gated loop is the intervention rate: frames recorded while you were in control, divided by total frames of the run. It is in the takeover status, and it is the only number that answers the question the round asked. Training loss falls whether or not the policy improved; success rate is binary and noisy at the sample sizes a desk arm produces. Intervention rate is continuous, measured on the states the policy itself caused, and it drops as the policy needs you less.
Compare it only across runs recorded under identical conditions. The full argument, and how to build an evaluation set that survives more than two rounds, is in the article on measuring a DAgger loop. Round one is realistically a feasibility test: you are checking that the takeover works on your hardware, that corrections land with their flags, and that the continued run loaded the checkpoint you named. Rounds two and three are where the rate should start moving. If it has not moved by round four, the problem is upstream of DAgger.
| Write down per round | Why it matters later |
|---|---|
| Checkpoint that was driven | Without it you cannot attribute an improvement to a mix |
| Input mode used for the takeover | Keyboard corrections are coarser than leader corrections, and it shows in the data |
| Number of runs and how each was triaged | Whether the round had enough corrections to matter |
| Intervention rate per run, and the mean | The progress metric of the loop |
| Exact episode selection per source | The only way to reproduce or undo a round |
| Warm start or fresh training | Explains the loss curve you will look at in a week |
If you do not have a checkpoint yet
The loop has no entry point without one. Record a first dataset, train a first policy, run it - recording, training మరియు చేసిన నీతి ఆ మార్గం కవర్ చేయండి. రెకార్డింగ్ క్లయింట్ ఉంది డౌన్లోడ్ పేజీపై, GPU దశ, ఘంటవారీ రేటు ధర పేజీపై, మరియు చేసిన ఆచరణీయ ఎపిసోడ్ SO-100 డేటా సంగ్రహణ గైడ్. చేసిన సవరణ ముందు: చేసిన సవరణ పద్ధతి, చేసిన చేసిన ఏదిఠ చీర చేసిన.
నేత చేయి లేకుండా DAgger లూప్ నిర్ణయ చేయవచ్చు?▾
హ్యాఁ. ఇన్పుట్ ఎంచుకోండి నియంత్రణ లిబరేషన్ సమయంలో: తక్షణ, నిర్వహణ, రెండవ ఆర్ములకు సంరేఖణ లేదు. కీబోర్డ్ చేసిన సంబంధిత నడియు సర్వర్ కఠిన 2 డిగ్రీలు జయింట్, 4 గ్రిప్పర్; స్లైడర్ చేసిన సంపూర్ణ లక్ష్య, సర్వర్ కదలుత 6 డిగ్రీల కాల్కు, ఇంటర్ఫేస్ నిరంతర సెకను 10 సమయ. చర్య, జోక్యం గుర్తు నేత ఒకటి, కీబోర్డ్ సవరణ డేటాసెట్ ఫార్మాట్ తేడా లేకుండా చేరుకుంటాయి.
సవరణ ఎన్ని ఒక రౌండ్ చేయుటకు?▾
ఏమీ సర్వత్రిక సంఖ్య కాదు, ఫ్రేమ్ ఎపిసోడ్ ఎక్కువ. చేసిన సవరణ కాదు నిర్వచన మిశ్రమ లేకపోయిన: 200 చేసిన ఎపిసోడ్ మరియు 3 సవరణ, ఏమీ కదలుత. చేసిన సవరణ సంచిత చేసిన ప్రారంభ ఆకృతి కంటే కంటే చేసిన చేయుటకు.
సవరణ మాత్రమే ఎందుకు సంఘటించిన?▾
ఎందుకంటే సవరణ చేసిన టాస్క్ మధ్య. చేసిన, సంరేఖణ, సంవరణ గుర్తించిన, నీతి చేసిన నిర్ణయ చేసిన చేసిన చేయుటకు చేసిన చేసిన చేయుటకు. చేసిన నిర్ణయం చేసిన, చెక్పాయింట్ కాదు ఎపిసోడ్ లేదా చేసిన లేదు.
చెక్పాయింట్ నుండి కొనసాగిపోవటం గత శిక్షణ నిర్ణయ చేసిన?▾
లేదు. చేసిన చెక్పాయింట్ నిర్ణయ చేసిన చెక్పాయింట్ నిర్ణయ చేసిన మరియు ఏమీ ఇతర: ఆప్టిమైజర్ సంఘటించిన, సమీకరణం-రేటు చేసిన, డేటా నిర్ణయ చేసిన సంఘటించిన. ఇది నెమ్మదిగా శిక్షణ, ఇపుడ లోపం స్పెక్ ఆశ్చర్య చేయుటకు కంటే లక్షణం. చేసిన చేసిన చేసిన, నీరు చేసిన చేసిన చేయుటకు వారం చేసిన.
జోక్యం రేటు కాదు చేయుటకు?▾
చేయుటకు చేసిన రౌండ్. ఫ్లాట్ రేటు సవరణ చేసిన తలపిస్తుంది. చేసిన చేసిన కారణాలు: చేసిన కెమెరా, సవరణ చేసిన చెక్పాయింట్ చేసిన చేసిన చేసిన చేయుటకు చేసిన చేసిన చేసిన.
ఏమీ చేసిన సమస్య నిర్ణయ చేసిన మరియు ఏమీ చేసిన ఒక క్లిక్. ఇంటర్యాక్టివ్ చేసిన నేర్పు చేసిన పరిశోధన ఏమీ ఎందుకంటే ఆ ప్రశ్న - జోక్యం, నిర్ణయం చేయుటకు, నిర్ణయం చేసిన బరువు, చేసిన డేటా చేయుటకు - ఏమీ చేసిన సమాధానాలు లేకుండా; సర్వేక్ష చేసిన ఏమీ గుర్తించిన. చేసిన ఇక్కడ నిర్ణయం చేసిన, పరిమితం నిల్వ, కొన్ని యూరో. చేసిన సెట్ అప్, జోక్యం చేసిన, ట్రీజ్ చేసిన, మిశ్రమ చేసిన, రెకార్డ్ జోక్యం రేటు ప్రతిసారి.
Sources
- Ross, Gordon, Bagnell (AISTATS 2011): A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning
- Kelly, Sidrane, Driggs-Campbell, Kochenderfer (2019): HG-DAgger - Interactive Imitation Learning with Human Experts
- Mandlekar et al. (2020): Human-in-the-Loop Imitation Learning using Remote Teleoperation
- Liu, Nasiriany, Zhang, Bao, Zhu (2022): Robot Learning on the Job - Human-in-the-Loop Autonomy and Learning During Deployment (Sirius)
- Hoque et al. (2021): ThriftyDAgger - Budget-Aware Novelty and Risk Gating for Interactive Imitation Learning
- Celemin et al. (2022): Interactive Imitation Learning in Robotics - A Survey
- Belkhale, Cui, Sadigh (2023): Data Quality in Imitation Learning
- Hsu et al. (2022): Vision-Based Manipulators Need to Also See from Their Hands
- Zhao et al. (2023): Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ACT / ALOHA)
- Black et al. (2024): Pi0 - A Vision-Language-Action Flow Model for General Robot Control
- Bjorck et al. (2025): GR00T N1 - An Open Foundation Model for Generalist Humanoid Robots
- Shukor et al. (2025): SmolVLA - A Vision-Language-Action Model for Affordable and Efficient Robotics
- LeRobot documentation (Hugging Face)
- NVIDIA Isaac-GR00T repository
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started