Устранение неполадок
Частые проблемы
| Симптом | Причина | Решение |
|---|---|---|
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}")
Диагностика
- Включите полный журнал:
"logger_level": "all","logger_type": "console". - Проверьте последовательность в журнале:
connected→in heartbeat recieved ['d_meta', 'Ready']→recieved command .... - Проверьте робота без платформы на минимальном тестовом сервере.
- Запросите журнал робота удалённо командой
{"file": "log"}(при"logger_type": "file").
Известные ограничения версии 0.1.1
opencv-pythonне указан в зависимостях пакета.- Параметры
max_send_freqиmax_main_freq— это периоды в секундах. - Поле
sidв состоянии робота не заполняется SDK (всегдаnull). - Команды
web_settingsпринимаются, но не обрабатываются. - Раздел
externalконфигурации зарезервирован и не используется. - Нет встроенного сторожевого таймера команд и соединения — реализуйте их в своей программе (примеры выше и на странице Обработка команд).
No comments to display
No comments to display