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

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

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.1
File Size Uploaded
flybots-1.0.1.tar.gz 680.1 kB Details

Built distribution (wheel)

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

Total release size: 1.1 MB

Release files / flybots-1.0.1.tar.gz

Download URL flybots-1.0.1.tar.gz
Size 680.1 kB
Tags Source
SHA-256 checksum
How to use checksums
a8ab4e7efb25a696ec382497195f3e64d4d6475f61b7b664460f6f6c2e2c9c25
BLAKE2b-256 checksum
How to use checksums
7a9c1cc5609aa79eefb84d29cf9d9df779b17972d10a457b13ec5abe17e133a1
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.1-py3-none-any.whl

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

This release

1.0.1 This release

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