feat: enhance sorter simulation demo
This commit is contained in:
189
README.md
189
README.md
@@ -2,91 +2,20 @@
|
||||
|
||||
Инженерный frontend MVP для задачи хакатона OZON Tech: «Интеллектуальная роботизированная система сортировки товаров».
|
||||
|
||||
Приложение показывает 2D/SVG dashboard сортировочной линии: конвейер, рабочую зону 6000 x 10000 мм, зоны A/B/C/D, датчики, stop-gate, боковые толкатели, движение товаров, классификацию, маршрутизацию, state machine, метрики, PID-виджет и event log.
|
||||
Проект показывает 2D/SVG dashboard сортировочной линии: рабочую зону 6000 x 10000 мм, конвейер шириной 500 мм, зоны A/B/C/D, roll-cage C/D, датчики, stop-gate, толкатели, классификацию, маршрутизацию, timeline цикла, PID-имитацию, метрики и event log.
|
||||
|
||||
## Архитектура решения
|
||||
## Стек
|
||||
|
||||
- Vite + React + TypeScript.
|
||||
- Доменная логика вынесена в `src/domain`.
|
||||
- Mock-данные товаров и сценариев находятся в `src/data`.
|
||||
- UI собран из независимых панелей в `src/components`.
|
||||
- Визуализация линии выполнена на SVG без Three.js и тяжелой 3D-графики.
|
||||
- Vite
|
||||
- React
|
||||
- TypeScript
|
||||
- SVG/CSS для инженерной 2D-сцены
|
||||
- Vitest для доменных тестов
|
||||
- Docker + nginx для production static hosting
|
||||
|
||||
## Логика классификации
|
||||
Нет Three.js, backend, реального ML и тяжелых UI-библиотек.
|
||||
|
||||
Классификация реализована чистой функцией `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.
|
||||
|
||||
## Локальный запуск
|
||||
## Запуск локально
|
||||
|
||||
```bash
|
||||
npm install
|
||||
@@ -95,7 +24,7 @@ npm run dev
|
||||
|
||||
Открыть: http://127.0.0.1:3100/
|
||||
|
||||
## Запуск на сервере
|
||||
## Запуск через Docker
|
||||
|
||||
```bash
|
||||
docker compose -p owl -f docker-compose.server.yml up -d --build
|
||||
@@ -107,25 +36,97 @@ Compose публикует только loopback-порт:
|
||||
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
|
||||
|
||||
- Физика движения упрощена до дискретной state-machine симуляции.
|
||||
- PID-регулятор имитационный, без точной модели двигателя и нагрузки.
|
||||
- CV, laser и ultrasound генерируют псевдоизмерения на основе mock-данных.
|
||||
- Нет backend, real-time API и сохранения событий.
|
||||
- Нет Three.js и полноценного digital twin в 3D.
|
||||
- Физика движения дискретная, без динамической модели массы/трения.
|
||||
- CV является pseudo-CV по mock-данным.
|
||||
- PID упрощен до демонстрации стабилизации скорости.
|
||||
- Нет backend, real-time API, сохранения событий и реального ML.
|
||||
- Нет 3D digital twin.
|
||||
|
||||
## Что улучшить дальше
|
||||
|
||||
- Добавить backend с WebSocket-телеметрией.
|
||||
- Подключить реальные ML/CV модели или replay датасетов.
|
||||
- Сделать режим ручного управления исполнительными механизмами.
|
||||
- Добавить тесты доменной логики и сценариев.
|
||||
- Расширить физическую модель очереди, зазоров и jam recovery.
|
||||
- Добавить экспорт event log и отчеты по SLA сортировки.
|
||||
- Добавить WebSocket-телеметрию и replay реальных событий.
|
||||
- Подключить реальные CV-модели или датасеты.
|
||||
- Добавить режим manual override для gate/pushers.
|
||||
- Расширить модель очереди, spacing и recovery после jam.
|
||||
- Экспортировать event log в отчет смены.
|
||||
|
||||
Reference in New Issue
Block a user