Моделирование роботов в Unity - это просто как 1, 2, 3

В процессе разработки роботов для тестирования и обучения используется симуляция, и мы хотим показать вам, как робототехники могут использовать Unity для симуляции робототехники. В этой первой записи новой серии блога мы описываем общий рабочий процесс разработки роботов. Кроме того, мы представляем новый набор инструментов, которые делают моделирование робототехники в Unity быстрее, эффективнее и проще, чем когда-либо.
Поскольку разработка и тестирование приложений на реальном роботе требует больших затрат и времени, моделирование становится все более важной частью разработки робототехнических приложений. Проверка приложения в симуляции перед развертыванием на роботе может сократить время итерации за счет раннего выявления потенциальных проблем. Симуляция также облегчает тестирование крайних случаев или сценариев, которые могут быть слишком опасны для тестирования в реальном мире.
Ключевыми элементами эффективного моделирования робототехники являются физические атрибуты робота, сцена или среда, в которой он работает, и программное обеспечение, которое работает на роботе в реальном мире. Убедиться в том, что эти три элемента симуляции максимально приближены к реальной обстановке, крайне важно для достоверного тестирования и обучения.
Одним из наиболее распространенных фреймворков для разработки программного обеспечения для роботов является Robot Operating System (ROS). Он предоставляет стандартные форматы для описаний роботов, сообщений и типов данных, используемых тысячами робототехников по всему миру, для таких разнообразных применений, как промышленная сборка, автономные транспортные средства и даже развлечения. Активное сообщество пользователей предоставляет множество пакетов с открытым исходным кодом для общих функциональных возможностей, которые могут стать основой для разработки новых систем.
Робототехники часто проектируют робототехническое приложение как модульный набор узлов ROS, которые могут быть развернуты как на реальных роботах, так и на компьютерах, взаимодействующих с симуляторами. В процессе симуляции разработчики создают виртуальный мир, который повторяет целевой сценарий использования реального робота. Тестируя в этой симулированной экосистеме, пользователи могут быстро доработать дизайн, прежде чем тестировать его в реальном мире и в конечном итоге внедрять в производство.

Обычный рабочий процесс разработки робототехники, когда тестирование в симуляторе проводится до испытаний в реальных условиях
В этой статье блога на примере простой задачи манипуляции "выбери и помести" показано, как пользователи могут использовать Unity для этого рабочего процесса моделирования.
Следуя приведенной выше схеме, предположим, что задача нашего робота - взять предмет и поместить его в заданное место. В качестве манипулятора выступает шестиосевой образовательный робот Niryo One. Окружающая среда минимальна: пустая комната, стол, на котором сидит робот, и куб (т.е. целевой объект). Для выполнения части задачи, связанной с планированием движения, мы используем популярный набор пакетов планирования движения ROS под общим названием MoveIt. Когда мы готовы приступить к выполнению задания, мы отправляем MoveIt запрос на планирование из симулятора. Запрос содержит позы всех суставов робота, позу куба и целевое положение куба. Затем MoveIt рассчитывает план движения и отправляет его обратно в симулятор для выполнения.
Теперь, когда мы определились с проблемой, давайте рассмотрим, как использовать Unity в этом процессе моделирования.
Симуляция робототехники заключается в создании виртуальной среды - базовой комнаты, как в этом примере, или чего-то более сложного, например, заводского цеха с конвейерными лентами, контейнерами, инструментами и деталями - и добавлении в эту среду виртуального представления робота, которого нужно обучить или протестировать. С помощью редактора Unity Editor можно создавать бесконечные варианты виртуальных сред. Но как мы можем внедрить наших роботов в эти среды?
При моделировании робота в симуляторе нам необходимо представить его визуальные сетки, сетки столкновений и физические свойства. Визуальные сетки необходимы для реалистичной визуализации робота. Сетки столкновений необходимы для расчета столкновений между "звеньями" робота, жесткими элементами, соединяющими суставы, и другими объектами в окружающей среде, а также с самим роботом. Эти сетки обычно менее сложны, чем визуальные сетки, что позволяет быстрее проверять столкновения, что может потребовать больших вычислительных затрат. Наконец, физические свойства, такие как инерция, коэффициенты контакта и динамика суставов, необходимы для точного моделирования физики, то есть для вычисления того, как силы на звеньях приводят к изменению состояния робота, например, позы, скорости или ускорения.
К счастью для нас, при использовании рабочего процесса разработки ROS существует стандартизированный способ описания всех этих свойств: Универсальный формат описания роботов (URDF). Файлы URDF - это XML-файлы, которые позволяют нам указывать эти визуальные, коллизионные и физические свойства на человекочитаемом языке разметки. Файлы URDF также могут включать файлы сетки для задания сложной геометрии. В примере ниже показана выдержка из URDF-файла для робота Niryo One.

URDF робота Niryo One
Чтобы робототехникам было проще импортировать своих роботов в Unity, мы выпускаем URDF Importer, пакет с открытым исходным кодом для импорта робота в сцену Unity с помощью его URDF-файла. Этот пакет использует преимущества нашей новой поддержки "артикуляций" в Unity, которая стала возможной благодаря улучшениям в PhysX 4.1. Это обновление позволяет нам точно моделировать физические характеристики робота для достижения более реалистичных кинематических симуляций.
При установке в Unity Editor этот пакет позволяет пользователю выбрать URDF-файл для импорта. Он анализирует XML-файл за кулисами и сохраняет ссылки и соединения в соответствующих классах C#. Затем создается иерархия GameObjects, где каждый GameObject - это компонент ArticulationBody, представляющий определенное звено робота. Он присваивает свойства из URDF соответствующим полям в ArticulationBody. Когда пользователи добавляют робота в Unity, URDF Importer автоматически создает рудиментарный контроллер клавиатурных суставов. Пользователи могут заменить этот контроллер на собственный, используя API ArticulationBody.
Например, вот актив Niryo One Unity, созданный после импорта вышеуказанного URDF-файла.

Виртуальный робот Niryo One в Unity, импортированный с помощью URDF Importer
Теперь, когда робот находится в редакторе Unity, мы должны протестировать наш алгоритм планирования движения, запущенный в наборе узлов ROS. Для этого нам нужно настроить интерфейс связи между Unity и ROS. Unity должна передавать ROS сообщения, содержащие информацию о состоянии робота, целевом объекте и местоположении цели, а также запрос на планирование в службу перемещения. В свою очередь, ROS должна вернуть Unity сообщение о траектории, соответствующее плану движения (т. е. последовательности положений суставов, необходимых для выполнения задачи по подбору и перемещению).
Два новых пакета ROS-Unity Integration теперь позволяют легко соединить Unity и ROS. Эти пакеты позволяют передавать сообщения ROS между узлами ROS и Unity с низкой задержкой; при тестировании на одной машине простое текстовое сообщение дошло от Unity до подписчика ROS за миллисекунды, а изображение размером 1036 x 1698 - за несколько сотен миллисекунд.
Поскольку коммуникация в ROS использует модель pub/sub, первое требование для коммуникации ROS-Unity - классы в Unity, соответствующие типам сообщений ROS. Когда пользователи добавляют пакет ROS-TCP-Connector Unity в Unity Editor, они могут использовать плагин MessageGeneration для генерации классов C#, включая функции сериализации и десериализации, из файлов ROS .msg и .srv. Пакет ROS-TCP-Connector также включает скрипты, которые пользователь может расширить для публикации сообщений из Unity в тему ROS, подписки в Unity на сообщения в теме ROS, а также для создания запросов и ответов на сервисы ROS. На стороне ROS пакет ROS под названием ROS-TCP-Endpoint может создать конечную точку для обеспечения связи между узлами ROS и сценой Unity с помощью этих скриптов ROS-TCP-Connector.
Теперь давайте посмотрим, как использовать эти пакеты ROS-Unity Integration для решения поставленной задачи. Сначала мы используем пакеты ROS-Unity Integration, чтобы создать издателя в Unity для отправки данных о позе в ROS по TCP. На стороне ROS нам нужно настроить ROS-TCP-Endpoint для подписки на эти сообщения pose.
Далее мы создадим кнопку "Publish" в сцене Unity Scene вместе с обратным вызовом OnClick. Эта функция обратного вызова выполняет сервисный запрос к планировщику движения MoveIt. Запрос на обслуживание включает в себя текущее положение робота, положение целевого объекта и местоположение цели. Когда MoveIt получает запрос на планирование, он пытается рассчитать план движения. В случае успеха сервис возвращает план, то есть последовательность положений суставов, а скрипт Unity выполняет траекторию с помощью API ArticulationBody. В противном случае возвращается сообщение о неудаче.
На рисунке ниже показана симуляция Unity, в которой рука Niryo One успешно выполняет задачу по подбору и перемещению.

Моделирование задачи подбора и перемещения на роботе Niryo One в Unity с использованием ROS и MoveIt для планирования движения
Этот пример - только начало. Разработчики могут использовать эту демонстрацию как основу для создания более сложных сцен Unity Scenes, добавления различных роботов и интеграции других пакетов ROS. Следите за будущими постами, посвященными интеграции компьютерного зрения и задач, ориентированных на машинное обучение, в рамки моделирования робототехники.
Эти инструменты закладывают основу для нового поколения тестирования и обучения в области моделирования и позволяют использовать Unity для моделирования робототехники как никогда просто. Наша команда работает над тем, чтобы обеспечить использование этих решений нового поколения, включая машинное обучение для робототехники, моделирование датчиков, тестирование в масштабе и многое другое. Следите за нашим следующим постом в блоге, в котором мы расскажем о том, как обучить модель машинного обучения на основе зрения для оценки позы целевого объекта в задаче pick-and-place.
Начните работать с нашими инструментами для моделирования робототехники бесплатно. Ознакомьтесь с нашим руководством по выбору и размещению на GitHub.
Другие проекты по робототехнике можно найти на сайте Unity Robotics Hub на GitHub. О том, как наша команда упрощает обучение систем компьютерного зрения с помощью Unity, читайте в нашей серии блогов о компьютерном зрении.
Для получения дополнительной информации о том, как Unity может быть использована для решения ваших задач по моделированию робототехники, посетите нашу официальную страницу робототехники.
Если вы хотите напрямую обратиться к нашей команде с вопросами, отзывами или предложениями, напишите нам по адресу unity-robotics@unity3d.com.
