Skip to content

Repository files navigation

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

CIDocsPyPIPython 3.12+License: MITRuffpre-commituv

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:

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

What is here

Vehicles6DOF quadrotor with motor dynamics · full Beard & McLain fixed-wing · tilt-rotor VTOL that transitions
ControlCascaded PID · LQR · MPC · pure pursuit · geometric SO(3) · fixed-wing autopilot · VTOL mode scheduler
PlanningA* · RRT* · PRM · potential field · coverage · min-snap · Frenet · quintic
EstimationEKF · UKF · particle filter · complementary filter · EKF-SLAM
PerceptionOccupancy mapping · obstacle detection · visual servoing · gimbal tracking
SwarmReynolds flocking · consensus · virtual structure · leader-follower · Voronoi coverage
Learning6 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.

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

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:

FrameAxes
WorldENUx east, y north, z up
BodyFLUx 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.