Overview | Features | Installation | Quick Start | Demo | Project Structure
Nimbus is a differentiable flight simulator written in JAX. It supports full 6DOF dynamics and vectorised execution on hardware accelerators for research and education in aerodynamics and control.
- โก Massive Parallelisation: Simulate millions of aircraft simultaneously on consumer hardware
- ๐ฎ 6DOF Flight Model: Full six degrees of freedom rigid body dynamics
- ๐ Quaternion Rotation Engine: Singularity-free 3D rotations
- ๐ฏ RK4 Physics Integrator: Fourth-order Runge-Kutta for high numerical accuracy
- ๐๏ธ Layered Simplex Noise Terrain: Procedurally generated terrain
- ๐ฅ Supersonic Dynamics: Drag rise from shockwaves at transonic speeds
- ๐ฌ๏ธ Atmospheric Modeling: Exponential atmosphere model with stochastic wind gusts
- ๐ก๏ธ G-Limiter: PID G-force limiting
- ๐ป 3D Visualisation: Real-time rendering with Ursina engine
# Basic installation
pip install git+https://github.com/auxeno/nimbus
# With interactive demo support (includes Ursina and Pillow)
pip install "nimbus[viz] @ git+https://github.com/auxeno/nimbus"For local development:
git clone https://github.com/auxeno/nimbus.git
cd nimbus
pip install -e . # basic installation
pip install -e ".[viz]" # with visualisationFor GPU acceleration (requires compatible OS and GPU):
pip install --upgrade "jax[cuda12]"import jax
from nimbus import quick_scenario, step, SimulationConfig
# Generate a complete scenario with terrain and waypoints
simulation, heightmap, waypoint_route = quick_scenario(seed=42)
# Configure and execute a single simulation step
key = jax.random.PRNGKey(0)
config = SimulationConfig()
step_fn = jax.jit(step, static_argnames=("config",))
next_sim, next_route = step_fn(key, simulation, heightmap, waypoint_route, config)import jax
from nimbus import (
InitialConditions, SimulationConfig, generate_simulation, quick_scenario, step
)
# Set up shared terrain and waypoint route
_, heightmap, waypoint_route = quick_scenario(seed=0)
# Generate 1 million unique aircraft simulation states
num_aircraft = 1_000_000
key = jax.random.PRNGKey(0)
keys = jax.random.split(key, num=num_aircraft)
simulation_states = jax.vmap(generate_simulation, in_axes=(0, None))(
keys,
InitialConditions.default()
)
# Compile and vectorise the step function
config = SimulationConfig()
step_fn = jax.jit(step, static_argnames=("config",))
step_parallel = jax.vmap(step_fn, in_axes=(None, 0, None, None, None))
# Execute one simulation step for all aircraft
stepped_states = step_parallel(
key, simulation_states, heightmap, waypoint_route, config
)For a demonstration of Nimbus capabilities, check out the Nimbus demo notebook:
The notebook demonstrates:
- Simulating 1 million aircraft in parallel
- Extended temporal simulations
- Interactive 3D scenario visualisation with Plotly
- Custom scenario generation
- Terrain and aircraft configuration
- Benchmarking
requires local installation with the optional [viz] command..
from nimbus.visual import InteractiveDemo
demo = InteractiveDemo()
demo.run()| Key | Action |
|---|---|
| W | Pitch down (nose down) |
| S | Pitch up (nose up) |
| A | Yaw left |
| D | Yaw right |
| Q | Roll left |
| E | Roll right |
| 1-5 | Set throttle position (0%, 25%, 50%, 75%, 100%) |
| P | Pause/unpause simulation |
| Scroll | Zoom camera in/out |
nimbus/
โโโ core/
โ โโโ config.py # simulation configuration dataclasses
โ โโโ interface.py # high-level physics interface
โ โโโ logic.py # control logic (PID controllers)
โ โโโ physics.py # aerodynamic forces and moments
โ โโโ primitives.py # type definitions
โ โโโ quaternion.py # 3D rotation operations
โ โโโ scenario.py # scenario management
โ โโโ simulation.py # numerical integration (RK4/Euler)
โ โโโ spatial.py # spatial operations and collision
โ โโโ state.py # aircraft and simulation state
โ โโโ terrain.py # procedural terrain generation
โ โโโ wind.py # wind and turbulence modeling
โโโ visual/
โโโ config.py # visualisation configuration
โโโ entities.py # 3D entities (aircraft, terrain)
โโโ runtime.py # Ursina runtime
โโโ utils.py # visualisation utilities
The code used for benchmarking can be found at the end of the demo notebook for easy results replication. Each data point is the average of 10 runs.
| Hardware | Type | Memory | Max Throughput | Sim Time Ratio |
|---|---|---|---|---|
| Apple M2 Air @ 3.5GHz | CPU | 16 GB | 9.2M steps/second | 1.8 days/second |
| i7 14770k @ 5.6GHz | CPU | 64 GB | 10.0M steps/second | 1.9 days/second |
| Google Colab T4 | GPU | 16 GB VRAM | 112M steps/second | 22 days/second |
| NVIDIA RTX 4090 | GPU | 24 GB VRAM | 983M steps/second | 190 days/second |
Max Throughput: Peak aircraft-steps per second | Sim Time Ratio: Simulated seconds per wall-clock second
If you use Nimbus in your research, please cite:
@software{nimbus2025,
title = {Nimbus: A Massively Parallelisable JAX Flight Simulation},
author = {Alex Goddard},
year = {2025},
url = {https://github.com/auxeno/nimbus}
}Apache 2.0 - See licence for details.



