# Испытательный UDP-протокол ## 1. Назначение Этот backend нужен для испытаний, когда проект должен отправлять состояние цели в блок наведения по UDP в локальной сети. В проекте этот режим включается через: ```text AUTOPILOT_BACKEND = "proto_udp" PROTO_UDP_ENABLE = True ``` или через env: ```text FPV_AUTOPILOT_BACKEND=proto_udp FPV_PROTO_UDP_ENABLE=1 ``` ## 2. Куда это встроено Реализация находится в: - `autopilot_bridge.py` Новый backend называется: - `proto_udp` ## 3. Транспорт - протокол: UDP - адрес: `PROTO_UDP_HOST` - порт: `PROTO_UDP_PORT` По умолчанию: ```python PROTO_UDP_HOST = "127.0.0.1" PROTO_UDP_PORT = 5005 ``` ## 4. Формат пакета Формат упаковки: ```text если цели нет, все значения остаются нулевыми ## 7. Как вычисляются значения ### Смещение в пикселях Берется из guidance-точки: - `aim_x` - `aim_y` Относительно центра кадра: - `offset_x_px = aim_x - center_x` - `offset_y_px = center_y - aim_y` То есть знак сделан так, чтобы: - вправо было положительным; - вверх было положительным. ### Смещение в процентах Нормируется к половине размера кадра: - по X к `frame_w / 2` - по Y к `frame_h / 2` И затем ограничивается до `-100..100`. ### Площадь bbox Используются: - `box_w` - `box_h` - `frame_w` - `frame_h` Формула: ```text bbox_area_pct = 100 * (box_w * box_h) / (frame_w * frame_h) ``` ## 8. Включение в локальном запуске ### PowerShell ```powershell $env:FPV_AUTOPILOT_BACKEND = "proto_udp" $env:FPV_PROTO_UDP_ENABLE = "1" $env:FPV_PROTO_UDP_HOST = "192.168.1.50" $env:FPV_PROTO_UDP_PORT = "5005" python main.py ``` ### Bash ```bash export FPV_AUTOPILOT_BACKEND=proto_udp export FPV_PROTO_UDP_ENABLE=1 export FPV_PROTO_UDP_HOST=192.168.1.50 export FPV_PROTO_UDP_PORT=5005 python3 main.py ``` ## 9. Включение в Docker В `docker-compose.yml`: ```yaml FPV_AUTOPILOT_BACKEND: "proto_udp" FPV_PROTO_UDP_ENABLE: "1" FPV_PROTO_UDP_HOST: "192.168.1.50" FPV_PROTO_UDP_PORT: "5005" ``` ## 10. Пример приема пакета на Python ```python import socket import struct sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("0.0.0.0", 5005)) while True: data, addr = sock.recvfrom(1024) descriptor, object_id, target_state, off_y_px, off_x_px, off_y_pct, off_x_pct, bbox_area_pct = struct.unpack( "