The gate now runs pytest as well, so one command answers whether the code base is broken: syntax, protocol imports, the 125 core tests, then the lab functional suites. It fails when a test fails, verified by feeding it a deliberately broken test. Two leftovers from moving the labs into experiments/ are fixed: the lab command still pointed at tests/, and the hook only watched protocol and tests, so edits under experiments/ and tools/ triggered nothing. Profiling the 3.6 s gate: 0.24 s syntax, 0.12 s imports, 0.61 s pytest, 2.7 s lab functional suites, of which Lab042's software loopback is 1.14 s because it pushes a whole image through the chain. The pytest addition is the small part. prepare_jpeg is now cached, since six checks call it and each call re-encoded the image at several qualities. README described the gate without the tests it now runs.
180 lines
11 KiB
Markdown
180 lines
11 KiB
Markdown
# SDR Rover Link
|
||
|
||
## 1. Назначение проекта
|
||
|
||
**SDR Rover Link** — учебно-исследовательский проект по разработке цифрового радиоканала для наземного робототехнического комплекса с использованием программно-определяемого радио — SDR, Software Defined Radio.
|
||
|
||
Проект должен пройти полный путь от передачи простого текстового пакета до передачи телеметрии и изображений через реальный радиоканал.
|
||
|
||
Основная задача — не только получить работающую систему, но и последовательно изучить все этапы цифровой радиосвязи: формирование данных, разбиение на пакеты, контроль целостности, исправление ошибок, цифровую модуляцию, формирование IQ-сигнала, передачу через SDR, приём, демодуляцию и восстановление исходных данных.
|
||
|
||
---
|
||
|
||
## 2. Целевой сценарий
|
||
|
||
| Параметр | Требование |
|
||
|---|---|
|
||
| Дальность связи | до 10 км |
|
||
| Скорость ровера | до 25 км/ч |
|
||
| Прямая радиовидимость | может отсутствовать |
|
||
| Рабочий диапазон | 200–250 МГц, см. Запись 018 журнала |
|
||
| Основной тип данных | телеметрия, команды и изображения |
|
||
| Формат изображения | JPEG |
|
||
| Действие при потере связи | безопасная остановка ровера |
|
||
|
||
Дальность 10 км без прямой видимости — целевое исследовательское требование, а не гарантированная характеристика первой версии.
|
||
|
||
---
|
||
|
||
## 3. Почему не используется обычное FPV-видео
|
||
|
||
Типовые FPV-системы работают в диапазонах 2,4 и 5,8 ГГц. Для наземного робота это плохо: велики потери у поверхности земли, сильное затенение рельефом и растительностью, а главное — на таких частотах практически нет дифракции, поэтому за препятствием связь пропадает.
|
||
|
||
В этом проекте вместо непрерывного видеопотока передаются отдельные сжатые изображения, что резко снижает требуемую скорость канала.
|
||
|
||
---
|
||
|
||
## 4. Текущее состояние
|
||
|
||
**Выполнено:** лабораторные Lab001–Lab041. Пройден путь от структуры пакета до сеансов связи с защитой от пакетов предыдущего сеанса.
|
||
|
||
Что реализовано и проверено:
|
||
|
||
- пакетный протокол с CRC32, фрагментация и сборка изображений;
|
||
- модуляция и демодуляция BPSK, формирующий фильтр, кадровая синхронизация, оценка и коррекция ухода несущей;
|
||
- блочное исправление стираний над GF(256), перемежение, подбор параметров;
|
||
- приоритетное обслуживание команд, телеметрии и видео;
|
||
- двухступенчатая безопасная остановка, сторожевой таймер, постоянное аварийное намерение, безопасный сброс;
|
||
- идентификаторы сеанса, безопасный запуск, отклонение пакетов предыдущего сеанса.
|
||
|
||
**Что ещё не сделано:** передатчик ни разу не включался. Весь тракт проверен на моделях и на приёме, но не в эфире.
|
||
|
||
**Ближайшая работа:** Lab042 — передача JPEG через кабельную петлю на одном PlutoSDR. Техническое задание: [docs/lab042_hardware_loopback_spec.md](docs/lab042_hardware_loopback_spec.md).
|
||
|
||
Хронология решений и результатов: [PROJECT_LOG.md](PROJECT_LOG.md).
|
||
|
||
---
|
||
|
||
## 5. Оборудование
|
||
|
||
| Позиция | Состояние |
|
||
|---|---|
|
||
| **Pluto+** — приёмопередатчик, чип AD9361, 70 МГц – 6 ГГц | есть |
|
||
| RTL-SDR — приёмный донгл | есть |
|
||
| Аттенюатор AT30S, 30 дБ, SMA | есть |
|
||
| Кабели SMA, штыревые антенны | есть |
|
||
| Усилитель мощности около 1 Вт | планируется после первых испытаний |
|
||
| Raspberry Pi как бортовой вычислитель | планируется |
|
||
|
||
Устройство подключается по USB и появляется в системе как сетевой адаптер с адресом `192.168.2.1`.
|
||
|
||
**Проверять связь с Pluto командой `ping` бесполезно.** При активном VPN трафик уходит в туннель, и «успешный» отклик приходит даже от несуществующего адреса. Достоверна только успешная установка контекста `iio.Context("ip:192.168.2.1")`.
|
||
|
||
---
|
||
|
||
## 6. Установка окружения
|
||
|
||
Расчётная часть работает на компьютере без SDR:
|
||
|
||
```bash
|
||
python -m pip install -r requirements.txt
|
||
```
|
||
|
||
Для лабораторных, работающих с устройством, дополнительно:
|
||
|
||
```bash
|
||
python -m pip install -r requirements-hardware.txt
|
||
```
|
||
|
||
Версии зафиксированы по проверенному окружению, Python 3.13.
|
||
|
||
---
|
||
|
||
## 7. Как запускать
|
||
|
||
**Быстрые проверки ядра** — секунды, оборудование не нужно:
|
||
|
||
```bash
|
||
python -m pytest tests/ -q
|
||
```
|
||
|
||
**Дешёвый шлюз** — синтаксис, импорт `protocol`, быстрые проверки ядра и функциональные проверки лабораторных. Отвечает на один вопрос: не сломана ли кодовая база прямо сейчас:
|
||
|
||
```bash
|
||
python tools/quick_gate.py
|
||
```
|
||
|
||
**Лабораторный эксперимент** — минуты, пишет результаты в `data/processed/`:
|
||
|
||
```bash
|
||
python -m experiments.lab041_session_restart_safety
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Структура репозитория
|
||
|
||
```text
|
||
SDR_Rover
|
||
├── protocol/ реализация протокола и радиотракта
|
||
├── experiments/ лабораторные Lab001–Lab041
|
||
├── tests/ быстрые автоматические проверки
|
||
├── tools/ вспомогательные программы и шлюз
|
||
├── docs/ технические задания и исследования
|
||
├── data/ исходные данные и результаты
|
||
├── rover/ пока пусто
|
||
├── ground_station/ пока пусто
|
||
└── gnuradio/ пока пусто
|
||
```
|
||
|
||
### `protocol`
|
||
|
||
Ядро системы. Пакет с CRC32, фрагментация изображений, кадр канала, исправление стираний, приоритеты, аварийная логика, сеансы связи, примитивы BPSK-радиотракта.
|
||
|
||
### `experiments`
|
||
|
||
Лабораторные работы. Это исследовательские программы: они моделируют канал, выполняют сотни повторов, строят CSV, графики и отчёты. **Быстрыми тестами они не являются.** При импорте создают каталоги и пишут файлы, поэтому импортировать их не следует — для повторного использования кода служит `protocol/`.
|
||
|
||
### `tests`
|
||
|
||
Настоящие быстрые проверки `protocol/`. Выполняются за доли секунды, оборудования не требуют, запускаются через `pytest`.
|
||
|
||
### `rover`, `ground_station`, `gnuradio`
|
||
|
||
Каталоги созданы под будущую прикладную часть и пока пусты. Бортовая программа ровера, программа наземной станции и схемы GNU Radio появятся после того, как радиоканал заработает в эфире.
|
||
|
||
---
|
||
|
||
## 9. Данные
|
||
|
||
- `data/raw` — исходные данные. Крупные записи отсчётов и видео в репозиторий не помещаются, исходные изображения лабораторных хранятся.
|
||
- `data/processed` — результаты лабораторных: CSV, отчёты и графики.
|
||
|
||
**Ограничение воспроизводимости.** Исходное видео `data/raw/lab026_rover_source.mp4` (около 7,8 МБ) в репозитории не хранится. Без него Lab026 и Lab027 не запускаются, файл нужно получить отдельно.
|
||
|
||
---
|
||
|
||
## 10. Принципы разработки
|
||
|
||
1. Каждый новый термин сначала объясняется, затем используется.
|
||
2. Каждый этап завершается работающим результатом.
|
||
3. Радиоканал и пакетный протокол разрабатываются отдельно.
|
||
4. Код проверяется автоматическими тестами.
|
||
5. Все существенные решения фиксируются в журнале.
|
||
6. Сложность увеличивается постепенно.
|
||
7. Испытания по эфиру начинаются только после проверки через модель.
|
||
8. Передатчик сначала проверяется через аттенюатор или эквивалент нагрузки.
|
||
9. **Каждое число в отчёте должно вычисляться из измерений текущего запуска.** Перенесённые из других лабораторных величины сопровождаются указанием источника. Вписанные вручную результаты недопустимы.
|
||
|
||
Девятое правило добавлено после аудита достоверности, см. Запись 017 журнала.
|
||
|
||
---
|
||
|
||
## 11. Автор
|
||
|
||
Антон
|
||
|
||
НИЯУ МИФИ
|
||
|
||
2026
|