esc

↑↓ move↵ run

Vyom Aggarwal · Student researcher MIT CSAIL · UC Santa Cruz AIEA Lab Open to internships

Vyom Aggarwal. Where curiosity meets precision.

Spacecraft dynamics, navigation and the uncertainty in it, and control that has to hold after something fails.

  • 15 · Sophomore · Class of 2029
  • Two labs · MIT CSAIL · UC Santa Cruz

Student researcher across two labs, MIT CSAIL and the AIEA Lab at UC Santa Cruz. Aiming at aerospace.

[01] Manifesto

Fig. 00 · Instrument → result

I'm a sophomore at River Islands High School, dual-enrolled at San Joaquin Delta College, doing student research in two labs. Aerospace is the field I'm aiming at, and I've chosen the work that field runs on: spacecraft dynamics, navigation and the uncertainty in it, fault-tolerant control, and the simulation and mathematics that have to hold underneath all three.

The range is deliberate, not scattered. Spacecraft dynamics and camera uncertainty, navigation, astronomy, climate data, language-model evaluation — different subjects, one habit underneath: build the instrument before the result, and know what a number is worth before quoting it. That habit is the whole of the two write-ups below, and it is why I can tell you what each of those figures does not establish.

I'm looking for an aerospace engineering internship — guidance, navigation and control, dynamics, simulation, or flight software — where I can be handed a scoped piece of a real problem and be held to the team's standard on it.

[02] Selected research

Field reports · each with its repository

Selected work, built instrument-first.

Each one built and checked its instrument before it quoted a result, because a number you cannot defend is worse than no number at all.

UC Santa Cruz · AIEA LabPyBullet · PPO · RLS

Fault-tolerant control

Exploring how a simulated quadruped can remain capable after an actuator failure.

Adapter built · correction channel under test

  1. 01Nominal
  2. 02Fault
  3. 03Correction

Trained on a robot that never breaks: twelve joints in PyBullet, PPO across ten seeds, and all ten converged to a usable gait.

At step 200 something fails. Here it is joint_lock, one of five fault families: three corrupt what the robot can do, two what it knows.

A twelve-number residual corrects around the fault without retraining the policy. It is built; its evaluation under faults has not been run yet.

Fig. 01 · Quadruped, a schematic of the mechanismLive

Not a replay of a trial: the measured figures are in the write-up. The robot is a stand-in in Laikago proportions, since the model the research trains on is not cleared for redistribution.

Spacecraft dynamicsPython · JavaScript · Dormand–Prince

Oberth Efficiency Atlas

How much of the Oberth benefit survives a real, finite burn? A flyby simulator across six bodies and five engine classes, with a compact test for when the textbook model holds.

Analysis frozen · novelty claims provisional

  1. 01Π = 1
  2. 02Π = 10
  3. 03Π = 100

Π = 1: the burn lasts about one periapsis timescale. It keeps η = 0.982 of the impulsive Oberth bonus and loses about 1% of its Δv.

Π = 10: the same Δv, spread over a burn ten times longer. η falls to 0.636, and 20.9% of the Δv is lost.

Π = 100: η falls to 0.192. Across all 1,143 families in the sweep, half the bonus is gone at Π between 8.4 and 40.

Fig. 02 · One flyby, flown by the atlas's simulatorLive

The path, the burn and η are the vendored simulator's output for v∞ = 0.45 v_esc, Δv = 0.1 v_p, Δv/c = 0.3, prograde, centred on periapsis. The model treats the planet as a point mass; it is drawn to scale only so there is something to see.

Both projects are shown in full below.

Project A · UC Santa Cruz AIEA Lab

Fault Recovery in RL Locomotion Through Online Residual Adaptation

Can a small correction module, updated during execution, restore a quadruped's gait after a hardware fault without retraining its underlying policy?

01 / 06

Premise

01 — Premise

Most policies are trained on robots that never break.

In the real world motors weaken, joints seize, and sensors start reporting values that aren't true. A locomotion policy trained only under ideal conditions has never once been shown what failure feels like — so it has no response to it.

02 — Apparatus

A quadruped designed to fail on purpose.

Twelve revolute joints in PyBullet, physics at 240 Hz stepped down to 60 Hz control. PPO trained across ten seeds at 1.5M timesteps — all ten converged to a usable gait, so every one of them is in the experiment.

34-dim observation12-dim action0.5 m/s target~8.4 h laptop CPU

Training reliability

Seeds attempted
10 @ 1.5M
Converged
10 / 10 · 100%
Excluded
None
Commanded
0.500 m/s
Wall clock
~8.4 h

Every seed reached a usable gait on this run, so none were held out and all ten are aggregated above — the convergence rate is a reported result either way, since it characterises how reliably this setup produces a usable policy.

03 — Injection

At step 200, something fails.

Five fault families on a matched seed set, so every fault type is compared against identical initial conditions. Three corrupt the physics — what the robot can do. Two corrupt the observations — what the robot knows.

torque_limitjoint_lockactuation_delaysensor_dropoutsensor_noise

04 — Method

Correct around the fault, don't retrain through it.

A twelve-number residual sits between the frozen base policy and the actuators. It integrates velocity-tracking error and spreads the correction across joints through an influence matrix measured on the healthy robot — no gradients, no network, no fault detector. The ablation is fixed versus re-identified online by recursive least squares: does learning the damaged dynamics buy anything over correcting with a model of the undamaged ones?

Built, with the influence matrix fit on all ten seeds. Its first test was a negative result.

First probe · seed 0

Forward-column agreement
cos 0.29
Lateral · yaw agreement
0.77 · 0.75
Best forward change, offset
≈ 0.055 m/s
Settled deficit, torque_limit
0.106 m/s
Settled deficit, joint_lock
0.099 m/s
Settled deficit, delay (5)
0.197 m/s

Independent halves of the fit disagreed about how joint offsets move forward speed. Holding one offset for a whole episode showed why: the change saturates near 0.055 m/s however much is asked for, and the same holds on a damaged robot. The base policy tracks velocity in closed loop, so it cancels a posture offset. That is authority, not noise — more data would not fix it. The correction has to act on gait amplitude instead; that probe is written and not yet run.

05 — Measurement

First, build an instrument worth trusting.

The original recovery criterion latched onto the first instantaneous velocity crossing and scored ~100% recovery on every fault — including 100% recovery alongside a 36.5% fall rate, which cannot both be true. It was rebuilt: velocity smoothed over a 30-step causal window, degradation has to be observed before recovery can be, the speed must hold for 30 consecutive steps, and a trial that falls is never scored as recovered.

Every recovery number predating that change was discarded.

Revised again on 22 September: degradation and recovery are now judged on 2-second windows, about six strides, and the lasting deficit is recorded separately from the worst transient dip. The Baseline A table predates that revision and is due a re-run.

Build status

  • Fault-injectable environment
  • PPO base policy · 10 seeds
  • Recovery criterion rebuilt
  • Baseline A evaluation
  • Across-seed aggregation
  • Residual adapter · fixed and RLS modes
  • Influence matrix · 10 seeds
  • Offset authority probe · negative
  • Settled deficit · seed 0 only
  • Severity sweep · seed 0 only
  • Gait-amplitude probe · written, not run
  • Baseline A re-run · 2 s criterion
  • H3 held-out fault split
  • Adapter evaluated under faults
  • Baseline B · full retraining

06 — Finding

The faults separate cleanly.

Unadapted recovery runs from 1.2% on actuation_delay to 82.3% on sensor_noise. Every actuation-side fault is less recoverable than both sensor-side faults, with no overlap — which makes the physics/sensor distinction a measured property of the system rather than a labelling convention, and a defensible axis for the H3 generalization split.

Real headroom for an adaptation method to demonstrate an effect.

Baseline A · no adaptation · 10 seeds × 100 trials · ± is spread across seeds, shown where the aggregation reports one · scored before the 22 September criterion revision
Fault (severity) Degraded Vel. drop Recovery Falls Recovery time
actuation_delay (10 steps)100.0%98.5%1.2% ± 1.478.5% ± 12.22.340 s ± 0.617
torque_limit (0.2×)93.7%57.4%43.1% ± 8.431.1% ± 11.11.679 s ± 0.340
joint_lock94.9%49.8%53.7% ± 8.24.2% ± 8.21.896 s ± 0.180
sensor_dropout83.9%31.7%79.6% ± 7.52.6% ± 4.61.729 s ± 0.146
sensor_noise (σ 0.3)84.7%29.3%82.3% ± 8.22.0% ± 4.61.622 s ± 0.141

Recovery is conditional on degradation — of the trials where the fault measurably slowed the robot, the fraction that returned to pre-fault speed and held it. Trials the fault never affected are counted under Degraded rather than scored as recoveries. torque_limit and joint_lock are the highest-power test cases: recovery sits mid-range at 43.1% and 53.7%, so an adaptation method has room to move it without running into a floor or a ceiling. actuation_delay is the severe end — it topples the robot in 78.5% of trials and almost never recovers.

Per-seed recovery range

actuation_delay
0 – 4%
torque_limit
32 – 60%
joint_lock
41 – 68%
sensor_dropout
68 – 88%
sensor_noise
64 – 94%

actuation_delay is narrow only because it sits on the floor — every seed fails it. The other four spread 20 to 30 points, none of them wide enough to trip the 40-point flag, so no fault is strongly seed-dependent on this run.

Repository · reproducible from a clean clone github.com/vyom-aggarwal/fault-recovery-quadruped-rl

Project B · Spacecraft dynamics

Oberth Efficiency Atlas

A real burn is not instantaneous, so it retains only part of the textbook Oberth benefit. This project measures how much across six bodies and five engine classes, then tests whether one dimensionless number organizes the result.

Π 10.0

keeps 53.2% of the impulsive Oberth bonus · loss 12.7% of Δv

The Oberth effect means that the same Δv adds more energy when it is spent deep in a gravity well, at high speed. Mission design often treats that burn as instantaneous at periapsis. This project measures the correction. η is the share of the impulsive Oberth bonus — the gain in excess speed beyond Δv itself — retained by a real burn, and Π compares the burn duration with the time required to travel one periapsis distance at periapsis speed.

The view above is a simulator, not a recording of a result. Moving the slider integrates the full flyby again with the same Δv distributed across a longer or shorter burn. The bright arc marks the burn and the blue line marks coast; dashed lines show the unpowered arrival and textbook impulsive departure. η and loss come directly from the simulator output.

Held fixed: arrival speed equal to the escape speed at periapsis, Δv = 0.1 vp, Δv/c = 0.3, prograde thrust centred on periapsis, a point-mass planet. An illustrative case, not a mission. Π is the burn's duration in units of rp/vp.

What the sweep shows.

01 — Short burns

Loss scales quadratically with Π.

For a prograde burn centred on periapsis, the loss is at most about Π²/96 of Δv, for Π up to about 1 and modest Δv/vp and mass ratio; larger values scale it by a closed-form factor. A burn shorter than rp/vp (about 16% of a circular orbit's period at rp) therefore loses roughly 1% of its Δv or less. Across the 20,860 prograde sweep runs with Π ≤ 1, none exceeds 1.010 times the closed-form bound for its own Δv/vp and Δv/c.

It is a leading-order bound, not a strict inequality, and it is probably close to a rule of thumb practitioners already use. It is reported as a clean statement for flybys, not as a discovery.

02 — Long burns

Half the bonus is gone at Π of about 8–40.

The energy-based efficiency falls to one half at Π between 8.4 and 40 across all 1,143 engine and arrival families in the sweep, with a median of 26. The sweep is dimensionless, so this holds at every body: a burn longer than 10–40 periapsis timescales forfeits about half the Oberth bonus.

Beyond the quadratic regime, slow arrivals (v∞/vesc ≲ 0.5) follow a Π−1/3 law until a crossover set by the arrival speed, then ln Π / Π; faster arrivals have no such middle regime. That is why the Sun, Jupiter and Saturn, with low arrival speeds, keep far more at a given Π.

03 — One number, nearly

Π alone does not collapse the data.

At small Π, log(1−η) scatters by 0.2–0.3 dex against Π. Against Π√C, with C the closed-form prefactor from the theory, it scatters by about 0.001 dex, some 200 times tighter. The scatter that remains after collapsing on Π alone is mostly the arrival speed: v∞/vesc explains 73–92% of it for prograde burns, and the mass ratio is irrelevant to the collapse.

04 — Real engines

Retiming the burn rarely changes much.

Optimising where the burn sits relative to periapsis recovers a median of 7×10−6 percentage points of η for chemical engines, 8×10−5 for nuclear thermal and 0.0068 for electric, over 5,895 valid mission samples. The largest single case is 4.1 points (nuclear thermal), and every gain above 0.1 points comes from starting the burn later than centred. A chemical burn centred on periapsis is within about 0.1 points of the optimum of the prograde family.

One solar burn, three engine classes.

Hibberd, Eubanks and Hein's solar Oberth burn to catch 3I/ATLAS spends 8.36 km/s at 3.2 solar radii. Flown with their motors, the impulsive model holds. Flown with other engines at the same geometry, it does not.

Same 8.36 km/s prograde burn, centred in time on perihelion at 3.2 R☉, bound arrival from 5.2 au · loss is the equivalent-Δv loss
Engine Burn time Π Δv lost Share of Δv
Solid stack, CASTOR 30B + STAR 48B210.8 s0.0330.099 m/s0.0012%
Nuclear thermal, Isp 900 s, a₀ 0.5 m/s²10,808 s (3.0 h)1.67233 m/s2.8%
SEP-class, Isp 6000 s, a₀ 3.3×10⁻³ m/s²2.38×10⁶ s (27.5 days)3686,344 m/s75.9%

The solid stack loses 0.099 m/s when the burn is centred in time and 0.090 m/s at the best timing, and stays under 0.2 m/s across every sensitivity tried (staging coast, arrival conic, thrust profile). The SEP row is hypothetical: that thruster could not operate at 3.2 R☉, and it is there to show the propulsion physics at fixed geometry. It keeps 24.1% of its Δv, against 23.0% from the large-Π law.

The loss reaches 1% of Δv at Π of about 1. For the solid stack that means cutting the thrust by about 30; a single nuclear-thermal stage crosses it at an initial acceleration of roughly 0.83–0.88 m/s².

Built so it can be checked.

Every number and figure comes from code in the repository, and figures carry the script and the git commit that made them in their metadata. The in-browser simulator above is the repository's own JavaScript port, checked against the Python one on ten cases to within 10−8 in η.

Verification

Tests passing
509
Fresh-clone rebuild
56 / 56 outputs identical
Sweep
135,720 runs · 0 errors
Sweep η error, 99th percentile
3.3×10⁻⁸
Rebuild, one command
43–79 min

Every run carries its own numerical error estimate, from an energy-balance residual integrated alongside the orbit.

The rebuild audit found problems before it passed. Committed outputs had gone stale after later code changes (Phase 1 files, one numbers file and the Phase 3 optimisation campaign), and an animation's first frame kept a marker from the still drawn before it. Each was regenerated or fixed, with a regression test for the bug, and none of the numbers quoted in the paper outline changed.

What is not yet established.

Tracked as carefully as the code, because the distinction is the point.

  • The novelty is provisional. The literature check was a web search, not a database search, and the 1966 paper by Robbins that the small-Π result is compared with could not be accessed, so claims that go beyond his scaling are provisional. The repository's claim register lists nine claims as provisional or assumption-dependent, each with what would settle it.
  • Point-mass gravity. Planet oblateness is neglected. A check on ten Jupiter and Saturn cases at 1.1 radii changes η by at most 0.0026, but absolute outgoing speeds shift by 21–28 m/s, so absolute results stay point-mass.
  • The planet-centred frame has limits. It stops being valid for a burn that starts outside the planet's sphere of influence. Those mission samples are masked, not given a number.
  • Representative presets, limited steering. The mission atlas uses representative presets, not hardware data, and only smooth pitch laws and one piecewise law were tested, so the optima hold within those families.
  • One earlier result is only partly reproduced. The model reproduces a large overestimate reported in a thesis by Confraria (2020) at a thrust-to-weight of 0.1, but not its exact size at higher thrust. The raw data behind that figure were not pursued.
  • The solar case is a simplified model. It is planar and point-mass, with constant thrust per motor, bracketed by two-level profiles. The unknown coast between stages is bracketed at 10 s and 60 s, and thermal limits are not modelled.

Not yet a paper. The repository holds a working outline, the figures and the numbers behind it, and has been in feature freeze since 6 October. The only planned follow-up is the check against Robbins (1966).

Repository · reproducible from a clean clone, with a self-contained explorer github.com/vyom-aggarwal/oberth-efficiency-atlas

[03] Method

The same four steps, both projects

The instrument first.
The result after.

  1. 01

    Instrument

    Build the measurement before trusting it. The fault-recovery criterion scored 100% recovery alongside a 36.5% fall rate, so it was rebuilt, and every recovery number from before was discarded.

  2. 02

    Reproduce

    From a clean clone, with one command. The Oberth atlas rebuilds 56 of 56 outputs identically, behind 509 passing tests.

  3. 03

    Quote

    Every figure traces to something real: a CSV, a numbers file, or a simulator run. Where a figure could only be invented, there is no figure.

  4. 04

    Bound

    Say what is not established. The atlas's claim register lists nine claims as provisional or assumption-dependent, each with what would settle it.

[04] Experience

Two labs, and the work around them.

  1. 01

    Massachusetts Institute of Technology

    Student Researcher Jul 2026 — Present

    Contributing to a next-generation AI platform designed to connect knowledge, surface insight, and support collaboration.

  2. 02

    University of California, Santa Cruz

    Student Researcher Jul 2026 — Present

    Applying machine learning to robot control and to recovery behavior following faults.

  3. 03

    Lumiere Education

    Research Fellow Jun 2026 — Sep 2026

    Completed research with Fernanda-Maria Lugo-Bolanos of Brown University.

  4. 04

    Apex STEM

    Founder Dec 2024 — Present

    Founded and leads an independent STEM initiative.

[04.1] Education

Two transcripts, one track

Education

High school · Aug 2025 — Jun 2029

River Islands High School

Diploma candidate · Class of 2029

Currently a sophomore with a 4.86 weighted GPA. Coursework includes AP Computer Science Principles, STEM Leadership, and AP Psychology.

4.86GPA · weighted

Dual enrollment · Jun 2025 — May 2029

San Joaquin Delta College

A.S. candidate · Early College Pathway

Early College Pathway program with a 4.0 unweighted GPA. Current coursework includes CS11, POLS C1000, and PSYC C1000.

4.0GPA · unweighted

[05] Recognition

Math · computing · engineering

Recognition and competition.

  • 1st

    MATHCOUNTS

    1st place

    Took first place at the MATHCOUNTS competition.

  • Top~14%

    AIME Qualifier

    Top ~14%

    Placed among roughly the top 14% of AMC 12 competitors.

  • WinnerCA-13

    Congressional App Challenge

    Winner · CA-13

    Built LifeLine, an app for people affected by natural disasters.

  • Top25%

    Stanford Math Tournament

    Honorable mention

    Placed in the top 25% of competitors.

  • Top20%

    Berkeley Math Tournament

    Distinguished honor roll

    Placed in the top 20% of competitors.

  • Silver

    USACO Silver

    2026 · 2nd contest

    Achieved Silver division standing in the USA Computing Olympiad.