# Experiment 01: DJI Mini 3 Pro flight logs vs the geometric baseline

_2026-09-29. Code: `analysis/extract.py`, `analysis/levels.py`, `analysis/replay.py`._

**Data.** 54 DJI Fly logs (Jan 2023 to Feb 2026), all format v14, decrypted with a
DJI **Open API** key (a Mobile SDK key gives 403). Frames come at 5 Hz with
full-precision lat/lon and height above take-off. Only the home point is logged,
**not the pilot or controller position**.

**Signal fields.** `RC.uplinkSignal` / `RC.downlinkSignal` behave like a quantised bar
level {90, 70, 55, 30, 15, 5} mixed with what looks like decoding noise (values
0–127 scattered sample to sample). Only values persisting ≥ 2 s are kept:
downlink 39% and uplink 68% of samples survive. "Degraded" means level < 90.

**Coverage of the data.** Max distance 1.56 km (Catalina); most flights under 650 m.
The link was at full level about 97% of the time. Only 6 flights contain
degradation, about 3 minutes in total.

**Replay** (pilot assumed at home point, 1.2 m; FSPL + Bullington; best of 2.4/5.8 GHz):

| Predictor of "degraded" | ROC AUC |
|---|---|
| Distance only (FSPL) | 0.82 |
| Geometric baseline (terrain + Overture buildings + diffraction) | 0.77 |
| Height only (lower = worse) | 0.69 |

The baseline predicts up to ~134 dB loss while the link was at full level. That
is impossible under the rated-range budget (121.8 / 129.3 dB), so the baseline is
10–30 dB too pessimistic for those positions. Clearing buildings within 25–50 m
of the pilot, or raising the controller to 5 m, did not fix it. Most likely the
home point ≠ where the pilot stood (roof, balcony, different spot), plus
reflections the model ignores.

**Conclusion.** Old logs can check for over-pessimism but cannot fit a model.
They have too few events and only bar-level resolution. Next is a planned
measurement campaign: record pilot position and controller height, fly radial
legs past specific obstacles at fixed altitudes.
