Everything your team needs to run a mission. One screen.
The AEOS ground station gives operators a live satellite view of the drone, 5–10 Hz telemetry on every critical system, onboard camera video with AI detections, and Athena AI for in-flight queries — all in a single secure dashboard. From mission planning to post-flight review, nothing leaves the screen.
Your drone, live on the map.
Watch AgroExplorer One move in real time — GPS trail, altitude, battery, and system state updating ten times per second on a satellite map you can pan and zoom without losing track of the drone.
The right view for every phase of a mission.
Switch between mission planning, live operations, flight history, and AI detection review. Every page shares the same live data — no reconnecting, no lag, no switching apps.
Dashboard
Live map + drone trail · telemetry · mission controls · video feed · YOLO detections · system log · Athena chat · draggable floating panels. Layout persisted per-user in localStorage.
Mission Planning
Click-on-map waypoint editor · polygon drawing · altitude and speed controls · YAML mission preview · Save Mission → POST to /missions API → start from Mission Controls.
Flight History
Table of all completed flights with mission ID, status, and duration. Export buttons for CSV, PDF, and orthomosaic ZIP (in development).
Settings
Backend URLs (API + WebSocket) · Athena config (enabled, WS URL, tier preference, authority levels) · static operator checklist reference.
| Component | Function |
|---|---|
| LiveMap | Leaflet satellite + OpenStreetMap · drone marker · 500-point trail · mission waypoints · layer toggle |
| TelemetryPanel | 5 tabs: Main · Extended · WiFi/4G · Jetson stats · LoRa |
| MissionControls | Mission picker · Start · Pause · Resume · RTL · Abort · progress bar |
| VideoPlayer | Live JPEG snapshot stream · OAK or CSI · recording on/off · HD/SD toggle |
| VisionPanel | Depth map + contour overlay + detection thumbnails |
| AthenaPanel | AI chat · push-to-talk · action approval cards |
| ArtificialHorizon | SVG pitch/roll gauge with aircraft symbol |
| CompassHUD | SVG compass ring · heading · wind barb |
| DetectionFeed | Scrollable YOLO detection thumbnails (≤100) |
| TestHarnessPanel | Service health · manual tests · device toggles · Jetson NVPModel |
| AuditLogPanel | Security event table · polled 30 s · CSV export |
| SecurityStatusBar | EMCON level selector with confirm on REDUCED/SILENT |
Real missions. Real data.
Every screenshot here is from an actual AEOS field session — mission planning over Portuguese coastal farmland and live telemetry with AgroExplorer One airborne.
Depth and detections. Side by side.
The VisionPanel streams live OAK-D stereo depth alongside YOLO detection thumbnails. Depth frames arrive as JPEG tiles with contour overlays — the operator sees exactly what the obstacle avoidance system sees, in real time.
5–10 Hz. Every system. Every second.
Altitude, heading, battery, GPS quality, and AEOS state stream to every panel simultaneously the moment they arrive. One connection. No duplication. Nothing buffered.
| Event | Destination | Content |
|---|---|---|
| telemetry | TelemetryPanel, LiveMap, MissionControls | lat/lon/alt, battery, mode, speed, EKF, vibration, Jetson stats |
| mission_state | MissionControls | state, progress %, waypoint index, status message |
| detections | DetectionFeed, VisionPanel | class, confidence, lat/lon, thumbnail JPEG (≤100 kept) |
| snapshots | VideoPlayer | JPEG base64 → blob URL (revoked on replacement) |
| depth_map | VisionPanel | depth JPEG + contours + markers |
| links | TopBar, ConnectionPanel | composite link score + per-interface WiFi/4G/LoRa status |
| hmac_alert | TopBar (red badge) | HMAC mismatch on tampered telemetry frame |
| presence | TopBar | online: true/false |
| lora_status | TelemetryPanel (LoRa tab) | LoRa-only state via custom window event |
Every command is accountable.
Arm, takeoff, waypoint, return-to-launch — every action is cryptographically signed, routed through the ground API, and logged with its outcome. If something goes wrong, you have a complete audit trail.
| Action | API Endpoint | Confirm? |
|---|---|---|
| Arm | POST /drones/{id}/commands { command: arm } | None |
| Start Mission | POST /drones/{id}/commands { command: start, params: { mission_id } } | Must pick mission first |
| Pause Mission | POST /drones/{id}/commands { command: pause } | None |
| Resume Mission | POST /drones/{id}/commands { command: resume } | None |
| Return to Launch | POST /drones/{id}/commands { command: rtl } | None |
| Abort Mission | POST /drones/{id}/commands { command: abort } | None |
| Connect Vehicle | POST /vehicle/{id}/connect | Polls until CONNECTED |
| Toggle Device | POST /drones/{id}/commands { command: device_toggle } | None (optimistic UI) |
- All commands signed with ED25519 on the ground, verified by SecurityGateway on the drone
- Nonce + timestamp window prevents replay attacks (test: test_replay_attack.py)
- HMAC verification on every incoming telemetry frame — mismatch triggers red TopBar badge
- EMCON REDUCED / SILENT require explicit operator confirmation in the dropdown
- Audit log: GET /api/audit?limit=200 — polled every 30 s — colour coded
- COMMAND_ACCEPTED = green · COMMAND_REJECTED = red · EMCON_CHANGE = orange · HMAC_MISMATCH = red
- CSV export from the AuditLogPanel modal (client-side blob download)
- Role-based JWT auth: admin creates first account via POST /auth/bootstrap
No cloud required to fly.
AEOS runs entirely on the drone and a local ground station. No subscription, no internet dependency for flight operations. Tailscale provides an optional encrypted private link for remote access when you need it.
| Service | Purpose |
|---|---|
| Mosquitto MQTT | Primary broker at 100.64.0.10:1983 (TCP) / :9101 (WS) |
| FastAPI (Uvicorn) | Ground API at localhost:8100 — REST + WebSocket /ws/telemetry |
| React + Vite | Operator UI at localhost:5173 |
| ground_link_manager.py | Keeps ground Tailscale healthy; joins AEOne hotspot on link loss |
| ground_beacon.py | UDP heartbeat so the drone can find the ground host |
| lora_bridge.py | Auto-detects ground Heltec CP210x; parses LNKS_RX lines; TX heal commands |
| aeos-tailscale (Docker) | --network=host · WireGuard · pinned to v1.78.3 |
| VPS Mosquitto | 91.98.207.102:1983 — always-on rendezvous when ground host is unreachable |
The ground server that closes the loop.
While AgroExplorer-001 is airborne, a rack-mounted server handles MQTT brokering, the ground API, and the operator UI. The moment the drone lands, the same machine kicks off post-flight intelligence — stitching orthomosaics, computing NDVI maps, running deep crop analysis, and making the full mission dataset available for review.
OpenDroneMap stitches all geotagged frames into a full-field orthomosaic at cm/pixel resolution
Output: GeoTIFF · EPSG:4326 · mission-ID taggedVegetation index computed per-pixel from the orthomosaic — zones of stress, senescence, or anomaly highlighted in the output
Output: colourised NDVI raster · field-boundary clippedPoint cloud and textured 3D mesh reconstruction from SfM — full canopy structure for volumetric crop assessment
Output: PLY / OBJ · coloured from RGB keyframes| Mosquitto MQTT | 100.64.0.10:1983 |
| FastAPI ground API | localhost:8100 |
| Operator UI (React) | localhost:5173 |
| VPN overlay | Tailscale · WireGuard |
| VPS rendezvous | 91.98.207.102:1983 |
Night operations. Full situational awareness.
The AEOS dashboard operates identically at night — all telemetry, AI detections, and mission controls remain live regardless of lighting conditions on the drone.
See AgroExplorer One live.
We'll walk your team through the AEOS ground station with a real drone connected — mission planning, live telemetry, AI detections, and the full operator workflow.
info@twoaeon.com · +351 932 340 144