Skip to main content

flybots

Flight algorithms, from scratch.

Multirotor, fixed-wing and VTOL flight models with the physics written out in full — plus 44 runnable simulations and a gym for teaching a drone to fly itself.

Documentation · Getting started · Flight models · Reinforcement learning · Algorithm atlas

CI Docs PyPI Python 3.12+ License: MIT Ruff pre-commit uv

flybots — quadrotor, fixed-wing, VTOL, planning, trajectory generation, estimation, mapping, swarms and reinforcement learning

Quadrotor, fixed-wing, VTOL, planning, trajectory generation, estimation, mapping, swarms and reinforcement learning, closing on all 44 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 44 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 uav_sim.vehicles.fixed_wing import create_fixed_wing, FixedWingPreset
from uav_sim.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
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 uav_sim.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.

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 uav_sim.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 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.

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 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flybots 1.1.0
File Size Uploaded
flybots-1.1.0.tar.gz 692.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for flybots 1.1.0
File Interpreter ABI Platform
flybots-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / flybots-1.1.0.tar.gz

Download URL flybots-1.1.0.tar.gz
Size 692.5 kB
Tags Source
SHA-256 checksum
How to use checksums
2f80bd264bf83d6cb686ddcf1e91463b378bc156bd5d7b7dbf389335e7513d45
BLAKE2b-256 checksum
How to use checksums
9652f6380174d43120fc2b0d923d8286bf0f78e3047caf6e3594a367425f939a
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-1.1.0-py3-none-any.whl

Download URL flybots-1.1.0-py3-none-any.whl
Size 449.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
908280619166aae1fec5eae3dd09e241fdbb447aa8aa67d3e336d271f48776f8
BLAKE2b-256 checksum
How to use checksums
22e355a4e92bc152546bcc4cadede5c04af0590b607fc5bbf1944064e3d51971
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 history Release notifications | RSS feed

2.0.0

2 release files

This release

1.1.0 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page