Files
SDR-Rover/docs/lab049_crsf_elrs_architecture.md
2026-09-08 13:26:06 +03:00

451 lines
42 KiB
Markdown
Raw Permalink 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.
# Lab049: CRSF / ExpressLRS и отдельный SDR-видеоканал
Состояние на 8 сентября 2026 года. SOFTWARE + ARCHITECTURE ONLY, RF TX = 0.
Решение по результатам аудита: **сохранить стандартный ELRS для управления,
а SDR оптимизировать под изображения и объёмные данные**. Смешанная модель
CONTROL 20 Гц + TELEMETRY 10 Гц, каждый в полном видеокадре, остаётся
историческим стресс-тестом; она не определяет бюджет этой архитектуры.
## Источники и границы доказанного
Проверены официальный [последний релиз ExpressLRS 4.1.0](https://github.com/ExpressLRS/ExpressLRS/releases/tag/4.1.0)
от 17 июля 2026 года и его
[коммит a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6](https://github.com/ExpressLRS/ExpressLRS/commit/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6).
Версия исходников не означает, что такая прошивка уже стоит у пользователя.
Ссылки ниже закреплены на этом коммите; страницы документации проверены в дату отчёта.
Локальная база: main, HEAD `ac6cc792b896e34f7dd6d291955a0387fdafcf41`.
До работы уже были изменены журнал и индекс, присутствовали незакоммиченные
Lab049, её тесты и результаты, а также сторонние локальные файлы. Они сохранены.
README описывает старую точку Lab042 и диапазон 200–250 МГц; текущая постановка
пользователя уточняет будущий SDR-видеоканал как примерно 180 МГц.
Физические модели RadioMaster, ELRS TX/RX и их диапазон пока не указаны.
Поэтому приведено сравнение, а не назначение конкретных настроек оборудования.
Инвентаризация и аппаратная проверка не выполнялись. Совместимость системы
ниже — архитектурная, сопряжение с контроллером ровера ещё не реализовано.
## Что уже есть в проекте
Аудит README, PROJECT_LOG, LABS_INDEX, Lab033–Lab041, Lab047–048 и связанных
модулей дополняет [предыдущий аудит Lab049](lab049_audit.md).
| Код / лаборатории | Для чего создавался | Что сохраняется при отдельном ELRS |
|---|---|---|
| `protocol/link_packet.py`, `priority_scheduler.py`; Lab033 | Один абстрактный непрерываемый ресурс для двух направлений, EMERGENCY > CONTROL > TELEMETRY > VIDEO, последнее ожидающее состояние | Историческая модель и регрессии; не размещаем её CONTROL/TELEMETRY в бюджете SDR |
| `video_frame_scheduler.py`, Lab034–036 | Удаление устаревшего видео, допуск целого изображения, ограничение очереди, FEC-блоки в пределах изображения | Нужны принципы возраста и ограничения очереди; сопряжение с нынешним JPEG/PHY ещё предстоит |
| Lab037, `control_repetition.py` | Повторы управления, потери и видео в одном канале, удаление дубликатов | Тестовые сценарии потерь; собственные повторы не накладываются автоматически поверх ELRS |
| Lab038, `control_failsafe.py`, `emergency_ack.py` | Таймер свежей команды, остановка, подтверждение аварии | Локальный контроль потери управления и идемпотентная аварийная остановка остаются обязательными |
| Lab039, `two_stage_failsafe.py` | Две ступени замедления/торможения, кинематика | Автомат и сценарии; тормозные параметры реального ровера пока не измерены |
| Lab040, `persistent_emergency.py` | Намерение остановить сохраняется после ACK; отдельный подтверждённый сброс | Смысл аварийной защёлки и запрет самовозобновления; перенос наземного автомата на обычный пульт не выполнен |
| Lab041, `control_messages.py`, `session_state.py` | Сеансы, загрузки, эпохи, номера команд, защита от старых ACK/reset | Сохранить свойства; CRSF не предоставляет эти поля автоматически |
| Lab047–048, Lab049 IQ | JPEG как двоичный объект, независимый PHY/FEC/CRC, производительность | Доказательная база отдельного SDR-видеоканала |
Синтетические 64 байта TELEMETRY из Lab037 и собственные сообщения CONTROL
Lab041 не являются форматами CRSF. Модули `protocol/` и старые тесты не менялись.
## Одна схема системы
```mermaid
flowchart TB
subgraph RC[Управление и критическая телеметрия]
RM[RadioMaster: стики и переключатели] <-->|CRSF| ETX[Штатный ExpressLRS TX]
ETX <-->|ELRS OTA: поддерживаемый аппаратурой диапазон| ERX[Штатный ExpressLRS RX]
ERX <-->|CRSF UART| R[Контроллер ровера]
R --> S[Локальный таймер, аварийная защёлка, торможение]
S --> M[Приводы]
end
subgraph VIDEO[Независимый SDR video/data]
C[Камера] --> J[JPEG; будущий видеокодек]
J --> STX[SDR передатчик]
B[Объёмные данные ровера] --> STX
STX -->|Будущий RF около 180 МГц; лабораторная база 1400 МГц| SRX[SDR приёмник]
SRX --> D[Декодер изображения] --> O[Экран оператора]
end
```
При пропаже ELRS продолжающееся видео **не продлевает разрешение движения**.
Таймер, тормозной автомат и аварийная защёлка должны работать независимо от
очередей видео, загруженности декодера и доступности экрана.
Частота 180 МГц относится к будущему SDR-тракту, не к стандартному ELRS.
Это целевая архитектура; готовый двухканальный ровер пока не испытан.
## CRSF на проводных границах
По [спецификации TBS](https://github.com/tbs-fpv/tbs-crsf-spec/blob/main/crsf.md):
кадр содержит sync/address, длину, тип, данные и CRC8 (полином 0xD5).
Длина считает тип, данные и CRC, исключая первые два байта; полный кадр ≤64 байт.
Расширенный заголовок добавляет destination и origin.
| Тип | Содержание | Данные / полный кадр, байт |
|---|---|---:|
| 0x16 | 16 RC-каналов по 11 бит | 22 / 26 |
| 0x14 | Статистика связи | 10 / 14 |
| 0x08 | Батарея | 8 / 12 |
| 0x02 | GPS | 15 / 19 |
| 0x1E | Ориентация | 6 / 10 |
| 0x21 | Режим, строка с завершающим нулём | переменный |
| 0x28–0x2D, 0x32 | Обнаружение, параметры, команды/ACK | переменный, расширенный |
Пульт↔модуль: обычно однопроводный полудуплекс, 400 кбод, 8N1, 3,3 В;
приёмник↔контроллер: двухпроводный полный дуплекс, без инверсии,
в спецификации 416666 бод, 8N1, 3,0–3,3 В.
У ELRS штатная настройка UART приёмника — **420000 бод**:
[официальная Web UI](https://www.expresslrs.org/quick-start/webui/#receiver-options).
Настройки обеих сторон должны совпадать. Расчёт сериализации 26 байт при
420000 бод: 26×10/420000 = 0,619 мс; это только провод, не радиозадержка.
[SerialCRSF::sendRCFrame](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/src/rx-serial/SerialCRSF.cpp)
упаковывает текущие каналы в 0x16 только при `frameAvailable`.
Это не сквозная пересылка исходных CRSF-байтов через эфир: ELRS сначала
кодирует OTA, затем RX заново формирует CRSF. Статистика и сообщения
контроллера идут отдельными кадрами. Не все 16 выходных полей обновляются
по радио одновременно; часть может содержать состояние, полученное ранее.
Для обычных стиков специальная прошивка RadioMaster не требуется: нужен
вариант с ELRS либо совместимый внешний ELRS-модуль и штатная настройка CRSF.
Вариант RadioMaster с другим внутренним RF-модулем сам по себе ELRS не даёт.
Нужен RX с доступным CRSF UART, общий поддерживаемый диапазон и совместимая
версия ELRS; конкретную пару ещё надо выбрать. См.
[настройку передатчика](https://www.expresslrs.org/quick-start/transmitters/lua-howto/).
Программное сопряжение CRSF с ровером остаётся будущей задачей.
## ELRS в эфире
[OTA.h](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/lib/OTA/OTA.h)
задаёт OTA4 = **8 байт**, OTA8 = **13 байт**, включая служебные поля и CRC.
Это длина содержимого радиопакета ELRS, не весь физический расход LoRa/FLRC/GFSK.
RC-пакеты, DATA, SYNC и LINK имеют разные назначения; 26 байт CRSF не следует
подставлять вместо этих размеров. Поле DATA в
[telemetry_protocol.h](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/include/telemetry_protocol.h)
содержит **5 либо 10 байт**, а не 8/13 байт пользовательской нагрузки.
Точные периоды и Std взяты из
[ExpressLRS_AirRateConfig](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/src/common.cpp).
Таблица ниже рассчитана для установившегося соединения, без потерь,
без повторных режимов D/DK; RC означает возможности отправки, не измеренные обновления стиков.
| Режим | Доступность | OTA, байт | Период, мс | Std | TLM-слотов/с | RC-возможностей/с ≤ | Среднее / верхнее ожидание RC, мс |
|---|---|---:|---:|---:|---:|---:|---:|
| 25 | 900 | 8 | 40 | 1:8 | 3,125 | 21,875 | 25 / 80 |
| 50 | 900 и 2,4 | 8 | 20 | 1:16 | 3,125 | 46,875 | 11,250 / 40 |
| 100 | 900 | 8 | 10 | 1:32 | 3,125 | 96,875 | 5,313 / 20 |
| 100 Full | 900 и 2,4 | 13 | 10 | 1:32 | 3,125 | 96,875 | 5,313 / 20 |
| 150 | 2,4 | 8 | 6,666 | 1:32 | 4,688 | 145,327 | 3,541 / 13,332 |
| 200 | 900 | 8 | 5 | 1:64 | 3,125 | 196,875 | 2,578 / 10 |
| 250 | 2,4; 900 на LR1121 | 8 | 4 | 1:64 | 3,906 | 246,094 | 2,063 / 8 |
| 333 Full | 2,4 | 13 | 3,003 | 1:128 | 2,602 | 330,399 | 1,525 / 6,006 |
| 500 LoRa | 2,4 | 8 | 2 | 1:128 | 3,906 | 496,094 | 1,016 / 4 |
| F1000 / K1000 | 2,4, SX128X / LR1121 | 8 | 1 | 1:128 | 7,813 | 992,188 | 0,508 / 2 |
| K1000 Full | 900, LR1121 | 13 | 1 | 1:128 | 7,813 | 992,188 | 0,508 / 2 |
Это представительная, не исчерпывающая таблица. Также существуют F500,
900 200 Full на LR1121, D50, D250/D500, DK250/DK500 и двухдиапазонные X-режимы;
аппаратные ограничения описаны в
[официальном руководстве Packet Rate](https://www.expresslrs.org/quick-start/transmitters/lua-howto/#packet-rate-and-telemetry-ratio).
Для внешнего модуля 333 Гц и выше требуется скорость связи с пультом выше 400 кбод.
Не все режимы доступны одному и тому же RX.
Full повышает число полноразмерных каналов в OTA. В режиме 8ch каналы 1–8
передаются вместе; 16ch Rate/2 делит частоту пополам; 12ch Mixed оставляет
первые четыре быстрыми, остальные передаёт с половинной частотой.
Hybrid/Wide передают дополнительные переключатели по очереди.
Поэтому аварийный орган нельзя без проверки помещать в медленно обновляемую группу.
Источник: [Switch Configs, варианты 4.x](https://www.expresslrs.org/software/switch-config/).
D50 повторяет команду четыре раза в слотах по 5 мс; D250/DK250 — четыре раза
по 1 мс, D500/DK500 — два. Называть их 200/1000 новыми командами в секунду нельзя.
Расчётчик отвергает повторные режимы вместо ложного пересчёта.
## Задержка управления и телеметрия
Обозначения: T — период RF-слота, D — знаменатель 1:D, f=1/T.
При фиксированном D телеметрии выделяется 1/D слотов, RC остаётся не более
f×(D−1)/D возможностей. До произвольного ближайшего RF-слота среднее ожидание
T/2, верхняя граница T. Если исключить каждый D-й слот под TLM, промежутки
между RC равны T или 2T; при равномерной временной фазе среднее ожидание
T×(1/2+1/D), верхняя граница 2T. Это наши аналитические расчёты, проверенные
независимым перечислением интервалов в тестах.
[TX-планировщик](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/src/tx_main.cpp)
заменяет часть передач RC на SYNC и активный DATA uplink; телеметрийные
слоты освобождаются для обратного направления. Стандартный Std зависит от режима,
Race выключает телеметрию при вооружении, служебный обмен может временно
изменить отношение до 1:2. Следовательно, 2T — граница только упрощённого
расписания RC/TLM, **не гарантия реального ELRS**. Потери или разрыв связи
вообще не имеют такой конечной верхней границы доставки.
Пример 100 Full (T=10 мс), все величины ниже вычислены тем же расчётчиком:
| TLM | Доля слотов | TLM/с | RC/с ≤ | Ожидание RC среднее / верхнее, мс | DATA с учётом LINK ≤ байт/с |
|---|---:|---:|---:|---:|---:|
| Off | 0% | 0 | 100 | 5 / 10 | 0 |
| 1:128 | 0,78125% | 0,781 | 99,219 | 5,078 / 20 | 6,250 |
| 1:64 | 1,5625% | 1,563 | 98,438 | 5,156 / 20 | 12,500 |
| 1:32 Std | 3,125% | 3,125 | 96,875 | 5,313 / 20 | 25,000 |
| 1:16 | 6,25% | 6,250 | 93,750 | 5,625 / 20 | 54,167 |
| 1:8 | 12,5% | 12,500 | 87,500 | 6,250 / 20 | 116,667 |
| 1:4 | 25% | 25 | 75 | 7,500 / 20 | 241,667 |
| 1:2 | 50% | 50 | 50 | 10 / 20 | 492,000 |
Предварительный кандидат для программной модели ровера — **100 Full, 8ch,
TLM 1:8**, если выбранная пара его поддерживает: достаточно быстрые каналы
стиков/остановки и больше места служебным сообщениям, чем при Std.
Это не назначенная конфигурация и не доказательство сроков аварии/ACK.
Для 900 МГц при приоритете чувствительности следует сравнить 50 и обычный 100;
для 2,4 ГГц — 50/100 Full/150. Окончательный выбор требует моделей TX/RX,
диапазона, требований к дальности и отдельного измерения задержек/потерь.
Чувствительность действительно меняется: официальные ориентиры для 2,4 ГГц
50/100 Full/250/500 — −115/−112/−108/−105 dBm, для 900 МГц 50/100/100 Full —
−120/−117/−112 dBm. Это параметры режимов из
[официальной таблицы](https://www.expresslrs.org/software/mavlink/#throughput-per-rf-mode),
а не обещание дальности. ELRS-дальность и будущая дальность SDR на 180 МГц
проверяются отдельно; дальнее видео не компенсирует короткий радиус управления.
Полная цепь задержки управления: считывание стиков → цикл RadioMaster →
CRSF к TX → ожидание слота и OTA → RX → CRSF к роверу → цикл управления →
привод. Она **не измерена**. К рассчитанному ожиданию нельзя приписывать
название stick-to-rover latency.
## Сколько данных в штатной телеметрии и почему это не видео
Верхний предел одного тракта DATA: P×f/D байт/с, P=5 либо 10.
[RX-планировщик 4.1.0](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/src/rx_main.cpp)
чередует LINK и серию DATA. LINK занимает четыре байта статистикой,
оставляя 1/6 байт DATA. При постоянной насыщенной очереди:
B=max(1, floor(512×floor(f)/D/1000)−1), средний предел
C=(f/D)×(P−4/(B+1)). Это учёт слотов, а не гарантированный полезный поток:
CRC/служебные поля OTA уже вычтены размером P; добивка, подтверждения,
повторы DATA, потери и заголовки переносимых CRSF/MAVLink снижают результат.
При низкой частоте TLM цель LINK раз в 512 мс сама по себе не гарантируется.
Даже предельно щедрая оценка K1000 Full, 1:2 даёт 5000 байт/с на один тракт
до LINK; условное удвоение для двух DATA-трактов даёт 10000 байт/с. Уже
**JPEG 3 кадра/с требует 26172 байт/с**, то есть больше даже такого потолка.
[Официальные оценки MAVLink](https://www.expresslrs.org/software/mavlink/#throughput-per-rf-mode)
при 1:2: 100 Full около 435 байт/с, 333 Full около 1470,
F1000 около 2375; K1000 Full около 4420, Gemini около 8845 байт/с.
Последнее — 70,76 кбит/с, против 209,376 кбит/с одного JPEG payload при 3 кадрах/с.
Это документированные оценки специального режима MAVLink, не наши замеры
и не обещание доступного JPEG-сокета у обычного CRSF RX.
**STANDARD ELRS VIDEO CAPABILITY = INSUFFICIENT.**
Телеметрию разделяем так:
| Класс | Путь | Реализация и бюджет |
|---|---|---|
| Качество RC-связи: LQ, RSSI, SNR | Штатный ELRS LINK → RadioMaster; CRSF к роверу | Поддерживается ELRS, но не подтверждает выполнение команды |
| Напряжение/батарея | Контроллер → CRSF → ELRS DATA → RadioMaster | Формат 0x08 предусмотрен; датчик и выдачу значений должен реализовать контроллер |
| Аварийная защёлка, режим ровера, подтверждение критического действия | Тот же ELRS/CRSF обратный путь | Семантика, события, идентификаторы и отображение на пульте ещё не согласованы/реализованы; 0x21/0x32 не дают их автоматически |
| Большие диагностические структуры и сенсорные массивы | SDR data/video | Отдельный будущий ограниченный бюджет и политика возраста, нагрузка пока не задана |
Для масштаба: батарея 12 байт CRSF дважды в секунду требует 24 байт/с.
При 100 Full Std расчётный потолок после LINK всего 25 байт/с до прочих потерь:
запаса почти нет. При 1:8 потолок 116,667 байт/с. Предлагаемый начальный лимит
периодической служебной нагрузки — 50 байт/с **включая CRSF-заголовки**;
остаток не объявляется гарантированным: нужны измерения и резерв событий/повторов.
Критические события должны опережать периодические датчики в будущей очереди
контроллера. TLM 1:8 даёт слот раз в 80 мс: ACK за 50 мс здесь не обещается.
Остановка происходит локально по управляющему тракту и не ждёт обратного ACK.
Off/Race не подходят для требуемой постоянной критической телеметрии.
## Связь с безопасностью Lab038–Lab041
Здесь сформулирован контракт будущего сопряжения, код CRSF/bridge не написан.
1. Ровер стартует с запрещённым движением; после загрузки, пропажи RC или
аварии одно появление старого положения стиков не разрешает движение.
Нужны безопасное положение органов и явное новое разрешение оператора.
2. Команда остановки поступает через быстрый RC-орган ELRS/CRSF. Локальная
защёлка сохраняет остановку независимо от последующих стиков; ACK только
сообщает о ней. Снятие защёлки и разрешение движения — отдельные действия.
Обычный тумблер пульта не заменяет весь `PersistentEmergencyController`.
3. Таймер свежести управления не обновляется от JPEG, LINK statistics,
напряжения, DATA или любого произвольного CRSF-кадра. На потерю допустимого
управления реагируют существующие ступени торможения. Пороги Lab039
100/200 и 150/250 мс являются исследованными модельными вариантами,
не измеренными тормозными нормативами ровера; здесь они не изменены.
4. `ground_session_id`, `rover_boot_id`, `control_epoch`, `sequence_number`,
идентификаторы аварии/сброса Lab041 отсутствуют в RC 0x16. Локально
присвоенный номер приёма доказывает порядок UART-событий, но не свежесть
источника, защиту от повтора или подлинность команды. CRC этого не заменяет.
Binding/model match также нельзя объявлять эквивалентом автомата Lab041.
5. В [SendRCdataToRF](https://github.com/ExpressLRS/ExpressLRS/blob/a9d4a9cb5b5687c4c9d7e9e7fbdf44ad93651da6/src/src/tx_main.cpp)
порог давности последнего RC от пульта — 1000000 мкс. При остановке
обновлений RadioMaster до этого порога TX может посылать прежнее состояние.
Приём регулярных UART RC-кадров не обеспечивает исходную свежесть за
100/200 мс. Сценарий требует отдельного решения и проверки всей цепи;
нормальное неизменное положение стика нельзя считать отказом только
потому, что значения равны предыдущим.
6. На возобновление соединения, reboot RX/контроллера, старый reset/ACK,
удерживаемый разрешающий тумблер и отсутствие обратной телеметрии нужны
воспроизводимые проверки. До них `SAFETY INTEGRATION = NOT VALIDATED`.
Автомат Lab041 нельзя просто обойти синтезом «нового сеанса» на каждый пакет.
Таким образом, отдельный ELRS устраняет конкуренцию с видеокадрами, но сам
по себе не доказывает безопасность готового ровера. Сохранённые модули и
их тесты остаются эталоном свойств для последующей реализации.
## Видео: фактическая упаковка контрольного JPEG
Объект [Lab047](../data/processed/lab047/tx_image.jpg): 8724 байта, RGB 320×240,
SHA-256 `e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a`.
JPEG не перекодирован. [Расчётчик](../experiments/lab049_crsf_elrs_budget.py)
вызывает настоящие `build_object_frames` и `build_transmission_plan` из
[Lab046](../experiments/lab046_bpsk_object_transport.py) /
[Lab045](../experiments/lab045_hackrf_bpsk_fec.py), не генерируя IQ.
| Ступень на одно изображение | Объём |
|---|---:|
| JPEG | 8724 байта |
| 36 фрагментов: заголовки по 12 байт + 60 байт добивки последнего | 9216 байт нагрузки пакетов |
| 36 пакетов по 268 байт: ещё 12 байт заголовка/CRC на пакет | 9648 байт |
| Свёрточный FEC R=1/2, шесть хвостовых бит на пакет | 154800 кодированных бит |
| PHY-заголовки 144×36 | 5184 бит |
| Преамбулы 1280×36 | 46080 бит |
| Передаваемые биты BPSK, сумма | 206064 бит |
| Защитные интервалы + хвост фильтра (32+10)×36 | 1512 интервалов без новых бит |
| Полное занятие радио | **207576 символьных интервалов** |
Перемежитель длину не меняет. Внешний стирающий FEC старого видеопланировщика
Lab034 сюда дополнительно не добавлен: в доказанном потоке Lab047 его нет.
Радиосимвол BPSK несёт один передаваемый бит, но защитный интервал не является
битом. Поэтому ниже отдельно показаны поток передаваемых бит и минимальная
символьная скорость с учётом всего занятого времени. Это расход текущего
формата; он не переносится на ELRS и не включает новую модуляцию.
| Цель | JPEG, байт | Только JPEG, байт/с | Только JPEG, кбит/с | Передаваемые BPSK-биты, кбит/с | Требуемая PHY с защитными интервалами, ксимв/с | RX: изображений/с; RF-кадров/с | Максимум обслуживания RX на изображение | Предложенный предел полной задержки* |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| 3 кадра/с, промежуточно | 8724 | 26172 | 209,376 | 618,192 | **622,728** | 3; 108 | 333,33 мс | 333,33 мс |
| 5 кадров/с, следующий ориентир | 8724 | 43620 | 348,960 | 1030,320 | **1037,880** | 5; 180 | 200 мс | 200 мс |
| 10 кадров/с, дальнейший ориентир | 8724 | 87240 | 697,920 | 2060,640 | **2075,760** | 10; 360 | 100 мс | 100 мс |
*Предел полной задержки предложен как один период изображения. Это открытое
инженерное допущение, **не утверждённый пользователем предел безопасности и
не измеренная характеристика**. RX service budget — необходимая средняя
производительность последовательного обработчика, не разрешение занять этим
весь сквозной бюджет. Измерение хвостов распределения задержки также необходимо.
Числа PHY — нижние границы при отсутствии потерь, повторов и объёмной нагрузки,
весь ресурс отдан видео. На границе ёмкости нет запаса от роста очереди.
Произвольные 20 CONTROL + 10 TELEMETRY из SDR **не вычитаются**.
Когда появятся объёмные данные, расчётчик принимает их явно как расход
символьных интервалов в секунду. Если занято 20% ресурса, требуемая PHY
для того же видео возрастает в 1/0,8=1,25 раза — это пример, не выбранный резерв.
Точные требуемые скорости выше проверенных 200 ксимв/с; их работоспособность
и допустимое число выборок/символ при Fs=8 Мвыб/с не доказаны этой арифметикой.
## Текущая ёмкость и фактическая обработка
Замеры переиспользованы из
[independent/result.json](../data/processed/lab049/independent/result.json),
SHA-256 `8a2c799a9754cf439159ebd68f3d77212200a391ecfdbd3520c312a71a4e49b3`.
Полный тяжёлый IQ-опыт на этом архитектурном этапе повторно не запускался.
Расчётчик проверяет SHA JPEG, число кадров и согласие длительности с текущим PHY.
| Rs, ксимв/с | Полезно в идеале, кбит/с | JPEG в эфире, с | Идеальные кадры/с без RC-резерва | Измеренная обработка шумного IQ, с | Длительность IQ, с | Обработка/IQ | JPEG в этом шумном сценарии |
|---|---:|---:|---:|---:|---:|---:|---|
| 20 | 6,724 | 10,37880 | 0,09635 | 173,65057 | 10,45802 | 16,60454 | Нет, 6/36 |
| 50 | 16,811 | 4,15152 | 0,24088 | 5,72980 | 4,23074 | 1,35433 | Точный, 36/36 |
| 100 | 33,622 | 2,07576 | 0,48175 | 7,76244 | 2,15498 | 3,60210 | Точный, 36/36 |
| 200 | 67,245 | 1,03788 | 0,96350 | 8,17573 | 1,11710 | 7,31872 | Точный, 36/36 |
Шумной модели заданы одинаковые coded-bit Eb/N0=7 dB, CFO +10 Гц, фаза 0,73 рад,
чередование полярности и фиксированные seeds. Порог независимого приёмника
Lab047 сохранён: 0.030964473262429237. Это один программный сценарий,
не оценка дальности и не аппаратное подтверждение ускоренных режимов.
Исторический [Lab048](lab048_current_state.md): 15 с записи → 13,966058 с
обработки при 20 ксимв/с, отношение 0,931071. Это реальное время только на
той сохранённой записи. В нынешней шумной модели ни один режим не успевает;
для 5 кадров/с нужен RX как минимум 180 RF-кадров/с, а не нынешние 36 за
5,73–8,18 с. Производительность нельзя линейно экстраполировать по Rs.
При неизменном Fs вход остаётся 8 Мвыб/с, но число кандидатов и полезных
кадров возрастает. 50 ксимв/с — полезная точка для профилирования, а не цель видео.
## Движение и задержка изображения
Расчёт расстояния: d=(v/3,6)/fps. Все числа — метры между моментами съёмки
при постоянной скорости, не тормозной путь и не полный возраст изображения.
| Скорость | 1 кадр/с | 3 кадра/с | 5 кадров/с | 10 кадров/с |
|---|---:|---:|---:|---:|
| 10 км/ч | 2,778 | 0,926 | 0,556 | 0,278 |
| 15 км/ч | 4,167 | 1,389 | 0,833 | 0,417 |
| 25 км/ч | 6,944 | 2,315 | 1,389 | 0,694 |
При 25 км/ч ещё 200 мс возраста показанной сцены соответствуют 1,389 м
пройденного пути. Потому 3 кадра/с — только промежуточный минимум;
конечная цель **больше 3**, следующий практический ориентир 5, дальнейший 10.
| Участок сквозной задержки | Что известно сейчас |
|---|---|
| Съёмка/экспозиция/считывание камеры | Не измерено; сейчас готовый JPEG |
| Кодирование JPEG | Не измерено в живом тракте; перекодирование здесь не выполнялось |
| Радиоочередь | В расчёте ёмкости нулевая; живая очередь не реализована/не измерена |
| Передача RF | Рассчитанное время из фактической формы 10,37880 / 4,15152 / 2,07576 / 1,03788 с |
| Поиск и обработка RX | Измерены вместе со сборкой и JPEG decode в таблице выше |
| Декодирование JPEG | Входит в общее время RX; отдельно не выделено, второй раз не прибавляется |
| Очередь экрана/отрисовка | Не измерено |
Полная задержка L = capture + encode + queue + RF + RX + JPEG decode + display.
Сложение RF и имеющегося общего RX описывает последовательную обработку
после накопления записи, не измеренный потоковый конвейер. Для такого
варианта на 50 ксимв/с известная часть уже 4,15152+5,72980=9,88132 с,
плюс неизвестные стадии; реального измерения камера→экран пока нет.
Предложение для следующего проектирования: при 5 кадрах/с L≤200 мс,
например не более 100 мс на радио и оставшиеся 100 мс суммарно на прочие
стадии. Тогда по нынешнему формату требуется уже ≥2075,760 ксимв/с,
а не 1037,880: минимальный потоковый битрейт сам по себе задержку не обеспечивает.
Это иллюстративное распределение бюджета, которое предстоит проверить.
Удаление устаревших изображений ограничит возраст очереди, но не ускорит PHY.
## Если отказаться от отдельного ELRS
Перенос CRSF-семантики на SDR означал бы собственные радиомодем,
синхронизацию, дуплекс/планировщик, повторения, контроль потерь и весь путь
безопасности. Стандартный ELRS RX такой SDR-поток не декодирует; для
RadioMaster понадобился бы совместимый проводной адаптер/модуль.
Теряются готовая OTA-совместимость и доказанная работа штатной пары ELRS.
Это уже не стандартный ExpressLRS. Пользователь такой переход не запросил;
в данной Lab049 он не реализуется.
## Следующий этап и воспроизведение
Рекомендуемый Lab050 — **программный потоковый SDR-видеотракт и профиль RX**:
тот же JPEG, независимый непрерывный поиск, ограничение возраста/очереди,
измерение стадий обработки и проверка выполнимости 5 кадров/с по вычислениям
и PHY. Начать с профиля существующих 50/100/200 ксимв/с; отделить стоимость
поиска ложных кандидатов от FEC и сборки. Не объявлять ускорение успешным
до полного CRC/SHA и устойчивой очереди. Для CRSF отдельно подготовить
контракт безопасности и сценарии отказов; реализация сопряжения требует
следующей согласованной постановки и уточнения аппаратуры.
Позднее сравнить разрешение, grayscale, JPEG quality, ROI, более лёгкий
кодек и межкадровые/дельта-данные. Контрольная картинка не окончательна,
но в этой работе ни один из этих параметров не менялся.
```powershell
python experiments/lab049_crsf_elrs_budget.py
python -m pytest tests/test_lab049_crsf_elrs_budget.py -q -p no:cacheprovider
python tools/quick_gate.py
python -m pytest tests/ -q
git diff --check
```
Машинный результат: [crsf_elrs_budget.json](../data/processed/lab049/crsf_elrs_budget.json).
Он хранит источники, версию, допущения, SHA исходных замеров, расходы PHY,
таблицы ELRS, видео и движения. Старые JSON не перезаписаны.
Итог: 35 расчётных тестов PASS; quick_gate PASS — 606 тестов и 13 функциональных
проверок; полный pytest — 606 passed за 64,32 с, одно предупреждение о доступе
к `.pytest_cache`; git diff --check PASS. Дополнительный ruff недоступен:
модуль не установлен. Verifier независимо подтвердил числа и источники;
adversary подтвердил семь проверок сеансов и локальный watchdog при живом видео.
Сквозная безопасность CRSF/ELRS остаётся непроверенной, поскольку сопряжения нет.
RF TX = 0. HackRF и другое оборудование не запускались.
Git add/commit/push/pull/fetch не выполнялись. STOP.