Files
SDR-Rover/docs/LABS_INDEX.md
2026-09-08 14:15:36 +03:00

284 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Указатель лабораторных работ
Этот файл показывает, где находятся код, проверки, документы и данные
лабораторных работ. Он не заменяет отчёты и не дублирует большие IQ-записи.
Пути к внешним аппаратным данным приведены только там, где они уже зафиксированы
в документации проекта и существуют на текущем компьютере.
## Lab043
- **Цель:** воспроизводимый BPSK-канал HackRF -> HackRF с общей опорой,
независимой кадровой синхронизацией и измерением параметров радиотракта.
- **Статус:** рабочая точка BPSK и общий опорный генератор подтверждены;
дополнительные аппаратные ветви использовались для диагностики усиления,
непрерывности и асимметрии сигнала.
- **Основной эксперимент:**
[`experiments/lab043_hackrf_bpsk.py`](../experiments/lab043_hackrf_bpsk.py).
- **Основные проверки:**
[`tests/test_lab043_hackrf_bpsk.py`](../tests/test_lab043_hackrf_bpsk.py).
Дополнительные проверки находятся в файлах `tests/test_lab043_*.py`.
- **Документ состояния:**
[`docs/lab043_current_state.md`](lab043_current_state.md).
- **Обработанные данные:** каталоги
[`data/processed/lab043_diagnostics`](../data/processed/lab043_diagnostics),
[`lab043_hackrf_compare`](../data/processed/lab043_hackrf_compare),
[`lab043_hackrf_continuity`](../data/processed/lab043_hackrf_continuity),
[`lab043_hackrf_counter`](../data/processed/lab043_hackrf_counter) и
[`lab043_hackrf_gain_ladder`](../data/processed/lab043_hackrf_gain_ladder).
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab043_raw\`.
- **Журнал:** отдельной записи с темой Lab043 нет. Переход к Lab043 указан в
записи 020, а подтверждённая рабочая точка Lab043 используется и упоминается
в записях 021-024
([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab044
- **Цель:** передача произвольного протокольного пакета через реальный
BPSK-канал HackRF с независимым решением CRC.
- **Статус:** один аппаратный запуск, `RESULT C`; преамбула и PHY sync
восстановлены, пакет не дошёл до проверки CRC.
- **Основной эксперимент:**
[`experiments/lab044_hackrf_bpsk_packet.py`](../experiments/lab044_hackrf_bpsk_packet.py).
- **Основные проверки:**
[`tests/test_lab044_hackrf_bpsk_packet.py`](../tests/test_lab044_hackrf_bpsk_packet.py).
- **Документ состояния:**
[`docs/lab044_current_state.md`](lab044_current_state.md).
- **Обработанные данные:** отдельные результаты не сохранялись; каталог
[`data/processed/lab044`](../data/processed/lab044) содержит только
навигационный README.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab044_raw\20260831_140142_bpsk_packet\`.
- **Журнал:** подготовка в записи 021, аппаратный результат в записи 022
([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab045
- **Цель:** защищённый BPSK-кадр со свёрточным FEC R=1/2, K=7, перемежением,
мягким декодером Витерби, защищённым PHY-заголовком и CRC.
- **Статус:** аппаратный `RESULT A`; исправление реальных ошибок FEC доказано,
CRC пройден, полезная нагрузка восстановлена без ошибок.
- **Основной эксперимент:**
[`experiments/lab045_hackrf_bpsk_fec.py`](../experiments/lab045_hackrf_bpsk_fec.py).
- **Основные проверки:**
[`tests/test_lab045_hackrf_bpsk_fec.py`](../tests/test_lab045_hackrf_bpsk_fec.py).
- **Документ состояния:**
[`docs/lab045_current_state.md`](lab045_current_state.md).
- **Обработанные данные:** отдельные результаты не сохранялись; каталог
[`data/processed/lab045`](../data/processed/lab045) содержит только
навигационный README.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab045_raw\20260901_103434_bpsk_fec\`.
- **Журнал:** программная подготовка в записи 023, аппаратный результат в
записи 024 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046
- **Цель:** фрагментация произвольного бинарного объекта, передача его
несколькими независимо защищёнными кадрами Lab045 и аварийно-безопасная
сборка объекта.
- **Статус:** программная проверка завершена успешно; RF не запускался.
- **Основной эксперимент:**
[`experiments/lab046_bpsk_object_transport.py`](../experiments/lab046_bpsk_object_transport.py).
- **Основные проверки:**
[`tests/test_lab046_bpsk_object_transport.py`](../tests/test_lab046_bpsk_object_transport.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 025 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046A
- **Цель:** независимый поиск и приём нескольких кадров объекта в одном
непрерывном нормированном потоке мягких BPSK-значений.
- **Статус:** программная проверка завершена успешно; работа с IQ и
аппаратная проверка на этом этапе не выполнялись.
- **Основной эксперимент:** отдельного `lab046a_*.py` нет; реализация находится
в [`experiments/lab046_bpsk_object_transport.py`](../experiments/lab046_bpsk_object_transport.py).
- **Основные проверки:** отдельного `test_lab046a_*.py` нет; сценарии находятся
в [`tests/test_lab046_bpsk_object_transport.py`](../tests/test_lab046_bpsk_object_transport.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 026 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046B
- **Цель:** поиск и приём нескольких полных кадров Lab045 в одном непрерывном
сыром IQ-потоке без использования границ кадров передатчика.
- **Статус:** программная проверка завершена успешно; RF не запускался.
- **Основной эксперимент:**
[`experiments/lab046b_continuous_iq.py`](../experiments/lab046b_continuous_iq.py).
- **Основные проверки:**
[`tests/test_lab046b_continuous_iq.py`](../tests/test_lab046b_continuous_iq.py).
- **Документ состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md).
- **Обработанные данные:** отдельного каталога в `data/processed` нет.
- **Внешние аппаратные данные:** отсутствуют, поскольку этап программный.
- **Журнал:** запись 027 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab046C
- **Цель:** непрерывная аппаратная передача объекта 16 КиБ последовательностью
защищённых BPSK-кадров и независимое восстановление объекта из IQ-записи.
- **Статус:** полный аппаратный результат на 1400 МГц равен `RESULT A`:
принято 68/68 кадров, объект восстановлен без ошибок. Первый полный опыт на
1080 МГц сохраняется отдельно как исторический `RESULT C`.
- **Основной аппаратный эксперимент:**
[`experiments/lab046c_hackrf_bpsk_object.py`](../experiments/lab046c_hackrf_bpsk_object.py).
- **Автономная обработка сохранённых записей:**
[`experiments/lab046c_offline_recovery.py`](../experiments/lab046c_offline_recovery.py).
- **Основные проверки:**
[`tests/test_lab046c_hackrf_bpsk_object.py`](../tests/test_lab046c_hackrf_bpsk_object.py)
и
[`tests/test_lab046c_offline_recovery.py`](../tests/test_lab046c_offline_recovery.py).
- **Документы состояния:**
[`docs/lab046_current_state.md`](lab046_current_state.md) и отдельный отчёт
о короткой записи 1400 МГц
[`docs/lab046c_1400mhz_offline_reprocessing.md`](lab046c_1400mhz_offline_reprocessing.md).
- **Обработанные данные:** локально присутствуют каталоги
`data/processed/lab046c_offline_recovery` и
`data/processed/lab046c_1400mhz_offline`; в текущем состоянии Git их файлы
не отслеживаются.
- **Внешние аппаратные данные:**
`C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260901_145339_bpsk_object\`,
`C:\Users\user\Documents\SDR_Rover_RF_Check\20260901_172749_1400MHz\` и
`C:\Users\user\Documents\SDR_Rover_Lab046_raw\20260902_151819_1400MHz_full\`.
- **Журнал:** записи 028-032 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab047
- **Цель:** передача настоящего JPEG как обычного двоичного объекта через уже
проверенный транспорт Lab046 и восстановление файла с проверкой SHA-256 и
декодирования изображения.
- **Статус:** завершена успешно. В одном непрерывном аппаратном сеансе при
1400 МГц передан настоящий JPEG: 36/36 кадров, 19 ошибок кодированных бит до
FEC, 0 ошибок после FEC, CRC PASS/FAIL 36/0. Объект собран полностью,
SHA-256 совпал, Pillow декодирует JPEG RGB 320 x 240, ошибок байтов и битов
нет. `REAL RF JPEG TRANSPORT = PASS`.
- **Основной эксперимент:**
[`experiments/lab047_jpeg_object_transport.py`](../experiments/lab047_jpeg_object_transport.py).
- **Основные проверки:**
[`tests/test_lab047_jpeg_object_transport.py`](../tests/test_lab047_jpeg_object_transport.py).
- **Документ состояния:**
[`docs/lab047_current_state.md`](lab047_current_state.md).
- **Обработанные данные:** малые демонстрационные JPEG и отчёты находятся в
[`data/processed/lab047`](../data/processed/lab047). Большие потоки `cs8` и
сырые IQ там не хранятся.
- **Внешние аппаратные данные:** исходная RX-запись и результаты находятся в
`C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747`; большие
потоки `cs8` и сырые IQ в Git не добавляются.
- **История приёма:** первоначальная обработка остановилась до PHY/FEC/CRC по
`MAX_CANDIDATES_REACHED`. После исправления последовательной обработки один
полный автономный анализ исходной записи восстановил JPEG точно; порог
`0.030964473262429237` не менялся, второй RF-сеанс не выполнялся.
- **Журнал:** записи 033-034 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab048
- **Цель:** профилирование и ускорение доказанного автономного BPSK-приёмника
без изменения детектора, PHY, FEC, CRC и порога.
- **Статус:** завершена успешно только на сохранённой RX-записи Lab047;
обработка ускорена с 37,423910 до 13,966058 с, в 2,679633 раза. Для 15,0 с
эфира отношение времени обработки равно 0,931071:
`REAL-TIME CAPABLE = YES`.
- **Результат:** сохранены 36/36 кадров, FEC PASS 36/36, CRC PASS/FAIL 36/0,
полный JPEG, точный SHA-256, 0 ошибочных байтов и битов. Порог
`0.030964473262429237` не изменён.
- **Ограничение:** приблизительный пик памяти остаётся около 1,44 ГиБ из-за
16-миллионного блока грубого поиска; запас реального времени около 1,03 с.
- **Основной эксперимент:**
[`experiments/lab048_receiver_performance.py`](../experiments/lab048_receiver_performance.py).
- **Проверки:**
[`tests/test_lab048_receiver_performance.py`](../tests/test_lab048_receiver_performance.py).
- **Документ состояния:**
[`docs/lab048_current_state.md`](lab048_current_state.md).
- **Обработанные данные:** машинный результат и восстановленный JPEG находятся
в [`data/processed/lab048`](../data/processed/lab048).
- **RF:** новый радиосеанс не выполнялся, `RF TX = 0`.
- **Журнал:** запись 035 ([`PROJECT_LOG.md`](../PROJECT_LOG.md)).
## Lab049
- **Актуальная архитектура:** RadioMaster + штатные ELRS TX/RX, CRSF к контроллеру
ровера; независимый SDR для видео и объёмных данных. Будущий SDR около 180 МГц,
лабораторная база 1400 МГц. Это не перенос штатного ELRS на 180 МГц.
- **Аудит CRSF/ELRS:** официальный релиз 4.1.0, размеры OTA 8/13 байт,
реальные интервалы и доли телеметрии; ELRS недостаточно для JPEG >3 кадра/с.
- **Бюджет SDR:** RC/критическая телеметрия в отдельном ELRS не вычитаются.
20/50/100/200 ксимв/с дают в идеале 0,09635 / 0,24088 / 0,48175 / 0,96350 JPEG/с.
Для 3/5/10 требуются минимум 622,728 / 1037,880 / 2075,760 ксимв/с
по фактическому текущему PHY. 3 — промежуточный уровень; цель >3, ориентиры 5 и 10.
- **Задача предыдущего опыта:** 20/50/100/200 ксимв/с при Fs=8 Мвыб/с,
полный независимый IQ-приём и исторический стресс-тест общего канала.
- **Актуальный результат:** идеал — 36/36 во всех режимах. Шум Eb/N0=7 dB, CFO +10 Гц:
20 — 6/36, FAIL; 50/100/200 — точный JPEG 36/36, CRC 36/0, PARTIAL.
- **Полный приёмник Lab048:** processing/IQ 16,60454 / 1,35433 / 3,60210 / 7,31872;
ни один режим не успевает в реальном времени в шумном сценарии.
- **Исторические задержки общего канала:** блокировка 288,30 / 115,32 / 57,66 / 28,83 мс. Доставка EMERGENCY
в худшей фазе включает ещё один кадр; даже на 200 она требует почти 57,66 мс.
- **Исторический стресс-тест:** CONTROL 20 Гц и TELEMETRY 10 Гц в 30 полных
кадрах/с оставляли VIDEO только на 200. Это не целевая CRSF/ELRS-архитектура.
- **Диагностический PHY-кандидат:** 50 ксимв/с, 160 выборок/символ —
наименьшая вычислительная перегрузка среди точных шумных проходов. RF не разрешён.
- **Код:** [расчётчик ELRS/SDR](../experiments/lab049_crsf_elrs_budget.py),
[Lab049 IQ](../experiments/lab049_bpsk_symbol_rate.py),
[независимый IQ-адаптер](../experiments/lab049_independent_iq.py).
- **Тесты:** [35 расчётных](../tests/test_lab049_crsf_elrs_budget.py),
[исходные](../tests/test_lab049_bpsk_symbol_rate.py),
[регрессии IQ](../tests/test_lab049_independent_iq.py).
- **Отчёт:** [архитектура CRSF/ELRS](lab049_crsf_elrs_architecture.md),
[новый бюджет JSON](../data/processed/lab049/crsf_elrs_budget.json),
[состояние](lab049_current_state.md), [аудит](lab049_audit.md),
[JSON](../data/processed/lab049/result.json).
- **История:** [старый frame-aligned результат](../data/processed/lab049/frame_aligned_result.json)
не измерял полный независимый поиск. Журнал: записи 036–038.
- **Безопасность:** свойства Lab038–041 сохраняются; сопряжение CRSF ещё не проверено.
Видео не разрешает движение при потере ELRS. Модули protocol и прежние тесты сохранены.
- **Далее:** программный Lab050 — профиль RX, поток видео и ограничение возраста очереди.
- **RF:** RF TX = 0, STOP.
## Lab050
- **Цель:** последовательность JPEG через отдельный SDR-транспорт, ограничение
возраста изображения и блочный независимый IQ-приём. Управление ELRS отдельно.
- **База:** Lab049 закреплена коммитом
`cdf5396e807b83f82a264632dc46f71428fcd616`; Lab050 не добавлена в индекс и не коммитилась.
- **Переиспользовано:** планировщик Lab035 с LATEST_ONLY и завершением активного
изображения. Добавлены готовность JPEG отдельно от съёмки, произвольный предел
возраста и прогноз RX. Поздно готовый старый снимок не вытесняет свежий.
- **Профили:** A 320×240 RGB q35 — 8724 байта; B 160×120 RGB q35 — 2771;
C 128×96 RGB q25 — 1740; D 160×120 grayscale q30 — 2028. По 30
детерминированных сдвигов исходного фото; это не видео камеры.
- **Матрица:** 240 сценариев, вход 3/5/10 кадров/с, Rs=200/400/500/800/1000 ксимв/с,
MAX_VIDEO_AGE=200/333/500/1000 мс. Ожидающая очередь ≤1.
- **Идеальная модель:** C/500k — 5 или 10 свежих кадров/с, возраст около 92,6 мс.
При камере 10 и Rs=200k, возрасте 333 мс: 14 передач, 16 замен, 4,333 свежих
кадра/с внутри окна и один дополнительный после него.
- **Потоковый RX:** 24/24 RF-пакета и 3/3 точных JPEG до `finish` на каждой скорости;
IQ-память ограничена. В шумном опыте processing/RF = 44,322 / 147,986 /
170,374 / 295,095 / 333,865. Реального времени нет.
- **Память:** удерживаемые IQ 2,13–6,51 МиБ; расчёт массивов 47,5–143,4 МиБ,
не измеренный RSS. Состояние RX не растёт вместе с длиной сессии.
- **Достижимость:** 5/10 кадров/с без QPSK — CONDITIONAL. C≤1952 байт,
500 ксимв/с, стоимость RX-пакета ≤16/12 мс для модели возраста 200 мс;
требуется ещё примерно 144/192-кратное ускорение относительно этого замера.
- **Код:** [видеомодель](../experiments/lab050_video_stream.py),
[потоковый RX](../experiments/lab050_streaming_receiver.py).
- **Проверки:** [44 теста Lab050](../tests/test_lab050_video_stream.py),
quick_gate — 650 тестов и 14 функциональных проверок; независимые verifier/adversary.
- **Отчёт:** [состояние](lab050_current_state.md),
[JSON](../data/processed/lab050/result.json),
[замеры RX](../data/processed/lab050/receiver_benchmarks.json). Журнал: запись 039.
- **Далее:** Lab051 — профиль и ускорение строгой обработки ложных кандидатов.
- **RF:** RF TX = 0. Lab050 commit/push не выполнялись. STOP.
## Правило хранения данных
Большие записи IQ, потоки `cs8`, бинарные объекты и другие аппаратные исходные
данные остаются во внешних каталогах. В `data/processed` хранятся только
небольшие обработанные результаты или навигационные README. Пустые и
фиктивные файлы результатов не создаются.