Alpha

Under active development. Breaking changes expected. APIs, installers, and UI may shift between releases.

Clients

Four ways to connect.

A browser. A cable. A monitor. A phone. The Ground Agent serves all four at once, with explicit rules for who holds the sticks.

Mode 1

HDMI kiosk with a gamepad.

Power on the ground node. Plug an HDMI cable into a monitor or an FPV goggle. Plug a USB or Bluetooth gamepad. Fly.

The ground node runs a Chromium kiosk on the HDMI output. The kiosk loads a local /hud route rendered by the agent. That route shows the live WebRTC video on the left, a minimal HUD on the right (altitude, airspeed, battery, GPS, mode), and a telemetry strip along the bottom. No taskbar. No browser chrome. It is a monitor that looks like a purpose-built pilot display.

Stick input comes from a standard HID gamepad. Logitech F310, Xbox controllers, 8BitDo Pro, a paired Bluetooth controller, any of them work. The agent maps stick axes to MANUAL_CONTROL MAVLink frames and sends them at 50 Hz over the WFB-ng uplink. Glass-to-glass latency stays under 70 ms and stick-to-servo stays under 60 ms on the bench rig.

What you need

  • Ground node with an HDMI-capable SBC (Lite or Pro tier).
  • Monitor, FPV goggle, or any HDMI display.
  • USB or Bluetooth gamepad. No custom firmware.
  • ados-kiosk.service running (enabled by default).

Mode 2

WiFi AP for any laptop or phone.

The ground node broadcasts an access point. Any browser on any device can connect.

On first boot the node brings up an access point named ADOS-GS-XXXX with a random passphrase printed on the case. Join it from a laptop or phone, open a browser at the local IP, and Mission Control loads from the ground node itself. The full GCS, telemetry, mission planner, and video feed run locally. No cloud dependency, no login, no account.

Multiple observers can join the same AP. The node handles the WebRTC fanout. Latency stays under 100 ms glass-to-glass when the observer and the node share the 2.4 GHz AP. Stick-to-servo stays under 70 ms when a gamepad is attached to the browser.

Typical use

  • Bench work on your own laptop without cable management.
  • Spotter on a phone while the pilot flies on HDMI.
  • Classroom or demo setup with many observers.
  • Any device that does not have a USB-C data port.

Mode 3

USB-C tether for Mac and Windows.

Plug a USB-C cable between your laptop and the ground node. The OS sees a USB Ethernet adapter. No drivers.

The ground node exposes itself as a USB composite device over the Type-C data link. macOS Sonoma and later and modern Linux see it as CDC-NCM. Windows 11 negotiates RNDIS as a fallback. DHCP hands the laptop 192.168.7.2 and the node sits at 192.168.7.1. A browser pointed at that address loads Mission Control over the wire.

This is the lowest-friction path for a bench engineer. No WiFi congestion, no chipset matrix, no driver install. Glass-to-glass latency stays under 70 ms because the path is a USB 2.0 link, not a radio. Useful when you need to rule out WiFi as a variable during a debug session.

OS support

  • macOS Sonoma and newer: native CDC-NCM, no install.
  • Windows 11: native RNDIS fallback, no install.
  • Windows 10: RNDIS driver ships in Windows Update catalog.
  • Linux (Ubuntu 22.04+): native CDC-NCM, no install.
  • Android 11+: native USB Ethernet, ADOS app auto-detects.

Mode 4

Native Android. Mode A.

The ADOS Android app speaks directly to the ground node. Same telemetry, same video, built for a phone screen.

The Android app connects over the ground node WiFi AP or a USB-C tether. On first join the captive portal opens for pairing, then the app takes over. WebRTC video plays at native frame rate. MANUAL_CONTROL frames come from the on-screen sticks or a paired Bluetooth gamepad. A chest mount or a lanyard turns a phone into a pilot display.

The browser path still works on Android. The native app exists because it gives control over the decoder pipeline, keeps the screen awake, and survives rotation and backgrounding cleanly on typical field phones.

Field scenarios

  • Spotter on a phone while a pilot flies on HDMI.
  • Solo pilot with a Bluetooth gamepad and a chest-mounted phone.
  • Demo day: hand the phone around, no laptop setup.
  • Weather-sealed use in a rugged phone case on an outdoor site.

Pilot In Command

Many viewers. One pilot.

All four modes can be live at once. Stick authority is arbitrated by the PIC service. Only one client holds the sticks at any time.

A ground node can serve the HDMI kiosk, a laptop on WiFi AP, a Mac on USB tether, and an Android phone at the same time. Telemetry and video flow to all of them. But MAVLink MANUAL_CONTROL frames are single-master. The ados-pic.service runs a small state machine that decides who has stick authority.

The Hardware tab in Mission Control shows the current pilot with a badge. Any other client can request control with a single button. The current pilot either accepts the handoff or holds. Timeouts auto-release the claim when a pilot disconnects unexpectedly. If no client claims the role, the node sits in observer mode and nothing flies.

Claim lifecycle
observerclick Take control
request pendingcurrent pilot accepts
pilot in command
heartbeat every 10srelease on disconnect
observerauto
Heartbeat every ten seconds. Timeout auto-releases the claim when a pilot disconnects.

Latency

Measured on the bench rig.

Glass-to-glass is the time from shutter click on the air camera to a pixel on the ground screen. Stick-to-servo is the time from a gamepad axis change to a servo movement on the drone.

ModeGlass to GlassStick to ServoBest For
HDMI kiosk<70 ms<60 msField pilot, no laptop.
USB-C tether<70 ms<60 msBench engineer, Mac or Windows.
WiFi AP<100 ms<70 msAny browser, any laptop or phone.
Android (native app)<80 ms<70 msPhone pilot or observer.
Cloud observer<300 mstelemetry onlyRead-only, remote operator.

Numbers come from bench tests on the Pi 4B reference rig. Field numbers depend on antenna placement and RF environment.

One node. Many clients. One pilot at a time.

Public docs cover every mode with step-by-step pairing and troubleshooting.

Client docs
Get Early Access