Как стать автором
Обновить
93.49
Нетология
Меняем карьеру через образование

Личный опыт: управление роботом с помощью Steam Deck

Время на прочтение4 мин
Количество просмотров4.6K

Привет, меня зовут Станислав Архипенко. Сейчас я работаю в IT, но с раннего детства я был увлечён техникой. Ещё совсем маленьким я подключал батарейки к моторчикам и мечтал о том, что когда-нибудь смогу создавать настоящих роботов. Моя мечта осуществилась. Я не работаю сборщиком роботов, но новенький 3D-принтер позволил мне окунуться в разработку и строительство робот с голов от дизайна и печати 3д деталей, до сборки и пайки, программирования и отладки. В этой статье покажу своего гексапода и расскажу об управлении с помощью игровой консоли Steam Deck. 

Какого робота я собрал и как

На сайте thingiverse.com — огромной коллекции 3д проектов — я случайно обнаружил замечательный проект авторства AlexKorvin. Сочетание интересного внешнего дизайна и  хорошей спецификации со списком деталей и ссылками на магазины, а также открытое программное обеспечение не оставили мне выбора — я решил реализовать проект. Однако при детальном изучении материалов я обнаружил, что Алексей принял несколько конструктивных решений, с которыми я не согласен:

  • Повышающие преобразователи и однобаночные аккумуляторы в системе питания.

  • Arduino для управления servo-приводами.

  • В качестве контроллера — джойстики от playstation 2 и дополнительный китайский модуль для получения сигнала.

  • Аналоговые приёмник и передатчик для видео.

Мне показалось, что электронику можно сделать проще, поэтому я внёс изменения:

  • Использовать классический подход для питания в таких случаях: 4-баночный аккумулятор и понижающий преобразователь.

  • Основной модуль управления — Raspberry Pi Zero W.

  • Для управления servo использовать две классические платы управления на основе PCA9685

  • Контроллер управления от Xbox One через bluetooth.

С аппаратной частью всё понятно, но вот с программной есть небольшая проблема: программа, которую использует Alex (от совершенно другого проекта) написана под Arduino и не подходит для Raspberry Pi. Самое сложное в этой программе — расчёты положения ног. Мне не хотелось разрабатывать программу с нуля. Во-первых, расчёты положения ног — кропотливая работа, а во-вторых, Alex реализовал ряд классных функций, которые я не хотел терять.

Я не стал переписывать программу с нуля, а вместо этого перевёл код из C в Python3. Во время перевода я не использовал автоматические утилиты-переводчики и ограничился поиском и заменой по тексту. Так я смог привести C-синтаксис в состояние, понятное Python-интерпретатору.

Затем я удалил всё, что связано с аппаратной частью: управления серво, связь с джойстиком — а оставшийся код трансформировал в родительский класс hexapod, который реализовывал вычисления положения ног и логику управления.

Следующим шагом я разработал дочерний класс AcpRobot, в который и включил всё, что связано с аппаратурой. Мне такой подход показался удачным: благодаря разделению на родительский и дочерний классы теперь можно использовать логику управления с разными аппаратными реализациями.

В вопросе операционный системы я пошёл по пути наименьшего сопротивления и применил Raspbian

Для Xbox-контроллера я использовал драйвер xpadneo и следующую конфигурацию bluetooth в /etc/bluetooth/main.conf:

[General] 

ControllerMode = dual 

Privacy = device

Чтобы программа управления роботом запускалась автоматически, я написал небольшой сервис для systemd, а позже скрипт, который устанавливает весь Python-код и генерирует systemd-сервис по шаблону. Передачу видео на телефон я решил оставить на потом, мне совсем не хотелось разбираться с мобильной разработкой. Получилось так:

Как я связал робота и Steam Deck

Согласно Википедии, Steam Deck — это портативный игровой компьютер, разработанный Valve Corporation. Мне кажется, что ключевое слово здесь «компьютер», так как эта консоль действительно полноценный, настоящий x86-64 комп с Linux (SteamOS) на борту. На нём даже по умолчанию Python предустановлен! С учётом того, что я так и не решил проблему передачи видео, Steam Deck — идеальный кандидат в качестве нового джойстика управления. Так как мой робот — полноценный компьютер, и Steam Deck — тоже полноценный компьютер, я решил использовать Wi-fi для дистанционного управления. 

Сетевой обмен данными

Для получения сетевого стека я использовал Apache Thrift. Это фреймворк для разработки межъязыковых сервисов, он позволяет генерировать сетевой RPC-код по заданной схеме для десятка разных языков. Моя схема содержала пару структур данных и пять запросов: 

  • Ping — просто пинг, чтобы проверить, работает ли связь.

  • Axis — информация о стиках.

  • Button — информация о нажатых кнопка.

  • Get_status — статус робота, включает: текущий режим, под режим, статус огней и батареи

  • Get_logs — передача логов из робота.

Используя схему, я сгенерировал RCP код для сервера — робота и клиента — Steam Deck. Далее использовал его для обмена данными.

Пользовательский интерфейс

Для меня пользовательский интерфейс — случай, когда задача казалась очень сложной, а вышла очень простой. Я использовал PySimpleGUI, с помощью которого элементарно строить пользовательский интерфейс. Немного магии, 200 строк кода, и UI модуль готов!

  • RC — адрес сервера удалённого управления (RC — remote control).

  • VD — адрес видео стрима (VD — video).

  • M: CALI — означает текущий режим (mode) — калибровка (calibration).

  • SM: NA — текущий под-режим (sub-mode) отсутствует (NA означает Not Available).

  • Speed: FAST — текущий скоростной режим переключён в положение «быстро».

  • L1 и L2 — свет (Light) 1 и 2 активированы.

  • View: LOGS — переключение между режимом отображения журнала (Log) или видео.

Видеострим

Со стороны робота я использовал камеру raspberry pi camera v2. Для захвата изображения я использовал ustreamer — лёгкий и быстрый сервер для потоковой передачи видео MJPEG с устройств V4L2 в сеть. К сожалению, в репозиториях rasbian нет пакета с ustreamer, однако сборка из исходных кодов оказалось элементарной:

export WITH_SYSTEMD=1

sudo apt install libevent-dev libjpeg9-dev libbsd-dev libsystemd-dev

git clone https://github.com/pikvm/ustreamer.git

cd ustreamer

make

Для запуска сервера я использую следующие флаги:

--host $(hostname) \

--port  9999 \

--format=uyvy \

--encoder=m2m-image \

--workers=3 \

--persistent \

--dv-timings \

--drop-same-frames 30 \

--desired-fps 24

Со стороны Steam Deck я использовал urllib для чтения потока данных и opencv-python для конвертации изображения в подходящий формат.

Что есть сейчас и что ещё нужно сделать

Проект ещё не доведён до конца: надо избавиться от багов, завернуть Python-код в пакеты, оптимизировать видеострим. Но ключевые функции уже работают и радуют. 

Если вы решите повторить мой путь, эти ссылки вам помогут:

Теги:
Хабы:
Всего голосов 8: ↑6 и ↓2+6
Комментарии9

Публикации

Информация

Сайт
netology.ru
Дата регистрации
Дата основания
2011
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Мария Верховцева