Lab049: define ELRS control and SDR video architecture
This commit is contained in:
450
docs/lab049_crsf_elrs_architecture.md
Normal file
450
docs/lab049_crsf_elrs_architecture.md
Normal file
@@ -0,0 +1,450 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user