# OZON Tech Sorter Simulation Инженерный frontend MVP для задачи хакатона OZON Tech: «Интеллектуальная роботизированная система сортировки товаров». Проект показывает 2D/SVG dashboard сортировочной линии: рабочую зону 6000 x 10000 мм, конвейер шириной 500 мм, зоны A/B/C/D, roll-cage C/D, датчики, stop-gate, толкатели, классификацию, маршрутизацию, timeline цикла, PID-имитацию, метрики и event log. ## Стек - Vite - React - TypeScript - SVG/CSS для инженерной 2D-сцены - Vitest для доменных тестов - Docker + nginx для production static hosting Нет Three.js, backend, реального ML и тяжелых UI-библиотек. ## Запуск локально ```bash npm install npm run dev ``` Открыть: http://127.0.0.1:3100/ ## Запуск через Docker ```bash docker compose -p owl -f docker-compose.server.yml up -d --build ``` Compose публикует только loopback-порт: ```yaml 127.0.0.1:3100:80 ``` ## Проверка домена ```bash curl -I http://127.0.0.1:3100/ curl -I https://arhipovdan.ru/ curl -I https://www.arhipovdan.ru/ ``` ## Сценарии - `normal_flow` — обычный поток B/C/D. - `oversized_item` — max dimensions нарушены, маршрут C. - `round_object` — габариты проходят, roundness >= 0.8, маршрут D. - `boundary_dimensions` — проверка min/max границ. - `close_items` — предупреждение spacing/queue, последовательная обработка. - `low_confidence` — низкий CV confidence, rule-based fallback. - `jam` — застревание у gate, FAULT, остановка конвейера. - `emergency_stop` — EMERGENCY_STOP, остановка всех движений. ## Классификация Классификация реализована чистой функцией `classifyItem`. 1. Проверяются габариты. 2. Если нарушены min/max размеры, категория C. 3. Если габариты подходят, проверяется `roundness`. 4. Если `roundness >= 0.8`, категория D. 5. Иначе категория B. 6. Если товар одновременно негабаритный и круглый, приоритет у C, потому что dimensions check идет первым. Границы MVP: - min: width >= 10 мм, depth >= 10 мм, height >= 2 мм; - max: width <= 450 мм, depth <= 320 мм, height <= 320 мм; - roundness threshold: 0.8. ## Исполнительная часть State machine управляет циклом: - `MOVING_TO_CAMERA` - `DETECTING` - `MOVING_TO_GATE` - `WAITING_AT_GATE` - `CLASSIFYING` - `ROUTE_TO_B/C/D` - `RETURN_HOME` - `FAULT` - `EMERGENCY_STOP` Датчики имитируются по mock-данным: camera bbox/confidence/CV latency, laser measured height, ultrasonic gate detection. Stop-gate закрывается перед классификацией, открывается для B и удерживает товар для C/D перед толкателями. ## Simplified PID PID-панель показывает упрощенную имитацию control loop: - target speed; - actual speed; - error; - correction; - mini graph последних тиков скорости. В normal flow actual speed приближается к target. В `jam` и `emergency_stop` target становится 0, actual speed визуально падает к 0. ## Тесты ```bash npm run test ``` Покрыты classifier, PID и целостность сценариев. ## Документация - `docs/ARCHITECTURE.md` — модули и поток данных. - `docs/DEMO_SCRIPT.md` — 3-5 минутный сценарий защиты. - `docs/SCENARIOS.md` — ожидаемые результаты сценариев. - `docs/JURY_QA.md` — короткие ответы на вопросы жюри. ## Ограничения MVP - Физика движения дискретная, без динамической модели массы/трения. - CV является pseudo-CV по mock-данным. - PID упрощен до демонстрации стабилизации скорости. - Нет backend, real-time API, сохранения событий и реального ML. - Нет 3D digital twin. ## Что улучшить дальше - Добавить WebSocket-телеметрию и replay реальных событий. - Подключить реальные CV-модели или датасеты. - Добавить режим manual override для gate/pushers. - Расширить модель очереди, spacing и recovery после jam. - Экспортировать event log в отчет смены.