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

View File

@@ -0,0 +1,187 @@
# Полная инструкция: 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. [ ] При объекте срабатывает нужный серво, лента крутится