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

7.2 KiB
Raw Blame History

Полная инструкция: 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.

Проверка с Orange PI:

# локальный брокер на 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 есть):

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 = реальная высота в мм.
lsusb | grep -i RealSense
v4l2-ctl --list-devices

4. Запуск vision (Orange PI)

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 или:

eog debug_frames/live_color.jpg &
# или периодически обновлять в браузере/просмотрщике

5. Настройка зон под вашу механику

В config.yaml → routing.zones и motor:

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 открытым для телеметрии:

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 (опционально)

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. При объекте срабатывает нужный серво, лента крутится