Fixed-wing world model (5.5k parameters)
A small learned world model of a fixed-wing plane: given the last half second of what the aircraft felt and did, it predicts how it will fly under any sequence of future commands (throttle, aileron, elevator, rudder). It knows nothing about tasks. A sampling planner (MPPI) imagines a few hundred two-second futures with it every 50 ms, and each mission (orbit, waypoints, formation with quadrotors) is written as costs on those futures.
- 5,526 learned parameters. A 6-DoF flight-dynamics backbone (Beard & McLain; Aerosonde coefficients on a 1.5 kg, 1.4 m trainer) does the physics. A GRU (24) reads 0.5 s of history and infers what the nominal physics cannot know: this airframe's mass and aerodynamics, the motor, the wind, the servo and motor lags. A 32 x 32 head adds residual linear and angular accelerations at each step. Untrained, it is exactly the physics.
- Task-free. Trained on 1000 flights (8.3 h) of randomized airframes in wind, flown by an autopilot on random references. Half the flights carry step-wise, MPPI-like probing: the planner's jerky candidates are exactly where a model trained on smooth flight is wrongly optimistic.
- Trained on a laptop CPU in 18 minutes.
By Edgar Moreau · huggingface.co/Ethgar
Try it
pip install torch numpy pyyaml
python example.py
fixed_wing/ holds everything it needs: dynamics.py (the batched 6-DoF backbone), learned.py (the correction and
LearnedFixedWing.rollout(state_hist, action_hist, future_actions) -> (S, T, 18)), airframe.yaml.
How good
On 100 held-out flights (randomized airframes in wind), median error:
| physics alone | this model (5.5k) | the 32k version | |
|---|---|---|---|
| position at 1 s | 0.85 m | 0.48 m | 0.42 m |
| position at 2 s | 2.60 m | 1.73 m | 1.62 m |
| velocity at 1 s | 1.39 m/s | 0.94 m/s | 0.86 m/s |
| attitude at 2 s, jerky probing | 9.1 deg | 8.5 deg | 9.2 deg |
In closed loop it matters more. MPPI orbits a 40 m circle on a randomized airframe in wind, measured as radial RMS over two seeds:
| planner model | seed 0 | seed 1 |
|---|---|---|
| physics alone | 0.80 m | 0.54 m |
| 32k version | 0.25 m | 0.24 m |
| this model | 0.26 m | 0.24 m |
It gives up ~6 % on open-loop position against the 32k version and flies identically: the backbone carries the dynamics, the network only the correction.
Interaction: a quadrotor lands on it
Watch: a quad lands on the plane in flight. The plane holds a steady 14 m/s leg on this model while a 0.55 kg quadrotor, flying its own world model, reads the plane's planned future, matches its speed and docks on its back (21.3 s, 14 cm from the pad, 0.41 m/s relative). Carried, the plane holds its altitude within ±0.16 m. Two world models sharing what they imagine.
Limits
- The airframe's mass, inertia and propulsion are plausible guesses, not a measured build.
- A load landing off-centre (a quadrotor docking on the wing) is outside its data: it takes the first seconds better than physics, then drifts (1.37 m settled error with 0.55 kg aboard). Landings in the data are the next step.
- Simulation only.
The idea
The SkyJEPA recipe (Rao et al., 2026: a tiny latent world model of a quadrotor, physics-informed, flown by MPPI) carried to another vehicle. Learn each machine once, without tasks; then a task is only a cost function. Same family: quadrotor, cable robot.