Flight algorithms, from scratch.
Multirotor, fixed-wing and VTOL flight models with the physics written out in full — plus 42 runnable simulations and a gym for teaching a drone to fly itself.
Documentation · Getting started · Flight models · Reinforcement learning · Algorithm atlas

Quadrotor, fixed-wing, VTOL, planning, trajectory generation, estimation, mapping, swarms and reinforcement learning, closing on all 42 simulations. Every frame is simulated at render time by scripts/make_promo.py — no stock footage, and nothing that can drift out of sync with the code. Above is a sample of each scene; the full seventy-eight seconds, at full resolution, is on the docs site.
pip install flybotsflybots doctor # verify the install, run the physics self-checks
flybots list # browse 42 simulations
flybots run pid_hover # render one to a GIF
flybots train hover # teach a quadrotor to hold positionA fixed wing, trimmed and flown to a new altitude and heading:
fromuav_sim.vehicles.fixed_wingimportcreate_fixed_wing, FixedWingPresetfromuav_sim.control.fixed_wing_autopilotimportFixedWingAutopilot, AutopilotCommandaircraft=create_fixed_wing(FixedWingPreset.SKYWALKER_X8)
aircraft.reset_trimmed(altitude=120.0) # solve for equilibrium flightpilot=FixedWingAutopilot(aircraft.fw_params) # gains derived from the airframecommand=AutopilotCommand(altitude=160.0, airspeed=20.0, course=1.0)
for_inrange(12_000):
aircraft.step(pilot.compute(aircraft.state, command, 0.01), 0.01)
print(aircraft.state[2]) # 160.0| Vehicles | 6DOF quadrotor with motor dynamics · full Beard & McLain fixed-wing · tilt-rotor VTOL that transitions |
| Control | Cascaded PID · LQR · MPC · pure pursuit · geometric SO(3) · fixed-wing autopilot · VTOL mode scheduler |
| Planning | A* · RRT* · PRM · potential field · coverage · min-snap · Frenet · quintic |
| Estimation | EKF · UKF · particle filter · complementary filter · EKF-SLAM |
| Perception | Occupancy mapping · obstacle detection · visual servoing · gimbal tracking |
| Swarm | Reynolds flocking · consensus · virtual structure · leader-follower · Voronoi coverage |
| Learning | 6 RL environments · pure-NumPy trainer (ARS, CEM) · optional Gymnasium integration |
Nothing here wraps a solver. The Newton-Euler equations, the aerodynamic coefficient build-up, the Kalman recursions and the sampling-based planners are written out in NumPy next to the citation they came from.
Three airframes, one frame convention, so they compose.
fromuav_sim.vehicles.fixed_wingimportcreate_fixed_wing, FixedWingPresetaircraft=create_fixed_wing(FixedWingPreset.AEROSONDE)
controls=aircraft.reset_trimmed(airspeed=35.0, altitude=200.0)
for_inrange(6000):
aircraft.step(controls, 0.005)
aircraft.state[2] # 200.0 — thirty seconds, open loop, no driftThat is the acceptance test for the whole aerodynamic model: if any force or moment is inconsistent, trim is not an equilibrium and the aircraft wanders. Every stability derivative is live, and there is a test that fails if you zero any of them.
- Fixed-wing — coefficient build-up, stall, trim solver
- VTOL tilt-rotor — hover → cruise → hover with altitude held
- Quadrotor — mixer and per-motor dynamics
flybots envs # 6 tasks: hover, waypoint, trajectory, landing, 2 fixed-wing
flybots train hover # pure NumPy — no deep-learning stack
flybots play hover --policy policies/hover.npz --gif hover.giffromuav_sim.gymimportmake, train, evaluateresult=train("hover", iterations=120, seed=0)
print(evaluate("hover", result.policy, episodes=25))Gymnasium's API without the Gymnasium dependency. Install
flybots[gym] and the environments register as uav_sim/Hover-v0 for use
with any standard RL library.
The interesting part is not the algorithm — it is that four setup choices decide whether these tasks are learnable at all. Each is documented with the measurement that motivated it.
Forty-odd runnable demos, each with a three-panel animation, an academic reference and a JSON log:
flybots list
flybots info astar_3d
flybots run astar_3dBrowse them all in the algorithm atlas.
Worth ten minutes before you write a controller:
| Frame | Axes | |
|---|---|---|
| World | ENU | x east, y north, z up |
| Body | FLU | x forward, y left, z up |
A consequence of Forward-Left-Up is that positive pitch is nose-down, and because the world is ENU, banking right decreases the heading. Aerodynamics texts use Forward-Right-Down; the library converts at the boundary rather than rewriting the equations. Full details in Frames and conventions.
git clone https://github.com/guilyx/flybots.git
cd flybots
uv sync --all-groups
uv run flybots doctor
uv run pytest
pre-commit install && pre-commit install --hook-type commit-msgContributions welcome — see CONTRIBUTING.md for the bar a new algorithm has to clear, and CHANGELOG.md for what has changed.
These models are simplified, the controllers are not certified, and nothing here has been validated against a real airframe. Do not fly hardware on control code taken from this repository without independent verification. See SECURITY.md.
MIT — see LICENSE.