Progressive Complexity

Five ways to fly.

A 12-year-old can fly with text commands. A fleet operator can orchestrate 50 drones with the REST API. Same agent, same safety checks, different interfaces.

5
Tiers
3
Languages
3
Transports (UDP, WS, REST)
Blockly
For Education

Overview

From beginner to expert.

Each tier builds on the one below. Start simple, add complexity only when you need it.

T5Blockly VisualStudents
T4REST + WebSocketIntegrators
T3YAML MissionsOperators
T2Python SDKDevelopers
T1Text CommandsEveryone
Tier 1

Text Commands

Beginner

Plain text over UDP (port 8889) or WebSocket. Compatible with Tello command syntax, so existing Tello tutorials and libraries work out of the box. No SDK, no setup, no code.

  • Send commands as plain strings over UDP or WebSocket
  • Automatic hover-hold when no command is active
  • State broadcast on port 8890 (battery, height, speed, IMU)
  • Keepalive detection with configurable timeout
  • Command queue with sequential execution

Terminal Session

$ echo "command" | nc -u 192.168.1.100 8889
ok

$ echo "takeoff" | nc -u 192.168.1.100 8889
ok

$ echo "forward 200" | nc -u 192.168.1.100 8889
ok

$ echo "cw 90" | nc -u 192.168.1.100 8889
ok

$ echo "photo" | nc -u 192.168.1.100 8889
ok

$ echo "land" | nc -u 192.168.1.100 8889
ok
Tier 2

Python SDK

Developer

pip install ados-sdk. Full async Python with sensor access, computer vision hooks, and swarm orchestration. Inspired by DroneKit but built for modern Python (async/await, type hints, dataclasses).

Single Drone

from ados import ADOSDrone

async def patrol():
    drone = ADOSDrone("192.168.1.100")
    await drone.connect()
    await drone.takeoff(altitude=10)

    while (await drone.get_battery()) > 30:
        wp = next_waypoint()
        await drone.goto(wp.lat, wp.lon, wp.alt)
        await drone.hover(duration=5)

    await drone.rtl()
    await drone.disconnect()

Swarm

from ados import ADOSSwarm

async def swarm_survey():
    swarm = ADOSSwarm([
        "192.168.1.100",
        "192.168.1.101",
        "192.168.1.102",
    ])
    await swarm.connect_all()
    await swarm.takeoff(altitude=15)

    # Divide survey area among drones
    await swarm.assign_grid(
        bounds=survey_area,
        overlap=0.7,
    )
    await swarm.execute()
    await swarm.rtl_all()
  • Async/await native
  • Type hints throughout
  • Sensor access (GPS, IMU, barometer)
  • CV hooks (OpenCV integration)
  • Swarm orchestration
  • Event callbacks
Tier 3

YAML Missions

Operations

Declarative mission files for repeatable operations. Define waypoints, conditions, triggers, and suite actions in YAML. No code required. Upload via the GCS, REST API, or drop into the missions directory.

  • Waypoint sequences with hover, speed, and altitude
  • Conditional triggers (battery, distance, time, sensor)
  • Suite action injection (photo, spray, scan at waypoints)
  • Loop mode for continuous patrol
  • Abort conditions with configurable fallback (RTL, hover, land)

patrol-mission.yaml

mission:
  name: battery_aware_patrol
  version: 1
  suite: sentry

  waypoints:
    - goto: [28.5445, 77.1855, 50]
      speed: 5
      hover: 30
      action: photo

    - goto: [28.5450, 77.1860, 50]
      speed: 5
      hover: 30
      action: photo

    - goto: [28.5448, 77.1852, 50]
      speed: 5
      hover: 10

  conditions:
    - if: battery < 30
      then: rtl
    - if: wind > 15
      then: hover

  loop: true
  max_iterations: 10
Tier 4

REST + WebSocket API

Integration

HTTP endpoints and WebSocket streams for building custom dashboards, mobile apps, or integrating drones into existing enterprise systems. Any language, any platform. Full reference at API & SDK.

curl

# Get telemetry
curl http://192.168.1.100:8080/api/telemetry

# Send a command
curl -X POST \
  http://192.168.1.100:8080/api/commands \
  -H "X-API-Key: your-key" \
  -d '{"command": "takeoff", "params": {"alt": 10}}'

WebSocket (JavaScript)

const ws = new WebSocket(
  "ws://192.168.1.100:8765"
);

ws.onmessage = (event) => {
  const mavlink = new Uint8Array(event.data);
  // Raw MAVLink binary, parse as needed
  console.log("MAVLink msg:", mavlink[5]);
};
Tier 5

Blockly Visual Programming

Education

Drag-and-drop blocks in the browser. Each block maps to a Python SDK call. Students see the generated code in real-time, learning programming while flying drones.

Target audience: schools, STEM workshops, university labs, and anyone who wants to program a drone without writing code first.

  • Drag-and-drop interface in the browser
  • Generates valid Python SDK code
  • Real-time code preview as you build
  • Simulation mode for safe testing
  • Export to Python file for advanced editing
Code Editor

Comparison

Pick your level.

TierInterfaceLanguageTransportAudience
T1Text CommandsNoneUDP / WebSocketEveryone
T2Python SDKPythonTCP / WebSocketDevelopers
T3YAML MissionsYAMLFile / RESTOperators
T4REST + WebSocketAnyHTTP / WebSocketIntegrators
T5BlocklyVisual (Python)WebSocketStudents

Start with text commands. Graduate to Python.

Every tier uses the same safety checks and the same flight controller interface.

View on GitHub
Get Early Access