Устранение неполадок

Частые проблемы

Симптом Причина Решение
ModuleNotFoundError: No module named 'cv2' при импорте SDK OpenCV не входит в зависимости пакета pip install opencv-python (или opencv-python-headless) и numpy
AttributeError: 'Conductor' object has no attribute 'command_handler' Не объявлен обработчик команд до init_connector() Объявите функцию с декоратором @robot.com_handler (можно пустую)
AttributeError: ... 'main_loop_func' Не объявлен основной цикл Объявите функцию с декоратором @robot.mainloop
TypeError: ... takes 0 positional arguments but 1 was given в основном цикле Функция основного цикла не принимает context def loop(context): ...
socketio.exceptions.ConnectionError при запуске Сервер недоступен или неверный адрес Проверьте server и port в params.json, доступность сервера: curl http://<сервер>:<порт>/socket.io/?EIO=4&transport=polling
Робот не находит сервер artex.arcon Не настроено имя по умолчанию Укажите IP-адрес сервера в params.json или добавьте запись в /etc/hosts
Ошибка OpenCV !_img.empty() в imencode В функцию @robot.video передан/возвращён пустой кадр (None) Проверяйте результат cam.read() перед отправкой кадра
Параметры из params.json не применяются Программа запущена из другого каталога Запускайте из каталога с params.json или задайте WorkingDirectory в systemd
Консоль заполнена сообщениями [TODO] Уровень журнала all "logger_level": "skip_TODO" или robot.log.set_level("skip_TODO")
Робот в списке, но видео/телеметрии нет Сервер не прислал Ready, или функции-источники не вызываются в основном цикле Проверьте в журнале сообщение in heartbeat recieved [...]; вызовите функции @robot.telemetry / @robot.video в @robot.mainloop
Команды не доходят до обработчика Робот ещё не получил Ready Дождитесь heartbeat; проверьте журнал на recieved command
Видео отстаёт или «рвётся» Слишком большие кадры для канала Уменьшите разрешение (например, 320×240), увеличьте max_send_freq до 0.1
Программа «висит» без связи после перезапуска сервера SDK исчерпал 5 попыток переподключения Используйте сторожевую проверку (ниже) и автоперезапуск через systemd
Обработчик команд подтормаживает Долгие операции в com_handler блокируют приём событий Выполняйте долгие действия в отдельном потоке, в обработчике только меняйте состояние

Сторожевая проверка соединения

SDK делает 5 попыток переподключения. Если сервер был недоступен дольше, соединение не восстановится само. Завершите программу — systemd перезапустит её, и подключение будет выполнено заново:

import os, time

DISCONNECT_LIMIT = 30  # секунд

@robot.mainloop
def loop(ctx):
    if robot.sio.sio.connected:
        ctx["online_at"] = time.monotonic()
    elif time.monotonic() - ctx.get("online_at", time.monotonic()) > DISCONNECT_LIMIT:
        robot.log("ERROR", "Нет связи с сервером, перезапуск")
        stop_motors()
        os._exit(1)
    ...

Ошибки в основном цикле

SDK не перехватывает исключения в функции основного цикла — любая ошибка завершает программу. Для долгой автономной работы оборачивайте опасные участки:

@robot.mainloop
def loop(ctx):
    try:
        read_sensors()
    except Exception as ex:
        robot.log("ERROR", f"Датчики: {ex}")

Диагностика

  1. Включите полный журнал: "logger_level": "all", "logger_type": "console".
  2. Проверьте последовательность в журнале: connected → in heartbeat recieved ['d_meta', 'Ready'] → recieved command ....
  3. Проверьте робота без платформы на минимальном тестовом сервере.
  4. Запросите журнал робота удалённо командой {"file": "log"} (при "logger_type": "file").

Известные ограничения версии 0.1.1


Revision #3
Created 2026-09-23 09:32:21 UTC by Маслов Алексей
Updated 2026-09-23 09:35:07 UTC by Маслов Алексей