Files
ozone-tech_owl_prime/vision_classifier/INTEGRATION.md
2026-08-03 01:26:42 +07:00

188 lines
7.2 KiB
Markdown
Raw 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.
# Полная инструкция: Vision + Arduino + шаговик (трек 3)
Код в `arduino_code/Test` **не меняем**. Связка идёт только через MQTT — те же топики, что уже использует SCADA (`backend_control/gui.py`).
## Архитектура
```
RealSense D415 ──► Orange PI (vision_classifier)
│
▼ MQTT
┌──── mosquitto :1883 ────┐
│ │
▼ ▼
ESP32 (уже прошит) SCADA gui.py
• motor/control/* (опционально)
• servo/control/*
│
▼
TMC2209 + шаговик ленты
серво-селекторы зон B/C/D
```
## 1. Сеть и MQTT (важно)
На Orange PI уже крутится Docker-контейнер **mosquitto** на порту **1883**
(логин/пароль: `test` / `1234` — как в SCADA).
| Кто | Куда подключается |
|-----|-------------------|
| `vision_classifier` | `127.0.0.1:1883` (уже в `config.yaml`) |
| SCADA `gui.py` | `192.168.31.225` или `127.0.0.1` |
| ESP32 (прошивка) | `MQTT_SERVER = "192.168.31.225"` (уже в `arduino_code/Test`) |
Orange PI в сети: **`192.168.31.225`**. Vision ходит на локальный брокер `127.0.0.1`; ESP и SCADA — на `192.168.31.225:1883`.
Краткая шпаргалка запуска/стопа: **[START.md](START.md)**.
Проверка с Orange PI:
```bash
# локальный брокер на OPI
python3 -c "
import paho.mqtt.client as m, time
c=m.Client(m.CallbackAPIVersion.VERSION2); c.username_pw_set('test','1234')
c.connect('127.0.0.1',1883); c.loop_start(); time.sleep(0.5); print('MQTT OK'); c.disconnect()
"
```
MQTT Explorer: http://localhost:3000 (контейнер `mqtt-explorer`).
## 2. Что уже должно работать на Arduino
Не трогая `arduino_code/Test`, убедитесь что ESP32 в сети и отвечает на команды (через SCADA или mosquitto):
| Действие | Топик | Payload |
|----------|-------|---------|
| Вкл. драйвер | `motor/control/driver` | `on` |
| Вкл. TMC | `motor/control/tmc/enable` | `on` |
| Ток % | `motor/control/tmc/current_percent` | `50` |
| Микрошаг | `motor/control/tmc/microsteps` | `16` |
| Скорость RPM | `motor/control/rpm` | `-200` (у вас направление с минусом; диапазон примерно −1000…1000) |
| Серво угол | `servo/control/{N}/angle` | `0`…`180` |
| Серво вкл | `servo/control/{N}/enable` | `on` |
Телеметрия: `motor/feedback/#`, `servo/+/feedback/#`.
Ручной тест ленты (если `mosquitto_pub` есть):
```bash
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
```
Или откройте `backend_control/gui.py` (`MQTT_BROKER = "192.168.31.225"`).
## 3. Камера RealSense D415
1. USB3 (скорость 5000M в `lsusb -t`).
2. Камера **сверху** над лентой, **0.5–1.5 м**.
3. В `config.yaml` задайте `belt_distance_mm` = реальная высота в мм.
```bash
lsusb | grep -i RealSense
v4l2-ctl --list-devices
```
## 4. Запуск vision (Orange PI)
```bash
cd ~/workdir/vision_classifier
# один кадр без железа
./run.sh --once --no-mqtt --no-motor
# превью без движения (JPEG обновляются на диске)
./run.sh --preview --dry-route --no-motor
# смотреть: debug_frames/live_color.jpg и live_depth.jpg
# полный контур: камера → класс → MQTT → мотор + серво
PYTHONUNBUFFERED=1 ./run.sh --preview
# стоп: Ctrl+C (rpm сбросится в 0)
```
Превью **не открывает окна** (у вас OpenCV headless) — пишет файлы:
- `debug_frames/live_color.jpg`
- `debug_frames/live_depth.jpg`
Откройте их в Cursor/VS Code или:
```bash
eog debug_frames/live_color.jpg &
# или периодически обновлять в браузере/просмотрщике
```
## 5. Настройка зон под вашу механику
В `config.yaml` → `routing.zones` и `motor`:
```yaml
motor:
enabled: true
rpm: -200 # у вас направление ленты — отрицательный RPM
mqtt:
broker: "127.0.0.1" # mosquitto на Orange PI; ESP и SCADA → 192.168.31.225
routing:
zones:
B: { servo: 0, idle_angle: 0, divert_angle: 0, hold_ms: 500 }
C: { servo: 1, idle_angle: 0, divert_angle: 90, hold_ms: 800 }
D: { servo: 2, idle_angle: 0, divert_angle: 90, hold_ms: 800 }
```
Подставьте **номера каналов PCA9685** и углы, которые уже проверены в SCADA.
Логика ТЗ:
| Класс | Зона | Действие |
|-------|------|----------|
| Подходит | B | лента едет, серво idle |
| Не по габаритам | C | серво C на `divert_angle`, потом idle |
| Круг (доупаковка) | D | серво D на `divert_angle`, потом idle |
## 6. SCADA параллельно
Можно держать GUI открытым для телеметрии:
```bash
cd ~/workdir/backend_control
# в gui.py: MQTT_BROKER = "192.168.31.225" (или 127.0.0.1 с OPI)
source testing/bin/activate # или свой venv
python gui.py
```
Vision и SCADA могут работать вместе на одном брокере.
## 7. Docker (опционально)
```bash
cd ~/workdir/vision_classifier
sudo docker compose up -d --build
sudo docker compose logs -f
```
## 8. Типичные проблемы
| Симптом | Что сделать |
|---------|-------------|
| `cv2.imshow` / GTK error | уже исправлено: `--preview` пишет JPEG |
| `mqtt timed out` | брокер на OPI → `broker: "127.0.0.1"`; ESP → `192.168.31.225` |
| ESP не реагирует | одна Wi‑Fi сеть, брокер `192.168.31.225:1883`, логин `test`/`1234` |
| depth valid < 30% | USB3, высота 0.5–1.5 м, не чёрная лента в упор |
| серво не те | поправьте `routing.zones.*.servo` под SCADA |
| лента не едет | `motor.enabled: true`, проверьте SCADA rpm вручную |
## 9. Чеклист «всё связано»
1. [ ] `mosquitto` Up (`docker ps`)
2. [ ] ESP32 в Wi‑Fi, в MQTT Explorer видны `motor/feedback/*`
3. [ ] Из SCADA крутится шаговик и двигаются серво
4. [ ] `config.yaml`: `mqtt.broker` = тот же брокер
5. [ ] `belt_distance_mm` и углы серво подогнаны
6. [ ] `./run.sh` печатает зону B/C/D и в Explorer появляются `vision/feedback/*`
7. [ ] При объекте срабатывает нужный серво, лента крутится