flybots
Flight algorithms, from scratch.
Multirotor, fixed-wing and VTOL flight models with the physics written out in full — plus 47 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 47 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.
Install
pip install flybots
flybots doctor # verify the install, run the physics self-checks
flybots list # browse 47 simulations
flybots run pid_hover # render one to a GIF
flybots train hover # teach a quadrotor to hold position
Sixty seconds in
A fixed wing, trimmed and flown to a new altitude and heading:
from flybots.vehicles.fixed_wing import create_fixed_wing, FixedWingPreset
from flybots.control.fixed_wing_autopilot import FixedWingAutopilot, AutopilotCommand
aircraft = create_fixed_wing(FixedWingPreset.SKYWALKER_X8)
aircraft.reset_trimmed(altitude=120.0) # solve for equilibrium flight
pilot = FixedWingAutopilot(aircraft.fw_params) # gains derived from the airframe
command = AutopilotCommand(altitude=160.0, airspeed=20.0, course=1.0)
for _ in range(12_000):
aircraft.step(pilot.compute(aircraft.state, command, 0.01), 0.01)
print(aircraft.state[2]) # 160.0
What is here
| 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 |
| Comms | Algebraic connectivity maintenance · relay coverage · path-loss and Gaussian link models |
| Safety | Control barrier functions · CBF-QP safety filter · geofence, separation and speed barriers |
| 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.
Flight models
Three airframes, one frame convention, so they compose.
from flybots.vehicles.fixed_wing import create_fixed_wing, FixedWingPreset
aircraft = create_fixed_wing(FixedWingPreset.AEROSONDE)
controls = aircraft.reset_trimmed(airspeed=35.0, altitude=200.0)
for _ in range(6000):
aircraft.step(controls, 0.005)
aircraft.state[2] # 200.0 — thirty seconds, open loop, no drift
That 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
Teach one to fly
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.gif
from flybots.gym import make, train, evaluate
result = 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 flybots/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.
Simulations
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_3d
Browse them all in the algorithm atlas.
Conventions
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.
Development
# The simulation GIFs live in Git LFS and are ~150 MB. Skipping them clones
# in a few seconds and leaves small pointer files in their place, which is
# what you want unless you are regenerating the GIFs themselves. Drop the
# prefix to fetch them, or run `git lfs pull` later.
GIT_LFS_SKIP_SMUDGE=1 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-msg
Contributions welcome — see CONTRIBUTING.md for the bar a new algorithm has to clear, and CHANGELOG.md for what has changed.
Safety
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.
License
MIT — see LICENSE.
Metadata
Release files for flybots 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| flybots-2.0.0.tar.gz | 727.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flybots-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / flybots-2.0.0.tar.gz
| Download URL | flybots-2.0.0.tar.gz |
|---|---|
| Size | 727.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eb0cbe7fa7d347187db4cba6b186e11afe393c0f88991f2d268aaef11ba2af33
|
|
BLAKE2b-256 checksum How to use checksums |
3c7aff82c2a2259ece80ccf8eff48bf56d9d64167bb05cd5c664ac7f11ca5c85
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / flybots-2.0.0-py3-none-any.whl
| Download URL | flybots-2.0.0-py3-none-any.whl |
|---|---|
| Size | 483.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fcf81949162aa06b791ee8f1f9eddbef615eccd97ee9a1f1e86adf12ca8b069a
|
|
BLAKE2b-256 checksum How to use checksums |
206d96100a48e910a3522a9b6a98d118eacc971a81b3b27bf6506f05feef429c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|