# Конвейеры модулей

Логика обработки данных на сервере собирается в визуальном редакторе модулей: модули перетаскиваются на рабочее поле, их порты соединяются линиями. Описание самих модулей и их портов — на странице [Веб-интерфейс управления роботами](https://docs.mephi-ai.ru/books/upravlenie-robotami-s-pomoshhiu-ii/page/veb-interfeis-upravleniia-robotami); здесь — готовые схемы соединения для типовых задач.

## Базовые правила

- Данные идут от **выхода** одного модуля ко **входу** другого; соединяются порты одного типа (`robot.video` → `robot.video`).
- Один выход можно соединить с несколькими входами — например, видео одновременно идёт в интерфейс и в YOLO.
- Изменения конвейера применяются без перезапуска сервера (hot reload).
- Для отладки подключите **ConsoleLogModule** к интересующему порту — все данные будут выведены в консоль сервера.

## Схема 1. Ручное управление (минимальная)

Оператор видит видео и телеметрию робота и управляет им.

```
┌───────────────┐ robot.video      ┌────────────────┐
│ RobotWSModule │ ───────────────▶ │ ClientIOModule │
│               │ robot.telemetry  │  (Web UI)      │
│               │ ───────────────▶ │                │
│               │ robot.connected  │                │
│               │ ───────────────▶ │                │
│               │ robot.disconnected                │
│               │ ───────────────▶ │                │
│               │ ◀─────────────── │                │
└───────────────┘  robot.command   └────────────────┘
```

## Схема 2. Детекция объектов поверх видео

Оператор управляет вручную, а YOLO подсвечивает найденные объекты.

```
                   robot.video   ┌────────────┐  yolo.detect   ┌────────────────┐
┌───────────────┐ ─────────────▶ │ YoloModule │ ─────────────▶ │                │
│ RobotWSModule │                └────────────┘                │ ClientIOModule │
│               │ robot.video, robot.telemetry, connected ...  │                │
│               │ ────────────────────────────────────────────▶│                │
└───────────────┘ ◀──────────────────────────────────────────── └────────────────┘
                                 robot.command
```

## Схема 3. Автономное управление по видео

Конвейер полного автономного контура: захват → детекция → трекинг → решение → команда, с логированием.

```
 Захват видео ─▶ Детекция (YOLO) ─▶ Трекинг объектов ─▶ Принятие решения ─▶ Команда устройству
 (RobotWSModule)  (YoloModule)                              │                (robot.command)
                                                            └──▶ Логирование (S3 + DB)
```

Запуск и остановка автоматического управления — командами `auto_run` / `auto_stop` из поля ввода команд на странице робота. Оператор в любой момент может нажать «Стоп».

## Схема 4. Запись датасета

Для сбора данных к источнику видео и телеметрии подключается модуль записи (VideoRecordModule). Запись включается командой `video_start_record` и останавливается командой `video_stop_record`.

```
┌───────────────┐ robot.video  ┌────────────────────┐
│ RobotWSModule │ ───────────▶ │ VideoRecordModule  │ ──▶ файл / S3
│               │              └────────────────────┘
│               │ robot.video, robot.telemetry ──────▶ ClientIOModule
└───────────────┘
```

## Отладка конвейера

| Проблема | Проверка |
|---|---|
| В интерфейсе нет видео | Соединён ли `robot.video` источника с ClientIOModule? Подключите ConsoleLogModule к `robot.video` |
| YOLO не выдаёт результатов | Идёт ли видео на вход YoloModule; есть ли объекты известных модели классов |
| Команды не доходят до робота | Соединён ли `robot.command` ClientIOModule с RobotWSModule; получил ли робот `Ready` |
| Высокая задержка | Не подключено ли слишком много тяжёлых модулей к одному потоку; загрузка GPU в мониторинге |