diff --git a/tasks/flightradar24/docs/INDEX.md b/tasks/flightradar24/docs/INDEX.md index d49d1f6..d9f9cd8 100644 --- a/tasks/flightradar24/docs/INDEX.md +++ b/tasks/flightradar24/docs/INDEX.md @@ -1,6 +1,6 @@ # FR24 / noisemap docs index -> Обновлено: 2026-04-21 +> Обновлено: 2026-04-26 ## 🔑 Главный документ - **`SYSTEM_OVERVIEW.md`** — полное актуальное описание системы: контейнеры, БД, ETL, UI, статус данных @@ -21,7 +21,14 @@ - `tasks/flightradar24/prototype/docs/UI.md` - `tasks/flightradar24/prototype/docs/DEVLOG.md` +## Метрики и анализ ADS-B +- **`analysis/ZUP_DEFINITION.md`** — зона уверенного приёма (35 км), метрики M1–M4, TQS +- **`analysis/adsb_quality_metrics.sql`** — SQL-запросы: гистограмма расстояний, M1–M4, TQS, RHI +- **`analysis/diagram_adsb_pipeline.png`** — схема тракта данных ADS-B → PostgreSQL +- **`specs/SPEC_M4_FILTER.md`** — ТЗ на M4-фильтр выбросов координат + ## Что читать в каком порядке 1. `SYSTEM_OVERVIEW.md` — текущее состояние системы целиком -2. `PROJECT.md` — задачи и backlog -3. `PHASE2_STEP2_DATA_MART.md` — если нужна витрина подробно +2. `analysis/ZUP_DEFINITION.md` — метрики качества ADS-B +3. `PROJECT.md` — задачи и backlog +4. `PHASE2_STEP2_DATA_MART.md` — если нужна витрина подробно diff --git a/tasks/flightradar24/docs/SYSTEM_OVERVIEW.md b/tasks/flightradar24/docs/SYSTEM_OVERVIEW.md index bbdf283..d1d9404 100644 --- a/tasks/flightradar24/docs/SYSTEM_OVERVIEW.md +++ b/tasks/flightradar24/docs/SYSTEM_OVERVIEW.md @@ -1,6 +1,6 @@ # FR24 Noisemap — Полное описание системы -> Актуально на: 2026-04-21 +> Актуально на: 2026-04-26 ## Назначение проекта @@ -30,7 +30,7 @@ | Контейнер | Порт | Назначение | |---|---|---| | `fr24-capture` | — | Читает ADS-B поток с dump1090 (SBS port 30003). Пишет сырые пакеты в `fr24.raw_packets`. Retention 3 дня. | -| `fr24-preprocess` | — | Читает `fr24.raw_packets`, строит нормализованные `fr24.flights`, `fr24.tracks`, `fr24.track_points`. Поддерживает recovery после сбоя. | +| `fr24-preprocess` | — | Читает `fr24.raw_packets`, строит нормализованные `fr24.flights`, `fr24.tracks`, `fr24.track_points`. Поддерживает recovery после сбоя. **M4-фильтр выбросов координат** (26.04.2026). | ### Слой внешних треков @@ -105,9 +105,24 @@ fr24_mart.source_coverage — покрытие по источникам (% ре ### 1. RTL-SDR pipeline (real-time) ``` -Антенна → dump1090 SBS:30003 → fr24-capture → fr24.raw_packets - → fr24-preprocess → fr24.flights/tracks/track_points +РТЛ-SDR RTL2838 (USB, 1090 МГц) + → dump1090-fa (SBS-1 декодер) + → TCP :30003 + → fr24-capture → fr24.captures + fr24.raw_packets (base64, partitioned/date) + → fr24-preprocess → fr24.aircraft + fr24.flights + fr24.tracks + fr24.track_points ``` + +**Алгоритм preprocess:** +- MSG1 = callsign, MSG3 = позиция (lat/lon/alt), MSG4 = скорость/курс (кешируется 30 сек, обогащает MSG3) +- gap > 30 мин без точек → закрыть рейс, создать новый +- `onground=1` → точку пропустить +- **M4-фильтр (26.04.2026):** скорость между точками > 350 м/с (Mach 1) → выброс, точка не записывается + +**Антенна:** +- Местоположение: д. Хоругвино, Солнечногорский р-н, МО +- Координаты: 56.121°N, 37.216°E +- Оборудование: RTL-SDR RTL2838 DVB-T + - **Покрытие:** ~230 рейсов/день (~9.6% от расписания) - **Задержка:** 1-2 сек - **Throughput:** ~3000 пакетов/5 мин @@ -215,19 +230,38 @@ GET /api/data-sources/airport-load --- -## Текущий статус данных (на 21.04.2026) +## Текущий статус данных (на 26.04.2026) | Что | Количество | |---|---| | Расписание в fr24_ext | 01.04 – 19.04.2026 (~26K рейсов) | | FR24 треки | 1 рейс (FV6807, тест) | | FA треки | 5 рейсов (CSN, тест) | -| RTL-SDR рейсы | 19–21.04 (~730 рейсов) | +| RTL-SDR треки (ЗУП 35 км) | 684 трека, avg TQS=0.951 | +| RTL-SDR: dump1090 | ⚠️ нестабилен (rc=1 цикл), возможна проблема USB/прав | | Витрина fr24_mart | 01.04 только (1399 рейсов, 1 с треком) | | Noise grid | 688 ячеек за 01.04 | --- +## Метрики качества ADS-B захвата + +Детали: `analysis/ZUP_DEFINITION.md`, SQL: `analysis/adsb_quality_metrics.sql` + +**Зона уверенного приёма (ЗУП):** радиус **35 км** от антенны. + +| Метрика | Описание | Значение в ЗУП | +|---|---|---| +| M1 — шаг между точками | Медианное расстояние между последовательными точками трека | 26 м | +| M2 — временной интервал | Медианный dt между точками; gap rate (gap>30 сек) | 0.8 сек; 2.2% | +| M3 — точек на трек | Кол-во точек трека в ЗУП | медиана 70, max 706 | +| M4 — выбросы координат | Доля точек со скоростью > 350 м/с | ~4% (до фильтра) | +| TQS | Track Quality Score (0..1) | 0.951 среднее | + +**M4-фильтр** добавлен в `fr24-preprocess` 26.04.2026 — выбросы отсекаются до записи в БД. + +--- + ## Известные ограничения и backlog | # | Проблема | Приоритет | diff --git a/tasks/flightradar24/ingest/preprocess/README.md b/tasks/flightradar24/ingest/preprocess/README.md index 787b77b..48a5278 100644 --- a/tasks/flightradar24/ingest/preprocess/README.md +++ b/tasks/flightradar24/ingest/preprocess/README.md @@ -6,16 +6,31 @@ Reads unprocessed `raw_packets` from PostgreSQL and builds aircraft, flights, tr 1. Waits for PostgreSQL to be ready 2. Reads `fr24.processing_state` to find the last processed `raw_packet_id` -3. Fetches the next batch of unprocessed packets -4. For each packet: upserts `aircraft`, creates/reuses a `flight`, appends a `track_point` +3. Fetches the next batch of unprocessed packets (BATCH_SIZE, default 500) +4. For each packet: + - Decodes base64 SBS-1 payload + - Parses MSG type: MSG1=callsign, MSG3=position, MSG4=speed/heading/vrate + - MSG4 velocity is cached per icao24 (30 sec TTL) and used to enrich MSG3 + - Skips ground-stationary aircraft (`onground=1`) + - **M4 outlier filter:** if computed speed between consecutive points > `MAX_SPEED_MS` (350 m/s) — point is dropped, warning logged + - Upserts `aircraft`, creates/reuses a `flight` (gap 30 min → new flight), appends a `track_point` 5. Advances the cursor in `processing_state` 6. Touches `/tmp/preprocess-ready` for Docker healthcheck -Data is fake/test for this stage — real ADS-B decoding comes later. +## M4 outlier filter (added 2026-04-26) + +Filters coordinate outliers caused by corrupted dump1090 decodes. Algorithm: + +- Caches `last_lat/lon/last_point_ts` per icao24 in `aircraft_state` +- On each MSG3 point: computes `haversine_m(last, current) / dt` +- If `dt ≤ 30s` and computed speed > `MAX_SPEED_MS` → skip point, log WARNING +- If `dt > 30 min` (gap/new flight) → reset last_point cache before checking +- Backup of original: `/home/fr24/backups/openclaw/20260426-100236_main.py.bak` ## Dependencies - `psycopg2-binary` +- stdlib only (`math`, `os`, `base64`, `json`, etc.) — no extra packages ## Environment variables @@ -27,7 +42,8 @@ Data is fake/test for this stage — real ADS-B decoding comes later. | `POSTGRES_USER` | required | DB user | | `POSTGRES_PASSWORD` | required | DB password | | `POLL_INTERVAL_SECONDS` | `5.0` | How often to poll for new packets | -| `BATCH_SIZE` | `20` | Packets per processing batch | +| `BATCH_SIZE` | `500` | Packets per processing batch | +| `MAX_SPEED_MS` | `350.0` | M4 outlier threshold, m/s (Mach 1) | ## Run locally @@ -40,6 +56,18 @@ python main.py ## Build & run via Docker ```bash -docker build -t fr24-preprocess . -docker run --env-file ../../compose/.env fr24-preprocess +cd /home/fr24/projects/fr24/compose +sg docker -c 'docker compose build preprocess && docker compose up -d preprocess' +``` + +## Logs + +Normal operation: +``` +2026-04-26T10:00:00 [preprocess] INFO Processed 46 packets (cursor→5384624, total=4002247) +``` + +M4 outlier detected: +``` +2026-04-26T10:00:01 [preprocess] WARNING M4 outlier icao24=ABC123 speed=1240 m/s — skipping ```