vision model

This commit is contained in:
2026-08-03 01:26:42 +07:00
parent 3f8f3a40ec
commit 8aa0c16359
26 changed files with 5795 additions and 0 deletions

140
vision_classifier/START.md Normal file
View File

@@ -0,0 +1,140 @@
# Полный запуск системы (трек 3)
Orange PI **192.168.31.225** · MQTT `test` / `1234` · RPM ленты **отрицательный** (`-200`)
---
## Стоп (сначала, если что-то уже крутится)
```bash
# 1) убить vision (иначе снова поднимет ленту)
pkill -f 'main.py' || true
# 2) остановить мотор
cd ~/workdir/vision_classifier
.venv/bin/python - <<'PY'
from paho.mqtt.client import Client, CallbackAPIVersion
import time
c = Client(CallbackAPIVersion.VERSION2, client_id='stop')
c.username_pw_set('test', '1234')
c.connect('127.0.0.1', 1883, 60)
c.loop_start(); time.sleep(0.3)
c.publish('motor/control/rpm', '0', qos=1)
time.sleep(0.3); c.loop_stop(); c.disconnect()
print('rpm=0')
PY
```
Или `Ctrl+C` в терминале `main.py` — при выходе сам шлёт `rpm=0`.
---
## Чеклист перед стартом
1. **Питание** конвейера / драйвера / ESP32 включено.
2. **RealSense D415** в USB3 (`lsusb | grep -i RealSense`).
3. **Mosquitto** на Orange PI:
```bash
docker ps | grep mosquitto
# должно быть 0.0.0.0:1883
```
4. **ESP32** в той же сети, в прошивке `MQTT_SERVER = "192.168.31.225"` (уже так).
5. Лента под камерой **пустая** (пока не стартовали фон/превью).
---
## Запуск — полный контур (камера → B/C/D → MQTT → лента + серво)
```bash
cd ~/workdir/vision_classifier
# превью JPEG + мотор + серво (рекомендуется)
PYTHONUNBUFFERED=1 ./run.sh --preview
```
Что должно появиться в логе:
```
[camera] RGB: /dev/video4
[camera] depth OK, valid≈…
[mqtt] подключено к 127.0.0.1:1883
```
После старта vision сам включает драйвер и крутит ленту с `motor.rpm: -200` из `config.yaml`.
### Куда смотреть во время работы
| Что | Где |
|-----|-----|
| Кадр RGB | `debug_frames/live_color.jpg` |
| Depth | `debug_frames/live_depth.jpg` |
| Решения LOCK | stdout + `logs/decisions.jsonl` |
| MQTT трафик | http://192.168.31.225:3000 (MQTT Explorer) |
| Зоны vision | топики `vision/feedback/*` |
Хвост логов:
```bash
tail -f logs/decisions.jsonl
# или фильтр по LOCK:
tail -f logs/decisions.jsonl | while read l; do echo "$l" | .venv/bin/python -c "import sys,json; d=json.loads(sys.stdin.read()); print(d.get('ts'), 'LOCK', d.get('zone'), d.get('dims_mm'), d.get('circle_ratio'), d.get('reason',''))"; done
```
### Зоны
| LOCK | Смысл | Серво (config) |
|------|--------|----------------|
| **B** | подходит | servo 0 idle |
| **C** | габариты вне 10…450×320×320 | servo 1 → 90° |
| **D** | круг `ratio ≥ 0.8` | servo 2 → 90° |
Кладите один объект в поле камеры, ждите строку `LOCK B/C/D`.
---
## Запуск без движения ленты (только зрение)
```bash
cd ~/workdir/vision_classifier
PYTHONUNBUFFERED=1 ./run.sh --preview --dry-route --no-motor --no-mqtt
```
JPEG всё равно обновляются в `debug_frames/`.
---
## Ручной тест ленты (без vision)
```bash
# нужен mosquitto_pub или python из .venv
mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/driver -m on
mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/tmc/enable -m on
mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/rpm -m -200
# стоп:
mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/rpm -m 0
```
---
## SCADA (опционально, параллельно)
```bash
cd ~/workdir/backend_control
# MQTT_BROKER = "192.168.31.225" или 127.0.0.1
python gui.py
```
---
## Если что-то не едет
| Проблема | Действие |
|----------|----------|
| Камера занята | `pkill -f main.py`; `fuser /dev/video0` |
| MQTT не коннектится | `docker ps \| grep mosquitto`, логин `test`/`1234` |
| ESP молчит | одна Wi‑Fi сеть, брокер **192.168.31.225:1883** |
| Лента в другую сторону | в `config.yaml` → `motor.rpm: -200` (минус обязателен) |
| Ложные LOCK на пустой ленте | уберите мусор/блики; при необходимости поднимите `min_object_height_mm` |
| Серво не те каналы | `routing.zones` в `config.yaml` |
Подробности сети/топиков: [INTEGRATION.md](INTEGRATION.md). Алгоритм: [README.md](README.md).