Архитектура робота и введение в SDK

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

Руководство предназначено для технических специалистов. Потребуются навыки работы с сетью и командной строкой. Для запуска пройстеших примеров из SDK желательно знание C++, но это не является обязательным.

Подача материала выполнена не в строгой форме, а в виде урока с комфортным, последовательным повествованием. Урок основан на базе обучения, который проводит отдел роботизированных систем.

Введение

Итак, Вы или Ваша компания приобрели робота компании Unitree, модели Go1. Вы уже ознакомились с быстрым стартом, научились ловко управлять роботом с пульта, а теперь задумались о том, что пришло время погрузиться немножко глубже. Давайте заварим чай, усядемся поудобнее и заглянем внутрь архитектуры робота. Нам понадобится:

  • патч-корд
  • монитор с HDMI-кабелем (необязательно)
  • клавиатура/мышь
  • USB-хаб (скорее всего потребуется)

Аппаратное устройство

Если подвигать суставами робота, можно сделать вывод о том, что робот имеет 12 моторов. Все роботы-собаки будут иметь по 12 моторов, однако набор бортовых компьютеров у разных моделей отличается. Собака модели Go1 оборудована 5-ю бортовыми компьютерами:

Бортовой компьютер Arch IP-адрес SSH-доступ (логин/пароль) Назначение
Микроконтроллерная плата (на базе STM32) ARM 192.168.123.10 - Управление движением на низком уровне
Raspberry Pi CM4 ARM 192.168.123.161, 192.168.12.1 pi/123 Управление движением на высоком уровне, вебинтерфейс, раздача Wi-Fi, и т.д
NVidia Jetson Nano ARM 192.168.123.13 unitree/123 Вспомогательное: машинное зрение, камеры головы, динамик. Располагается в голове, выведенные наружу коммуникационные интерфейсы отсутствуют
NVidia Jetson Nano ARM 192.168.123.14 unitree/123 Вспомогательное: машинное зрение, боковые камеры
NVidia Jetson Nano ARM 192.168.123.15 unitree/123 Вспомогательное: машинное зрение, нижняя камера

Все компьютеры подключены по Ethernet в одну локальную сеть посредством встроенного хаба. В случае, если вы хотите подключиться к роботу через патч-корд, используйте ethernet-разъем на спине робота. Сетевой адаптер вашего ПК должен быть настроен на автоматическое подключение настроек. Установленный на Raspberry Pi DHCP-сервер присвоит вашему компьютеру IP-адрес в подсети 192.168.123.0/24. Теперь вы можете пинговать все вышеуказанные хосты.

Немного иная ситуация будет если вы решили подключиться к роботу по Wi-Fi. За раздачу Wi-Fi отвечает тоже Raspberry Pi, но на этот раз он выдаст вам IP-адрес в подсети 192.168.12.0/24 и настроит маршрутизацию. Благодаря ей вы все равно сможете видеть подсеть 192.168.123.0/24.

Давайте по порядку разберем назначение каждого бортового компьютера:

  • Микроконтроллерная плата (192.168.123.10) находится внутри корпуса, не имеет выводов наружу и выполняет следующий перечень задач:
    1. общение с моторами на низком уровне (по интерфейсу RS-485): передача управляющих команд и прием от моторов сообщений обратной связи.
    2. общение с компьютером высокого уровня (на базе TCP/IP): прием команд от верхнего уровня, передача информационных сообщений на верхний уровень.
    3. работа с радиотрансивером: прием управляющих радиосигналов с пульта управления

Если вскрыть робота и вытащить все бортовые компьютеры кроме этой платы, то роботом все равно можно будет управлять с пульта управления. Сигналы с пульта управления по радиоканалу будут приходить на микроконтроллерную плату, которая в свою очередь будет обрабатывть их и управлять моторами. Однако, робот будет крайне неустойчив, словно пьяный. Это называется стандартный режим, о котором упоминалсь в быстром старте. В стандартном режиме за управление движением отвечает только прошивка микроконтроллерной платы и не учавствует компьютер верхнего уровня.

  • Raspberry Pi CM4 (192.168.123.161) - бортовой компьютер для высокоуровневого управления движением. Установлен на несущую плату, имеющую выводы наружу со спины. Вы можете подключить монитор и увидеть знакомый многим интерфейс Raspberry Pi OS, или же подключиться по SSH. На этом компьютере выполняется специальный процесс unitree_legged_sport, который взаимодействует с микроконтроллерной платой: принимает от нее информационные пакеты, производит расчеты и посылает управляющие пакеты обратно. В этом случае собака двигается более устойчиво и это называется спортивный режим. Процесс unitree_legged_sport является ключевым и мы еще вернемся к разговору о нем.

  • NVidia Jetson Nano (192.168.123.13) - бортовой компьютер, находящийся в голове. Физического доступа снаружи к нему нет, подключение возможно только по SSH. Данный компьютер является вспомогательным, можно использовать для машинного зрения, так же он отвечает за обработку изображений с камер головы. На нем можно найти SDK для управления светодиодами головы и запускать звуки используя встроенный динамик.

  • NVidia Jetson Nano (192.168.123.14) - бортовой компьютер, находящийся в корпусе и имеющий выход наружу со спины. Вы можете подключить монитор и устройства ввода и увидеть интерфейс Ubuntu 18.04, или же подключиться по SSH.
  • NVidia Jetson Nano (192.168.123.15) - бортовой компьютер, находящийся в корпусе и имеющий выход наружу со спины. Вы можете подключить монитор и устройства ввода и увидеть интерфейс Ubuntu 18.04, или же подключиться по SSH.

Функционирующее программное обеспечение

Давайте представим, что происходит при включении робота. Бортовые компьютеры получают питание и начинают загрузку своих ОС. Raspberry Pi CM4 (192.168.123.161) по окончании загрузки автоматически запускает процесс unitree_legged_sport, который является официальной программой движения от производителя. Процесс, запустившись, перехватывает управления на себя. Он получает от микроконтроллерной платы (192.168.123.10) информационные пакеты с данными о: положении моторов, нажатых на пульте управления клавишах, параметрах IMU (инерциальной системы наклона), далее производит расчеты и отправляет обратно управляющие пакеты. Микроконтроллерная плата, получая эти пакеты, преобразует их в прямые команды для моторов.

Таким образом микроконтроллерная плата является исполнительным устройством и постоянно взаимодействует с Raspberry Pi CM4, которая, получая обратную связь, выполняет управленченскую функцию.

Описанное взаимодействие называется спортивным режимом. Вы наблюдаете его постоянно когда включаете робота. Робот встает самостоятельно как раз в момент запуска unitree_legged_sport и теперь готов к управлению. Однако, если бы связи между микроконтроллерной платой и Raspberry Pi CM4 не было, или же, к примеру, Raspberry Pi просто отсуствовал (или вышел из строя), то микроконтроллерная плата работала бы самостоятельно (стандартный режим). Попробуйте убить процесс unitree_legged_sport, только предварительно лучше положите робота на землю. Оставшись без внешнего управления, микроконтроллерная плата снова возьмет управление движением робота на себя, и скорее всего упадет при старте ходьбы. Не обязательно убивать процесс чтобы переключиться в стандартный режим, для переключения можно просто использовать комбинацию отключения спортивного режима L1 + L2 + Start.

Чтобы отличать спортивный режим от стандартного без запуска ходьбы, нажимайте L2 + A, переключая положения стоя/лежа. Будучи в стандартном режиме, у робота будет третье положение (полуприсед), в то время как у спортивного режима будет только два: лежа и стоя.

Убедитесь, что вы осознали разницу между режимами и научились отличать их. Это понимание потребуется при использовании SDK.

После убийства процесса, можно предположить, что вернуть робота обратно в спортивный режим не получится. Однако процесс автоматически перезапускается (поддерживается включенным), поэтому можете обнаружить его снова запущенным. При этом он уже не перехватит управление. Теперь даже будучи запущенным, процесс unitree_legged_sport не будет учавствовать в управлении, и робот будет оставаться в стандартном режиме. Ровно до тех пор, пока Вы не нажмете комбинацию переключения в спортивный режим - L1 + Start. В этом случае микроконтроллерная плата отправит процессу unitree_legged_sport (работающему на Raspberry Pi CM4) сообщение, с просьбой взять управление на себя.

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

Стоит отметить, что встроенные скрипты демонстрации устойчивости (танцы, вставание на задние лапы), а также режимы бега и хождения по лестнице, являются частью программы unitree_legged_sport.


Имеются и другие модули программного обеспечения. Производитель располагает свое программное обеспечение в домашних директориях пользователей бортовых компьютеров, в каталоге /Unitree. Взглянем, что из компонентов ПО располагается на Raspberry Pi. Давайте посмотрим содержимое каталога /home/pi/Unitree:

/autostart   # готовое программное обеспечение от Unitree, запускаемое автоматически при загрузке
/sdk         # каталог с SDK.

Заглянем в /autostart. Здесь располагаются исполняемые компоненты ПО, запускаемые автоматически при включении робота:

...
...
/sport_mode      # каталог, где лежит официальная программа управления движением unitree_legged_sport**
/trigger_sport   # каталог с программой, автоматически включающей спорт-режим при включении робота
/WebMonitor      # файлы веб-интерфейса робота
...
...

Одним из них является веб-интерфейс, на который мы попадаем при заходе из браузера по адресам 192.168.12.1 или 192.168.123.161. В каталоге /sport_mode лежит исполняемый файл многократно упомянутой нами программы управления движением. Однако, как вы уже могли заметить когда убивали процесс, при запуске (или перезапуске) она запускается, но находится в режиме ожидания и не перехватывает сразу управления на себя. Для переключения используется trigger_sport. Эта программа отрабатывает единожды при включении робота. Именно поэтому робот встает автоматически при включении. Если бы trigger_sport отсутствовал, то после включения робот продолжит лежать на земле и останется в стандартном режиме управления (несмотря на запущенный unitree_legged_sport). Попробуйте поэкспериментировать и переименовать trigger_sport, тогда он не запустится при запуске. Вы всегда сможете вручную включить спортивный режим вышеупомянутой комбинацией клавиш.

В каталоге /autostart имеются и другие модули ПО, однако их обзор не входит в это руководство.

Введение в SDK

Давайте познакомимся с SDK.

Пройдем по пути: Unitree/sdk/unitree_legged_sdk/examples/ Здесь можно видеть файлы примеров содержащие исходный код для управления роботом. Перед компиляцией важно отметить, что примеры разделяются на 2 типа:

  • Программы для низкоуровневого управления (например, example_torque.cpp)
  • Программы для высокоуровневого управления (например, example_walk.cpp)

Код примеров низкоуровневого управления при исполнении, генерирует и отправляет управляющие пакеты, предназначенные для микроконтроллерной платы (192.168.123.10). При изучении исходников мы можете даже обнаружить этот IP-адрес в виде символьной константы заданной посредством директивы #define. Код низкоуровневого управления оперирует понятиями, наподобии “провернуть мотор в определенное положение”, “развить нужный момент” и т.д.

Код примеров высокоуровневого управления при управлении, генерирует и отправляет управляющие пакеты (уже другого типа), предназначенные для процесса unitree_legged_sport (что тоже работает на самом Raspberry Pi). При изучении исходников, вы можете обнаружить IP-адрес 192.168.123.161, указывающий назначение отправки пакетов. Процесс unitree_legged_sport будет принимать эти пакеты и является своего рода API. Код высокоуровневого управления оперирует понятиями, наподобии “идти вперед”, “повернуть корпус”, “лечь” и т.д. Получив такой пакет, процесс unitree_legged_sport уже сам разберет его на пакеты низкого уровня и отправит их микроконтроллерной плате.

Исходя из такой архитектуры взаимодействия ПО, делаем важный вывод:

Важный вывод

  • Программы с низкоуровневым управлением запускаются только когда робот находится в стандартном режиме.

  • Программы с высокоуровневым управлением запускаются только когда робот находится в спортивном режиме.

Запуск программы с низкоуровневым управлением в момент работы робота в спортивном режиме приведет к конфликту управления: управляющие команды для микроконтроллерной платы будут поступать не только от вашей программы, но и от процесса unitree_legged_sport. Робот перейдет в аварийный режим, который будет сигнализироваться звуковым сигналом зуммера. В этом случае поскорее завершите программу.

Запуск программы с высокоуровневым управлением в момент работы робота в стандартном режиме приведет к бездействию робота: управляющие команды для процесса unitree_legged_sport будут игнорироваться, так как процесс в данное время не управляет движением.

Давайте скомпилируем один из примеров. Для автоматизации компиляции и сборки используется cmake Создайте каталог build, войдите в него и выполните следующие команды:

cmake ..
make example_torque

В каталоге должен появиться исполняемый файл example_torque. Переведем робота в стандартный режим комбинацией L1 + L2 + Start (то есть отключим спортивный режим) и выполним запуск программы.

./example_torque

Робот провернет один из моторов, добившись определенного момента силы.

Давайте скомпилируем высокоуровневый пример управления.

cmake ..
make example_walk

Переведите робота в спортивный режим и выполните запуск программы:

./example_walk

Робот начнет демонстрационные движения (повороты корпуса, повороты на месте, ходьба). Изучив исходники вы можете по шаблону создать свои уникальные движения.

Описание используемых классов и методов SDK выходят за рамки данного руководства.


Игорь Парандюк,
инженер по системной интеграции