# Docker Runtime

## Что собирается

Один GPU-образ для `fpv_tracker_optimized` с уже встроенными:

- `torch` + `torchvision` для CUDA 12.8
- `ultralytics`
- `opencv`
- `pymavlink`
- `pyserial`
- моделью `best.pt`
- локальным `bytetrack_min_aggressive.py`

После сборки контейнер может запускаться без интернета.

## Сборка

```bash
docker compose build
```

## Запуск

```bash
docker compose up
```

## Основные env-переменные

- `FPV_SOURCE`
  Примеры: `"0"`, `"rtsp://192.168.1.10:8554/live"`, `"udp://@0.0.0.0:5600"`, `"/data/input/test.mp4"`
- `FPV_MODEL_PATH`
- `FPV_SHOW_OUTPUT`
- `FPV_SAVE_INFER_VIDEO`
- `FPV_OUT_VIDEO_PATH`
- `FPV_GUIDANCE_EXPORT_ENABLE`
- `FPV_GUIDANCE_EXPORT_PATH`
- `FPV_AUTOPILOT_ENABLE`
- `FPV_AUTOPILOT_BACKEND`
  Значения: `json`, `mavlink`, `msp`, `proto_udp`

## Испытательный UDP-протокол

Включение:

```yaml
FPV_AUTOPILOT_BACKEND: "proto_udp"
FPV_PROTO_UDP_ENABLE: "1"
FPV_PROTO_UDP_HOST: "192.168.1.50"
FPV_PROTO_UDP_PORT: "5005"
```

Пакет отправляется в формате little-endian:

```text
<BBBhhbbB
descriptor
object_id
target_state
offset_y_px
offset_x_px
offset_y_pct
offset_x_pct
bbox_area_pct
```

`target_state`:

- `0` — цели нет
- `1` — цель есть и идет по детекции
- `3` — детекция пропала, работает трекинг/удержание

## Важные замечания

- Для GPU нужен установленный NVIDIA Container Toolkit на хосте.
- На Linux USB-камера обычно пробрасывается как `/dev/video0`.
- На Windows Docker Desktop прямой доступ Linux-контейнера к обычной webcam часто недоступен. В этом случае лучше использовать `RTSP`, `UDP` или внешний capture-источник, который виден контейнеру как сеть.
- `SHOW_OUTPUT=1` внутри headless-контейнера обычно не нужен. По умолчанию он выключен.
