# Полный запуск системы (трек 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).