CHANGES: 1. README.md: - Added "3D Verification Checklist" section - Important note: must click "3D Digital Twin" toggle first - Desktop Chrome manual verification steps - Mobile verification checklist 2. BLACK_SCREEN_FIX_REPORT.md: - Updated Visual QA section with detailed test steps - Test 1-5: Initial load → 2D fallback → 3D toggle → Auto demo in 3D - Clarified: Browser MCP verified both 2D and 3D modes - Removed false claims, added honest limitations VERIFIED (Browser MCP): - ✅ 2D fallback works - ✅ 3D scene renders (WebGL available, FPS ~60) - ✅ Auto demo runs in 3D mode - ✅ NO BLACK SCREEN in both modes NOT VERIFIED (Requires manual check): - ⚠️ Desktop Chrome real device - ⚠️ Mobile real device (<640px) - ⚠️ STL model loading in production CONCLUSION: Black screen fix is solid (ErrorBoundary + throttled RAF works). 3D rendering confirmed via browser MCP. Full production verification requires desktop/mobile real device testing.
267 lines
12 KiB
Markdown
267 lines
12 KiB
Markdown
# OZON Tech Sorter Simulation
|
||
|
||
Интеллектуальная роботизированная система сортировки товаров (Frontend MVP).
|
||
|
||
Проект показывает полный цикл работы конвейера в формате **Product Demo**:
|
||
- распознавание товара (Mock CV);
|
||
- классификация по правилам (габариты, сечение);
|
||
- маршрутизация в зоны B/C/D;
|
||
- отработка аварийных ситуаций (Jam, Emergency Stop).
|
||
|
||
UI — **Product Demo Landing Page**:
|
||
- без горизонтального скролла на desktop / laptop / mobile;
|
||
- mobile-first адаптив (одна колонка < 640px);
|
||
- **3D digital twin** (React Three Fiber) + 2D SVG fallback;
|
||
- storyline Detection → Classification → Decision → Command → Routing;
|
||
- карточки сценариев и критериев OZON;
|
||
- Engineering Details свёрнуты по умолчанию.
|
||
|
||
## 3D Digital Twin
|
||
|
||
Главная сцена — цифровая модель программно-аппаратного комплекса:
|
||
|
||
A → подающий конвейер → накопитель → CV/laser/ultrasonic → stop-gate → actuator → B/C/D.
|
||
|
||
- Стек: `three` + `@react-three/fiber` + `@react-three/drei`.
|
||
- **Physics engine не используется** — motion по state machine / keyframe (предсказуемое демо).
|
||
- Архитектура (`itemMotion.ts`) готова к подключению physics позже.
|
||
- Переключатель: **3D Digital Twin** / **2D fallback**.
|
||
- На mobile (<640px) по умолчанию 2D; 3D можно включить вручную.
|
||
- Если WebGL недоступен — автоматический 2D fallback.
|
||
|
||
Что доказывает 3D:
|
||
- classification → `ROUTE_TO_*` → actuator motion → physical route;
|
||
- B зелёный прямой маршрут, C оранжевый roll-cage, D фиолетовый roll-cage;
|
||
- C priority при негабарите (даже если объект круглый);
|
||
- fault / emergency stop красной подсветкой и остановкой конвейера.
|
||
|
||
Проверка WebGL: Engineering Details → **3D capability check** (FPS, WebGL status).
|
||
|
||
### Автоматическая демонстрация
|
||
|
||
**Главная возможность** — Auto Demo:
|
||
- **ВАЖНО**: Сначала нажмите "3D Digital Twin" toggle для включения 3D (по умолчанию 2D fallback на первой загрузке)
|
||
- Нажмите "🎬 Запустить автодемо" для полного автоматического цикла
|
||
- Товар автоматически: появляется → сканируется → классифицируется → маршрутизируется в B/C/D
|
||
- Controls: Пауза/Продолжить, Остановить, Reset
|
||
- Режимы: Автоматический (по умолчанию) или ручной (Next step)
|
||
|
||
**3D Verification Checklist** (для защиты):
|
||
1. Открыть https://arhipovdan.ru/ в desktop Chrome/Edge
|
||
2. Нажать "3D Digital Twin" toggle
|
||
3. Проверить: 3D scene renders (green floor, A/B/C/D zones visible)
|
||
4. Нажать "🎬 Запустить автодемо"
|
||
5. Проверить: NO black screen, item moves, FPS stable (~60)
|
||
6. Открыть Console (F12): no errors
|
||
7. Проверить mobile (<640px): 2D fallback автоматически
|
||
|
||
**Реальные 3D модели** (6 STL, 55%):
|
||
- Бутылка, Тарелка, Цилиндр, Короб 300, Короб 400, ЛанчБокс
|
||
- Fallback primitives для heavy models (> 1 MB)
|
||
- Manifest: `src/data/modelAssets.ts`
|
||
|
||
## Стек
|
||
|
||
- Vite, React, TypeScript
|
||
- CSS/SVG (адаптивная сцена)
|
||
- Vitest для доменных тестов
|
||
- Docker + nginx (production static hosting)
|
||
|
||
## input_info
|
||
|
||
Проект разработан в соответствии с официальной постановкой задачи OZON Tech Track 3.
|
||
|
||
**Использованные материалы:**
|
||
- `Постановка_Задача_3_сжато_2.pdf` — полная постановка задачи (правила классификации, схема участка, критерии оценки)
|
||
- `doc-1783009942.pdf` — схема рабочей зоны с размерами A/B/C/D
|
||
- `doc-1783011400.pdf` — критерии оценки Track 3 (матрица баллов)
|
||
- `doc-1782987706.zip` → STEP модели тестовых товаров (11 шт)
|
||
- `doc-1782987733.zip` → STL модели тестовых товаров (11 шт)
|
||
|
||
**Тестовый набор товаров:**
|
||
Цилиндр, Шлем, Бутылка, Мешок, Тарелка, Короб 400×400×300, ЛанчБокс, Короб 300×200×200, Пуфик, Ручка, Моющее средство.
|
||
|
||
**Параметры классификации (согласно постановке):**
|
||
- Min dimensions: **10×10×2 мм**
|
||
- Max dimensions: 450×320×320 мм
|
||
- Roundness threshold: K ≥ **0.7**
|
||
- Conveyor speed: 1.00 м/с
|
||
- C-priority: габариты проверяются первыми
|
||
|
||
Подробный анализ: `docs/INPUT_INFO_ANALYSIS.md`
|
||
|
||
## Как открыть демо
|
||
|
||
Публично:
|
||
```text
|
||
https://arhipovdan.ru/
|
||
https://www.arhipovdan.ru/
|
||
```
|
||
|
||
Локально на сервере:
|
||
```text
|
||
http://127.0.0.1:3100/
|
||
```
|
||
|
||
## Как устроен новый UI
|
||
|
||
1. **Hero** — что это за система, CTA «Запустить демо», цепочка Detection → Routing.
|
||
2. **Product Demo** — 3D digital twin (или 2D fallback) + карточка результата + Start / Next / Reset.
|
||
3. **Storyline Stepper** — текущий этап цикла.
|
||
4. **Scenario Cards** — jury-кейсы карточками (кнопка «Показать»).
|
||
5. **Criteria Cards** — покрытие критериев OZON со ссылкой на сценарий.
|
||
6. **Engineering Details** — полные техпанели (state machine, sensors, PID, timeline, event log, criteria).
|
||
|
||
## Как запустить демо
|
||
|
||
1. Откройте сайт.
|
||
2. Нажмите **Запустить демо** в Hero или **Start demo** в блоке демо.
|
||
3. Нажимайте **Next step**, чтобы пройти цикл товара.
|
||
4. Выберите сценарий в карточках ниже (негабарит, круглый объект, jam и т.д.).
|
||
5. Для экспертов откройте **Инженерный режим** / **Engineering Details**.
|
||
|
||
## Где Engineering Details
|
||
|
||
Внизу страницы, секция **Engineering Details**. По умолчанию свёрнута. Кнопки «Инженерный режим» в header / hero / demo раскрывают блок и скроллят к нему. Внутри — полная сцена (`variant="full"`) и все инженерные панели.
|
||
|
||
## Как проверить mobile
|
||
|
||
1. Откройте DevTools → device toolbar.
|
||
2. Выберите `390×844` (или iPhone 12/13).
|
||
3. Проверьте:
|
||
- одна колонка;
|
||
- кнопки ≥ 44px;
|
||
- сцена масштабируется (`width: 100%`);
|
||
- нет horizontal scroll.
|
||
|
||
## Как проверить отсутствие horizontal scroll
|
||
|
||
В консоли браузера:
|
||
|
||
```js
|
||
document.documentElement.scrollWidth <= document.documentElement.clientWidth
|
||
```
|
||
|
||
Должно вернуть `true` на ширинах 1920, 1440 и 390.
|
||
|
||
## Запуск локально
|
||
|
||
```bash
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
## Запуск через 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.7, маршрут D.
|
||
- `c_priority` — негабарит + круглый → только C (приоритет габаритов).
|
||
- `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.7 (K = r_in / r_out);
|
||
- conveyor target speed: 1.00 м/с (close_items: 0.75 м/с).
|
||
|
||
## Исполнительная часть
|
||
|
||
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-панель (в Engineering Details) показывает упрощенную имитацию 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, сценарии, demo steps и OZON criteria.
|
||
|
||
## Документация
|
||
|
||
- `docs/ARCHITECTURE.md` — модули и поток данных.
|
||
- `docs/DEMO_SCRIPT.md` — сценарий защиты.
|
||
- `docs/SCENARIOS.md` — ожидаемые результаты сценариев.
|
||
- `docs/JURY_QA.md` — ответы на вопросы жюри.
|
||
- `docs/UI_UX_REDESIGN_AUDIT.md` — план редизайна UI.
|
||
- `docs/SUBMISSION_CHECKLIST.md` — checklist перед сдачей.
|
||
|
||
## Cursor rules
|
||
|
||
Локальные UI/UX rules в `.cursor/rules/`:
|
||
|
||
- `ui-ux-pro-max.mdc`
|
||
- `responsive-product-demo.mdc`
|
||
- `react-design-system.mdc`
|
||
- `accessibility-and-visual-qa.mdc`
|
||
|
||
## Ограничения 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 в отчет смены.
|