Jun 1 – Aug 31, 2026 · Honor Device Co., Ltd. · Summer internship
Honor Humanoid: Real-Robot RL for VLA
VLA Algorithm Engineer Intern at Honor. Built a human-in-the-loop real-robot SFT / RL pipeline for Honor's self-developed humanoid robot — smooth teleoperator takeover, an intervention-driven data pipeline, and a distributed Actor–Learner–Robot learning loop.
Working on Honor’s self-developed humanoid robot: teleoperation data collection, replay, training, and on-robot deployment, along with real-robot RL algorithm research for Vision-Language-Action (VLA) models on custom manipulation tasks.
Demos
On-robot inference under perturbations
Autonomous pick-and-place rollouts on the real robot while the object (left) and the target basket (right) are perturbed mid-episode — the policy re-tracks and completes the task. The hand never stops moving, and the policy never waits for the object to settle: what it learned is visual tracking and disturbance rejection, not a single pick-and-place trajectory.
Data design for robustness
Four categories of teleoperated demonstrations: standard demonstrations, perturbations during the pick phase, perturbations during the place phase, and recovery from failed-grasp states — designed so the policy learns to recover, not just to repeat.
Real-robot SFT: before vs. after
A task the offline-trained policy could not perform is learned on the robot through the real-robot learning loop — human takeover data flows back into training, and the takeover ratio drops as new checkpoints are dispatched.
1. End-to-end VLA pipeline
The Shanghai lab was set up from scratch after I joined: robot configuration, two teleoperation rigs (Pico VR and motion capture), training for the data-collection operators, and the training pipeline. The task is pick-and-place (bottle → basket) with a single fixed instruction.
On the robot, the place phase almost never fails — the policy keeps up even when the basket is dragged fast. Pick failures correlate with object position; this traced back to the data (fixed stance, no local motion during collection, so the model never builds a sense of distance), not to arm accuracy. Outcome: the lab gained an in-house “collect → fine-tune → validate on robot” iteration loop instead of relying on externally delivered models.
2. Offline data design
Why the four data categories. Categories ①–③ (standard, pick-phase perturbation, place-phase perturbation) teach the policy to track a moving object or container. Category ④ teaches it to recover: starting from the hovering pose right after a missed grasp, the demonstration lowers the hand, re-grasps and places. Without it, the policy often doesn’t realize the grasp failed — it lifts an empty hand, moves to the basket and “places” nothing. The four categories are roughly balanced; the robustness in the demo above comes from this data design, not from hyper-parameter tuning.
3. Human-takeover real-robot training infrastructure
3.1 Human takeover & intervention-driven data pipeline
A teleoperator takes over mid-episode and hands control back (3× speed, no audio).
Smooth human takeover. Learning on the real robot requires that a human can take over at any moment without the robot jumping. On takeover, the VLA command topic is re-routed to the teleoperation topic, and the controller outputs an increment on top of the last VLA action rather than the teleoperator’s absolute joint angles.
Intervention-driven data pipeline. Every episode is persisted, and the operator can only veto the success classifier downward, never promote a failure to a success; classifier decisions and false-positive/negative statistics are logged alongside. The buffer is a bounded numpy ring with success/failure buckets, soft-delete FIFO and weighted sampling (PER importance correction), and an HTTP review endpoint lets each episode be inspected before it reaches training. In another round, 127 of 138 collected episodes entered the buffer as successes (11 fully autonomous, 116 with takeover demonstrations).
3.2 Distributed real-robot learning loop
Reproduced the Hi-ORS rejection-sampling loop and ported it from π0 + a Dobot arm to GR00T N1.7 + a humanoid. Three machines run simultaneously.
3.3 Real-robot SFT results: a new task from ≈ 0% to 50%+ in ~140 episodes
When the policy stalls, the operator takes over via Pico; takeover data flows straight into the Learner, and the takeover ratio serves as a live metric. Scene 1 moves the bottle to the right, where the offline data is sparse. Scene 2 swaps the whole layout left–right (basket left, bottle right) — the exact opposite of all offline data — so the offline SFT baseline is ≈ 0%.
| Scene | Change vs. offline data | Episodes | Offline SFT | After real-robot SFT |
|---|---|---|---|---|
| 1 | Bottle on the right (sparse in offline data) | 20 | not measured | 55.0% |
| 2 | Basket left, bottle right (layout mirrored) | 12 | ≈ 0% | 50.0% |
Fully autonomous success rate. Why a frozen backbone can still learn the mirrored layout: the failure mode was not moving at all rather than moving the wrong way — visual understanding was intact, only the action mapping was missing.
4. Real-robot RL algorithms
4.1 RECAP-style advantage-conditioned training
Rejection sampling is a binary degenerate case of advantage: keep every success, discard every failure. Ported the advantage labeling of π0.6 RECAP (as in RLinf) to GR00T N1.7 so that all data is used, with “good vs. bad” as an input condition rather than a filter — failure episodes become negative samples instead of waste.
Until V is ready, rule-based labels serve as a fallback: all success frames positive, autonomous frames of failures negative, and the 20 frames before every takeover overwritten as negative. The value network is trained separately and accepted only if Spearman ρ on held-out episodes (every 10th episode) exceeds 0.55: the dry run reached ρ = 0.647 (plateau 0.59) with loss 4.52 → 0.76, while a shuffled-label control stayed at an absolute ρ ≤ 0.26 and failed the criterion — so the criterion is meaningful. Agreement between V-based and rule-based labels was only 0.31, so the value network remains the bottleneck, and the real-robot A/B comparison was not completed.
4.2 RAPID: noise-space fast adaptation
RAPID (Rapid Adaptation from Physical Interventions via Diffusion-noise), in the spirit of DSRL: training a new checkpoint takes time, and until it lands the robot still can’t do the task. RAPID leaves the VLA weights frozen and only replaces the initial noise of flow matching, so a correction the human just made can be reused the next time a similar state appears. It was wired into on-robot inference in late August.
The audit was pre-registered: audit PASS; reversal CONDITIONAL (reconstruction error 0.232, within 0.10–0.30); spread downgraded to fragile after a re-run; transfer PASS (p ≈ 1e-21). Under these criteria the claim “retrieval wins at K < 10” was dropped — the experimental design rejected my own hypothesis — and the system converged on DSBC as the main path with memory retrieval as an optional front end. Next steps were distilling DSBC into the policy, soft-retiring memory entries, and connecting it to real-robot RL.
4.3 Extending to loco-manipulation
The humanoid autonomously walks to a counter and grasps a bottle — 7 real-robot clips, 5× speed, no audio; yellow floor marks are walking-path references.
The whole stack — takeover, the real-robot learning loop, RECAP and RAPID — carried over from tabletop pick-and-place to a task with walking without being rewritten.
| Loco-manipulation data | Value |
|---|---|
| Walking episodes collected | 507 episodes · 181K frames |
| Kept after 6 screening criteria | 326 episodes |
| Merged training set | 848 episodes · 306K frames (+71%) |
| Median path length per episode | 0.32 m → 3.2 m |
On metrics, honestly: the real-robot SFT stage has complete numbers (55% / 50%). After switching to the loco task, all components were implemented and wired in, but no metric-level improvement was achieved on it: the maturity of the whole-body hardware and locomotion stack at the time did not allow systematic real-robot evaluation.
5. Reproducing ROVE
Task. The humanoid stands in place — feet fixed, no walking — and picks up a phone with its hand: fine-grained manipulation where a small misalignment quickly ends in a human takeover.
ROVE (XPENG, arXiv:2606.17011) keeps RECAP’s advantage-conditioning skeleton (§4.1) and changes how human takeovers are scored. I reproduced it on top of the RECAP pipeline behind a single algorithm switch — the default RECAP path stays bit-identical, enforced by self-tests — and ran the paper’s Algorithm 1 as an offline loop: deploy and collect → stage-aware returns → value refresh → advantages and labels → conditional SFT. Only the first step needs the robot; the other four run as one command.
5.1 Stage-aware return
Under RECAP, an episode that a human rescued still counts as a success: its return rises by one every step up to 0, so the autonomous actions that caused the takeover look like steady progress. The only remedy is a fixed rule that labels the 20 frames before a takeover negative. ROVE splits such an episode into three segments — autonomous execution, adaptation (the human is still pulling the robot back on track) and recovery — and books a failure penalty C_fail at t_r, the end of adaptation. The autonomous segment that led to the takeover now scores at failure level, while recovery keeps its normal time-to-go return.
5.2 Optimistic value estimation (OVE)
Plain Monte-Carlo regression learns the average return. In states that often end in a takeover the average is already low, so the action that caused the takeover scores an advantage near zero and is never labelled negative. OVE fine-tunes the same scalar value head, after MC pre-training, with a 16-step TD target (from an EMA copy of the network) and an expectile loss with τ = 0.7, which penalizes under-estimates more than over-estimates. V then estimates what a state is worth when things go well: pre-takeover states are valued high, their actual return is low, and the negative advantage lands on the actions that caused the takeover. The advantage horizon is also 16 steps — one action chunk, the unit the label is attached to — and the top 40% of frames are labelled positive.
Each value checkpoint is gated by Spearman ρ on held-out episodes: the rank agreement between predicted V and the actual return (1 = same order). The MC stage must reach ρ ≥ 0.55 on the full pool; the OVE stage is judged on success episodes only (ρ ≥ 0.70), because OVE departs from the mean return on failure-bound states by design, so a lower full-pool ρ is expected rather than a regression.
5.3 Results
Autonomous success on the robot rose from 40% (base checkpoint, n = 77) to 52% (ROVE iter0, n = 192); human-assisted successes fell from 45% to 20% of episodes, while failures rose from 14% to 28%.
iter0 was trained with one pass of the offline loop: a 2,068-episode value pool (534K frames of demonstrations and real-robot rollouts, 207 episodes held out), labels at exactly 40.0% positive, and conditional SFT from the 80K-step base checkpoint for 8,000 steps (lr 1e-4) on one H20 GPU in 18 h 17 min.
On metrics, honestly: the three groups come from different days, operators and prompt sets, so this is an observation, not an A/B test — the interleaved evaluation against the base checkpoint and a RECAP arm is still pending. The iter0 collection also logged no takeover segments, so the next round lacks ROVE’s core signal until that logging is fixed.
6. Real-robot debugging
None of these could be found by reviewing code offline — they only surfaced during long real-robot runs, and each was located with a probe or a quantitative metric.
| Symptom | Probe / evidence | Root cause → fix |
|---|---|---|
| Generalization drifting after fine-tuning | Held-out loss 0.0048 → 0.0222 at step 2000 (×4.6); action-direction cosine 0.995 → 0.979 → 0.961 | Base-data mixer read mp4 as BGR while the frozen vision tower expects RGB — half the gradient budget learned noise; fixed one default. Anchors covered only 29 episodes (5.6%) → enlarge the base buffer |
| Buffer filled with false successes | Episodes latched “success” after 24 and 29 steps; learner trained on them for 1,000+ steps | Latch and reset shared one 0.5 threshold, no hysteresis → latch at p > 0.8 × 20 frames, reset at p ≤ 0.3 × 3 frames. A later un-reset object produced 2,536 junk steps over 11 episodes — just past the 2,500-step training threshold: audit frame by frame from the first session |
| Behavior differs between training, deployment and RL | Field-by-field comparison of observations across the three pipelines | Gripper DDS type, an upside-down camera, hand-position initialization, head-position indexing → 9-item fix list |
| Robot turns at episode start | Median yaw drift 31° | Stale yaw anchor + full re-anchoring every chunk → 3°/chunk rate limit with a 20° cap; 6 validation runs: anchoring error 0.0°, first-second turning ≤ 1.6° |
| Stale camera frames | 47% duplicate consecutive frames in 77 of 83 episodes; source 61 Hz, decode 54.9 Hz, effective ≈ 10.6 Hz under load | Added frame-freshness observability |
| “The model doesn't move” | Trainer client blocked in retries | Mismatched actor / learner ports. Lesson: every “the model doesn't move” is first a communication or observation check, then a weights check |