Lab049: define ELRS control and SDR video architecture

This commit is contained in:
LittleSam129
2026-09-08 13:26:06 +03:00
parent ac6cc792b8
commit cdf5396e80
12 changed files with 3139 additions and 0 deletions

86
docs/lab049_audit.md Normal file
View File

@@ -0,0 +1,86 @@
# Lab049: аудит исходного незакоммиченного варианта
8 сентября 2026 года. Корень `C:/Users/user/Desktop/projects/SDR_Rover`,
ветка `main`, HEAD `ac6cc792b896e34f7dd6d291955a0387fdafcf41`.
До работы уже существовали незакоммиченные реализация Lab049, тесты,
`data/processed/lab049/result.json`, документ состояния и запись 036 журнала.
Прежний JSON сохранён; он относится к выровненным кадрам и не является
результатом полного независимого приёмника.
## Карта архитектуры
1. Базовый Rs задан в `experiments/lab043_hackrf_bpsk.py`: 20 000 символов/с.
Lab044 и Lab045 наследуют его, Lab047 явно проверяет аппаратную точку.
2. В Lab043 `SAMPLES_PER_SYMBOL = SAMPLE_RATE_HZ // SYMBOL_RATE`; Lab047
отдельно фиксирует 400. Lab049 теперь отвергает дробные частоты и
нецелое отношение, не округляя вход.
3. Жёсткие зависимости Lab043: `_refine_frame_start`, `_matched_filter_taps`,
`_matched_waveform`, `_preamble_timing_offset`, `_estimate_cfo_gain`,
`_evaluate_symbols`. Lab044: `_scale_and_carrier`,
`_preamble_reference_samples`. Lab045: длительности TransmissionPlan;
Lab046B: `_extract_soft_window` и `_decode_iq_candidate`. Временные шкалы
используют Rs, фильтры и индексы — samples/symbol. В локальном поиске
также есть фиксированные пределы ±800 и ±2000 выборок; они сохранены.
4. `shape_frame_like_lab042`, RRC-фильтр ядра, преобразования бит/BPSK,
фрагментация, packet/PHY header, FEC, перемежитель, CRC и сборка объекта
уже параметрические либо вообще не зависят от Rs.
5. `protocol/priority_scheduler.py`: строгий приоритет четырёх классов,
непрерываемая передача пакета и `LATEST_STATE` для ожидающих состояний.
Lab034–Lab036 добавили удаление устаревших изображений и изоляцию
видеокадров в собственных блоках FEC; это внешнее стирающее кодирование
видео, не новый свёрточный FEC Lab045.
6. Минимальная доработка: адаптер скорости и чтения синтетического IQ к
`lab046c_offline_recovery.stream_process_capture`, который используется
Lab048; разделение ожидания/доставки и активного окна/опустошения очереди.
Новый планировщик и изменения `protocol/` не потребовались.
## Проверка Lab033–Lab041
Сверены сохранённые отчёты этих лабораторий и связанные модули.
Lab033 подтверждает строгий приоритет и отдельно считает ожидание начала
и завершение передачи. Lab034: frame-aligned FEC изолирует удаляемое
изображение, начатый пакет не прерывается. Lab035–Lab036 ограничивают возраст
изображения и число ожидающих кадров. Lab037 подтверждает вставку управления
между пакетами VIDEO. Lab038–Lab040 добавляют failsafe, аварийную защёлку,
повторы и ACK; Lab041 — сеансы/перезапуски. Эти механизмы безопасности
в Lab049 не заменены и не заявлены как аппаратно проверенные.
CONTROL взят из последнего Lab041: `ControlStateMessage`, 36 байт, 20 Гц;
с 32-байтным LinkPacket — 68 байт и 10 880 бит/с до физического кодирования.
TELEMETRY наследуется из Lab037 через Lab038–Lab041: синтетические 64 байта,
10 Гц, с LinkPacket — 96 байт и 7680 бит/с. Отдельного формата физических
измерений телеметрии эти лаборатории не задают.
## Воспроизведённые несоответствия
Проверки выполнены независимыми `verifier` и `adversary`, без правок с их
стороны и без оборудования.
- Исходный `receive_iq_frame`: идеальный кадр 100 ксимв/с проходит CRC,
добавление 240 нулевых выборок перед ним даёт `PHY=False, CRC=NOT_REACHED`.
Поиск ограничивался двумя символами от известной TX-границы.
- Добавление +10 Гц к тому же кадру даёт `PHY=True, CRC=NOT_REACHED`;
+100 Гц — `PHY=False`. Остаточная частота не оценивалась.
- При 100 ксимв/с старый отчёт CONTROL max 47,980 мс описывал начало,
а получение пакета занимает 105,640 мс; пропущены 6 сроков CONTROL.
EMERGENCY: 30,240 мс до начала, 87,900 мс до получения — пропущен срок 50 мс.
- При 200 ксимв/с EMERGENCY через 1 мкс после VIDEO доставляется через
57,659 мс, а не за 50 мс. Штатный failsafe до получения пакета остаётся
в `normal`. Блокировка 28,83 мс и доставка почти 57,66 мс — разные метрики.
- На 20/50/100 ксимв/с в двухсекундном окне не доставлено ни одного
TELEMETRY. Единственное сообщение старой таблицы доставляется при
последующем опустошении очереди.
Регрессии воспроизводятся командой:
```powershell
python -m pytest tests/test_lab049_independent_iq.py -q
```
Исторический `receive_iq_frame` сохранён для локальных регрессий формы;
основной проход Lab049 его больше не использует. Старые тесты не изменены.
Новый RX получает полный поток, самостоятельно находит начало, оценивает CFO,
фазу и полярность. PRBS7, физические и пакетные форматы, FEC, CRC и порог
Lab047 `0.030964473262429237` сохранены.
RF TX = 0. Git add/commit/push/pull/fetch не выполнялись.