Files
ozone-tech_owl_prime/README.md
2026-08-02 22:51:41 +02:00

180 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OWL PRIME — Ozon Tech Track 3
## О проекте
OWL PRIME — инженерный контур предварительной сортировки товаров: веб-цифровой двойник конвейерной линии, классификация B/C/D, физическая маршрутизация в симуляции, рабочий CV-прототип на RealSense D415 и экспериментальный физический стенд.
Это не сертифицированный промышленный ПАК, а воспроизводимое решение хакатона: цифровой twin на проде, CV-прототип в репозитории, CAD/ассеты и документация для проверки судьями.
## Состав решения
1. **Web digital twin** — React/Three.js симуляция конвейера, измерения, classifier, diverters.
2. **CV-прототип**`cv/`: RealSense D415 + OpenCV → габариты / круг → B/C/D.
3. **CAD и runtime 3D** — авторский FreeCAD и GLB/STL для деплоя.
4. **Физический стенд** — лента, рама, камера над полотном, электроника/SCADA.
5. **Документация**`/documentation`, `docs/ENGINEERING.md`.
6. **Презентация**`presentation/Owl_Prime_Ozon_Tech_Track_3_FINAL.pdf`.
## Демо
**Production:** https://arhipovdan.ru
| Route | Назначение |
|---|---|
| `/` | Непрерывная симуляция |
| `/documentation` | Инженерный статус |
| `*` | Редирект на `/` |
- **Desktop:** интерактивный WebGL 3D.
- **Mobile:** облегчённый 2D fallback (как в текущем baseline).
Идентичность сборки: `/version.json`.
## Основные возможности
- непрерывный CAD-конвейер и STL-товары;
- цифровой этап камеры / измерения;
- rule-based classifier B/C/D;
- CAD-дивертеры LEFT/RIGHT (45° / +45°);
- физика Rapier (лента 1 м/с);
- CV-прототип depth→B/C/D (не в live web);
- инженерная документация в приложении.
## Правила классификации
Официальные границы (`official_sources/doc-1783095831.pdf`), реализованы в web (`src/domain/classifier.ts`) и CV (`cv/classify.py`):
1. Габариты строго **> 10×10×10 мм** и **< 450×320×320 мм**, иначе → **C**.
2. Если габариты OK и **K > 0.8** (круг) → **D**.
3. Иначе → **B**.
4. **C-priority:** негабарит + круг → только **C**.
5. Граница: **K = 0.8 не круг** (→ B, не D). Одинаково в web и CV.
## Архитектура
**Web**
```
Product → measurement (digital) → classifier → route → twin → B/C/D receiver
```
**CV**
```
RealSense D415 → depth → segmentation → L×W×H + K → B/C/D → optional MQTT
```
CV **не подключён** к https://arhipovdan.ru. Общее — домен правил B/C/D, не live-канал кадров.
## Технологии
| Слой | Стек |
|---|---|
| Web | React, TypeScript, Three.js / R3F, Rapier, Vite, Vitest, Playwright |
| CV | Python, OpenCV, RealSense D415 (V4L2), optional MQTT (`paho-mqtt`) |
## Структура репозитория
```
.github/ CI
3d_models/ Авторский CAD (conveer.FCStd)
cv/ CV-прототип RealSense + OpenCV
docs/ Engineering notes
e2e/ Playwright smoke/routes
input_info/ Официальные входные пакеты
official_sources/ PDF с границами classifier
presentation/ Финальная презентация (один PDF)
public/ Runtime GLB/STL/draco
src/ Web twin
```
Конфиги деплоя: `Dockerfile`, `docker-compose.server.yml`, `nginx.conf`, `package.json`.
## Запуск web
Node.js 20+.
```bash
npm ci
npm run dev # http://127.0.0.1:3100
npm test -- --run
npm run build
npm run preview # http://127.0.0.1:3100
```
## Запуск CV
Python 3.10+. Live-режим требует Intel RealSense D415 и ffmpeg.
```bash
cd cv
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp config.example.yaml config.yaml # MQTT выключен по умолчанию
# без камеры:
python test_classify.py
python test_geometry.py
# с камерой:
./demo.sh # HUD http://127.0.0.1:8080/
./run.sh --preview --no-mqtt --no-motor
```
Подробности: [`cv/README.md`](cv/README.md). `npm` CV-зависимости не ставит.
## Конфигурация
- `.env` **не** коммитится.
- Web: опционально `VITE_BUILD_COMMIT` / `VITE_BUILD_BRANCH` / `VITE_BUILD_RELEASE` для `/version.json`.
- CV: `cv/config.example.yaml` → локальный `cv/config.yaml` (gitignored). MQTT/motor/routing **disabled by default**. Секреты не хранить в Git.
## CAD и модели
| Файл | Роль |
|---|---|
| `3d_models/conveer.FCStd` | Авторский CAD |
| `public/models/sorter/conveyor-clean.glb` | Runtime конвейер |
| `public/models/*.stl` | Модели товаров |
Крупные материалы для сдачи дополнительно зеркалируйте в облако; runtime-ассеты для деплоя остаются в Git.
## Физика (текущий main)
- скорость ленты **1.0 м/с**;
- timestep **1/60 с**;
- CCD для лёгких/тонких тел;
- diverters 45° / +45°;
- полный contact-only junction sorting **не fully validated**.
## Проверка
```bash
npm ci && npm test -- --run && npm run build
# E2E: preview :3101 + e2e/routes.spec.ts + e2e/smoke.spec.ts
cd cv && python -m compileall . && python test_classify.py && python test_geometry.py
```
Актуальный релиз: unit **196/196**, build PASS, focused E2E PASS, CV compile + unit без камеры PASS. Прод: `/` и `/documentation` → 200.
## Ограничения
- инженерный прототип, не industrial-certified ПАК;
- CV не live-интегрирован в web;
- live CV требует D415; на CI — только unit/compile;
- параметры симуляции требуют калибровки на стенде;
- mobile — 2D lite fallback;
- облачная ссылка на доп. материалы — по решению владельца.
## Материалы
- Презентация: [`presentation/Owl_Prime_Ozon_Tech_Track_3_FINAL.pdf`](presentation/Owl_Prime_Ozon_Tech_Track_3_FINAL.pdf)
- Production: https://arhipovdan.ru
- Cloud folder: `[ДОБАВИТЬ ССЫЛКУ]`
## Статус
**`main` — каноническое полное решение.** Другие ветки исторические и не нужны для запуска web или CV.