Skip to main content

flybots

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

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


Install

pip install flybots
flybots 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 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

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.0.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.0.0
File Size Uploaded
flybots-1.0.0.tar.gz 677.5 kB Details

Built distribution (wheel)

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

Total release size: 1.1 MB

Release files / flybots-1.0.0.tar.gz

Download URL flybots-1.0.0.tar.gz
Size 677.5 kB
Tags Source
SHA-256 checksum
How to use checksums
586c700e49b3c4ad96e3ec730cb472f4ff1de21a755d4cb454d3bb461188c3e5
BLAKE2b-256 checksum
How to use checksums
27cbf065c1b38022b90f9e35d0772ab5ac76b5e64dacde59ca23c6cfef4b4cd1
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.0.0-py3-none-any.whl

Download URL flybots-1.0.0-py3-none-any.whl
Size 442.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dac9134929309ccdabe2605da46fe28247c17d3eb70ee4d8a8e3929ccad85037
BLAKE2b-256 checksum
How to use checksums
ea07a74993a28f0304365f4aa20ddcf6ffaa6c1aa10e0c1baf7cc93418e6d717
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

1.1.0

2 release files

1.0.1

2 release files

This release

1.0.0 This release

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