OZON Tech Sorter Simulation

Инженерный frontend MVP для задачи хакатона OZON Tech: «Интеллектуальная роботизированная система сортировки товаров».

Приложение показывает 2D/SVG dashboard сортировочной линии: конвейер, рабочую зону 6000 x 10000 мм, зоны A/B/C/D, датчики, stop-gate, боковые толкатели, движение товаров, классификацию, маршрутизацию, state machine, метрики, PID-виджет и event log.

Архитектура решения

  • Vite + React + TypeScript.
  • Доменная логика вынесена в src/domain.
  • Mock-данные товаров и сценариев находятся в src/data.
  • UI собран из независимых панелей в src/components.
  • Визуализация линии выполнена на SVG без Three.js и тяжелой 3D-графики.

Логика классификации

Классификация реализована чистой функцией classifyItem.

  1. Сначала проверяются допустимые габариты.
  2. Если товар нарушает min/max размеры, он относится к C.
  3. Если габариты подходят, проверяется roundness.
  4. Если roundness >= 0.8, товар относится к D.
  5. Иначе товар относится к B.
  6. Если объект одновременно негабаритный и круглый, приоритет остается у C.

Допустимые габариты MVP:

  • min: width >= 10 мм, depth >= 10 мм, height >= 2 мм;
  • max: width <= 450 мм, depth <= 320 мм, height <= 320 мм;
  • roundness threshold: 0.8.

Исполнительная часть

Симуляция отображает:

  • камеру с pseudo-CV, bounding box и confidence;
  • лазерный датчик высоты;
  • ультразвуковой датчик прибытия к stop-gate;
  • stop-gate с состояниями open/closed;
  • pusher C и pusher D со состояниями idle/extended/retracting;
  • маршруты B/C/D с цветовой индикацией;
  • предупреждения для close items и low confidence;
  • fault/emergency сценарии с остановкой конвейера.

State machine

Состояния MVP:

  • IDLE
  • MOVING_TO_CAMERA
  • DETECTING
  • MOVING_TO_GATE
  • WAITING_AT_GATE
  • CLASSIFYING
  • ROUTE_TO_B
  • ROUTE_TO_C
  • ROUTE_TO_D
  • RETURN_HOME
  • FAULT
  • EMERGENCY_STOP

Сценарии

  • normal_flow — обычный поток товаров B/C/D.
  • oversized_item — товар выходит за max dimensions и уходит в C.
  • round_object — товар проходит по габаритам, но имеет roundness >= 0.8 и уходит в D.
  • boundary_dimensions — товары на границах допустимых размеров.
  • close_items — два товара близко друг к другу, появляется warning queue/spacing.
  • low_confidence — confidence ниже 0.65, решение принимается rule-based.
  • jam — застревание у stop-gate, state FAULT, conveyor stopped.
  • emergency_stop — аварийная остановка, state EMERGENCY_STOP.

Метрики

Dashboard показывает:

  • processed count;
  • success count;
  • error count;
  • avg cycle time;
  • throughput items/min;
  • cv latency;
  • actuator latency;
  • queue length;
  • conveyor speed;
  • PID target speed;
  • PID actual speed.

Локальный запуск

npm install
npm run dev

Открыть: http://127.0.0.1:3100/

Запуск на сервере

docker compose -p owl -f docker-compose.server.yml up -d --build

Compose публикует только loopback-порт:

127.0.0.1:3100:80

Как проверить

curl -I http://127.0.0.1:3100/

Ограничения MVP

  • Физика движения упрощена до дискретной state-machine симуляции.
  • PID-регулятор имитационный, без точной модели двигателя и нагрузки.
  • CV, laser и ultrasound генерируют псевдоизмерения на основе mock-данных.
  • Нет backend, real-time API и сохранения событий.
  • Нет Three.js и полноценного digital twin в 3D.

Что улучшить дальше

  • Добавить backend с WebSocket-телеметрией.
  • Подключить реальные ML/CV модели или replay датасетов.
  • Сделать режим ручного управления исполнительными механизмами.
  • Добавить тесты доменной логики и сценариев.
  • Расширить физическую модель очереди, зазоров и jam recovery.
  • Добавить экспорт event log и отчеты по SLA сортировки.
Description
Repo for taem
Readme 174 MiB
Languages
TypeScript 66.6%
Python 23.5%
CSS 9.6%
Dockerfile 0.1%
Shell 0.1%