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.
Overview
From beginner to expert.
Each tier builds on the one below. Start simple, add complexity only when you need it.
Text Commands
BeginnerPlain 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
Python SDK
Developerpip 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
YAML Missions
OperationsDeclarative 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: 10REST + WebSocket API
IntegrationHTTP 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]);
};Blockly Visual Programming
EducationDrag-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
Comparison
Pick your level.
| Tier | Interface | Language | Transport | Audience |
|---|---|---|---|---|
| T1 | Text Commands | None | UDP / WebSocket | Everyone |
| T2 | Python SDK | Python | TCP / WebSocket | Developers |
| T3 | YAML Missions | YAML | File / REST | Operators |
| T4 | REST + WebSocket | Any | HTTP / WebSocket | Integrators |
| T5 | Blockly | Visual (Python) | WebSocket | Students |
Start with text commands. Graduate to Python.
Every tier uses the same safety checks and the same flight controller interface.
View on GitHub