← All articles

Reading turbulence from the sky: inferring rough air from ADS-B


Turbulence is one of the last things in aviation we still mostly find out about after it happens. A pilot hits chop, keys the mic, and files a report — and that report helps the next aircraft an hour later. But every aircraft already in the sky is, in effect, a turbulence sensor. We just have to read it. Here's how Fly Overhead turns the way airplanes move into a live map of rough air.

The insight: every aircraft is a sensor

When air is smooth, an aircraft holding altitude reports a vertical rate of essentially zero — it's not climbing or descending. When air is rough, that same aircraft bounces: its vertical rate jitters up and down even as the pilot tries to hold level. The rougher the air, the bigger the jitter.

One aircraft's bounce is noisy and anecdotal. But there are thousands of aircraft broadcasting their vertical rate over ADS-B every second. Aggregate the jitter across many aircraft passing through the same patch of sky and the noise averages out into a signal: a measure of how rough that patch of air actually is, right now.

The measurement: variance per cell of sky

We divide the sky into a grid — roughly quarter-degree cells in latitude and longitude, stacked in 2,000-foot altitude bands. For each cell, we look at the aircraft that passed through and compute the standard deviation of their vertical rate (σ, in feet per minute). High σ means aircraft in that cell were bouncing; low σ means they were gliding smoothly.

The important detail is filtering. An aircraft in a deliberate climb or descent has a high vertical rate that has nothing to do with turbulence. So we only count aircraft that are trying to hold level — steady altitude, where any vertical-rate variance is the air moving them, not the pilot. That filter is what turns a raw number into a turbulence signal instead of a climb detector.

Turning variance into the scale pilots already use

A number in feet-per-minute isn't useful in the cockpit. Pilots think in NEG / LGT / MOD / SEV — negligible, light, moderate, severe. So we map the σ value in each cell to those buckets using calibrated thresholds, picked from the real distribution of σ we measure across the live data (the bulk of cells sit low, with a long tail of genuinely rough air). The map then renders the same vocabulary a pilot would read in a turbulence forecast.

The source of truth: PIREPs, SIGMETs, and AIRMETs

Inference is only worth anything if it's checked against reality. Ours is anchored to the same turbulence information the aviation system already trusts:

  • PIREPs (pilot reports) — the gold standard. When a pilot reports moderate turbulence at a place and altitude, that's a labeled data point: we know the truth for that cell at that time. We backtest the model against held-out PIREPs — if pilots reported MOD in a cell, the model had better have called that cell MOD or worse.
  • SIGMETs and AIRMETs — the official hazard advisories for significant and airman's-meteorological conditions. They bound where turbulence is forecast at a regional scale and keep the inference honest: our cell-level signal should line up with the broad regions the weather service has already flagged.

These aren't just a scorecard we grade against once — they're the training target. The model exists to predict what a PIREP would say in a cell where no pilot has reported yet, and to stay consistent with the SIGMET/AIRMET picture while filling in the fine detail between those broad strokes.

Why it gets better as the dataset grows

This is the part that compounds. Today's model is a carefully calibrated baseline: it reads vertical-rate variance and classifies it against thresholds tied to PIREP-labeled cells. That already produces a useful live turbulence layer.

But every day the system pulls another day of ADS-B motion, another day of PIREPs, and the prevailing weather those happened under. Over time that builds a growing record of “the air moved like this, under these conditions, and pilots reported that.” With enough of that history, the model stops needing aircraft to already be bouncing in a cell to flag it — it learns the weather markers that precede rough air: wind shear aloft, temperature gradients, seasonal patterns, the surface conditions that tend to kick off mountain wave or convective chop.

Aircraft class matters here too. A heavy jet and a light single flying through the identical patch of chop bounce differently — the jet's mass and wing loading soak up more of it. So the same air produces a smaller vertical-rate signal from a 737 than from a Cessna. As the dataset grows we stratify by aircraft class, so a cell that only heavy jets passed through doesn't get under-called as smooth. The more varied aircraft we observe in a cell, the more confident the read.

That's the data-moat: the longer Fly Overhead runs, the better it gets at turning weather conditions into a probable-turbulence forecast — not because the code got cleverer overnight, but because the evidence base keeps growing.

How it stays current

The model retrains automatically every day against the production database, then backtests itself against recent PIREPs. A new version only goes live if it clears a quality floor on that backtest — a model that scores worse than the one in production simply doesn't get promoted. Each version is a self-contained artifact; the live map picks up the new one within minutes of it being activated. The whole thing is versioned, so we can always see which model produced a given forecast and roll back if a training run goes sideways.

Honest limits

This is inference, not measurement. We don't have an accelerometer in every aircraft; we're reading the shadow turbulence casts on how planes move. That comes with real caveats:

  • A cell needs enough aircraft passing through to produce a stable signal. Empty sky has no sensors, so low-traffic regions are lower-confidence.
  • It's a nowcast of where the air is rough now, sharpening toward a forecast as the dataset grows — not a replacement for official turbulence products.
  • Like everything in Fly Overhead, the turbulence layer is advisory only. Use official forecasts, AIRMETs, SIGMETs, and your own judgment for go/no-go and in-flight decisions. The pilot in command is always the final authority.

Within those limits, it's genuinely useful: a live, fine-grained read on where the air is bouncing aircraft right now, built from data that was already in the sky — and getting sharper every day the dataset grows.


Filed under:turbulencemachine learningADS-BPIREPaviation weather