Skip to content

Tutorial: Formation Flying

Learn how to coordinate drones into geometric patterns using drone-swarm's built-in formation library.


Available Formations

Formation Function Min Drones Description
V-Shape v_formation() 3 Classic chevron with leader at front
Line line_formation() 2 Single file along a heading
Area Sweep area_sweep() 2 Parallel lawnmower tracks over an area
Orbit orbit_point() 1 Circular pattern around a GPS point

V-Formation

The classic military chevron. One drone leads, others form a V behind it.

from drone_swarm.missions import v_formation

formations = v_formation(
    center_lat=-35.3632,     # GPS latitude of formation center
    center_lon=149.1652,     # GPS longitude
    altitude=20,             # meters above home
    num_drones=5,            # number of drones
    spacing_m=15,            # distance between adjacent drones
    heading_deg=90,          # formation heading (east)
)
# Returns: list of waypoint lists, one per drone
# formations[0] = leader waypoints
# formations[1], formations[2] = left/right wingmen

How it works: - Drone 0 (leader) flies to the center point - Odd-numbered drones offset to the left and behind - Even-numbered drones offset to the right and behind - Spacing is measured diagonally between adjacent drones

Line Formation

Single file — drones fly in a straight line along a heading.

from drone_swarm.missions import line_formation

formations = line_formation(
    center_lat=-35.3632,
    center_lon=149.1652,
    altitude=20,
    num_drones=4,
    spacing_m=10,            # distance between each drone
    heading_deg=180,         # line runs north-south
)

Use cases: Corridor search, power line inspection, border patrol.

Area Sweep

Divides a rectangular area into parallel strips — one per drone — for efficient coverage.

from drone_swarm.missions import area_sweep

missions = area_sweep(
    sw_lat=-35.364,          # southwest corner
    sw_lon=149.164,
    ne_lat=-35.362,          # northeast corner
    ne_lon=149.166,
    altitude=30,
    num_drones=3,
)
# Each drone gets 2 waypoints defining its strip (south end, north end)

How it works: - The area is divided into N vertical strips (one per drone) - Each drone flies a north-south track within its strip - No overlap between strips

Use cases: Search and rescue, crop mapping, site surveying.

Orbit

Drones fly a circular path around a point of interest. Multiple drones are evenly spaced around the circle.

from drone_swarm.missions import orbit_point

missions = orbit_point(
    center_lat=-35.3632,
    center_lon=149.1652,
    altitude=25,
    radius_m=50,             # orbit radius
    num_drones=3,
    points_per_orbit=12,     # waypoints per full circle
)
# Each drone gets 12 waypoints around the circle
# Drones start at evenly-spaced phase offsets (120 deg apart for 3 drones)

Use cases: Perimeter surveillance, point-of-interest monitoring, drone shows.

Assigning Formations to a Swarm

All formation functions return a list of waypoint lists. Assign them to drones:

drone_ids = list(swarm.drones.keys())
formations = v_formation(lat, lon, alt, num_drones=len(drone_ids), spacing_m=15)

for drone_id, waypoints in zip(drone_ids, formations, strict=True):
    await swarm.assign_mission(drone_id, waypoints)

await swarm.execute_missions()

Custom Formations

You can create any formation by computing waypoints manually:

from drone_swarm.drone import Waypoint

# Diamond formation
diamond = [
    [Waypoint(lat, lon + 0.0001, 20)],          # north
    [Waypoint(lat - 0.0001, lon, 20)],           # west
    [Waypoint(lat, lon - 0.0001, 20)],           # south
    [Waypoint(lat + 0.0001, lon, 20)],           # east
]

for drone_id, waypoints in zip(drone_ids, diamond, strict=True):
    await swarm.assign_mission(drone_id, waypoints)
await swarm.execute_missions()

Tips

  • Spacing matters. Too close (< 5m) risks collision. Too far (> 50m) loses visual cohesion. Start with 15m for testing.
  • Heading affects layout. A V-formation at heading 0 (north) looks different from heading 90 (east). The leader always faces the heading direction.
  • Altitude is consistent. All drones in a formation fly at the same altitude by default. For altitude staggering (safer), assign different altitudes manually.
  • Wind affects formation accuracy. In simulation, formations are pixel-perfect. In real flight, expect 2-5m drift depending on wind. The SDK does not currently correct for drift (planned for v0.5 with formation feedback loop).