Манипуляционные ИРС: подготовка сцены в симуляторе CoppeliaSim
Методист по олимпиадной робототехнике Университета Иннополис Алексей Овсянников рассказывает, как использовать симулятор CoppeliaSim для тренировок и отладки алгоритмов робота.
В преддверии курсов повышения квалификации по подготовке к Innopolis Open in Robotics, которые пройдут в Университете Иннополис 1-7 марта, мне хотелось бы опубликовать некоторые материалы для слушателей. Надеюсь, что кому-то они упростят подготовку. Для других это возможность подробнее узнать, что именно будет на курсах.
Начнем с номинации Манипуляционные ИРС. Научно-методический комитет предполагает использование симулятора для тренировок и отладки алгоритма робота. Существует несколько достаточно распространенных симуляторов, некоторые из них узкоспециализированы (например, манипуляторы определенных фирм-производителей), другие подходят для более широкого спектра роботов и задач. Лично мне приходилось работать с симулятором V-REP, который недавно переименовали в CoppeliaSim. Он имеет как платную коммерческую версию, так и бесплатную для образовательного некоммерческого использования. Из основных возможностей стоит отметить наличие подробных справочных материалов, хорошее быстродействие и невысокую нагрузку на компьютер при проведении симуляции, возможность написания управляющих скриптов на языках LUA (используется как основной), C/C++, Python, Java, MatLab через внешние API-команды. Ну и, конечно, в него можно загружать собственные модели роботов и окружения. Именно этот процесс я и опишу в данной статье.
Для облегчения работы на курсах слушателям будет предоставлена готовая сцена, содержащая полигон, игровые элементы и типовую модель робота (только механика, без точной прорисовки приводов, контроллеров и т.д.). Но слушатели могут подготовить собственную модель и решать задачи курса на ней.
Процесс подготовки сцены можно разделить на следующие этапы:
- Создание модели робота в САПР,
- Создание модели полигона и игровых элементов в САПР,
- Экспорт модели робота в формат URDF,
- Импорт модели робота URDF в симулятор,
- Импорт модели полигона и игровых элементов в САПР,
- Указание свойств и параметров всех объектов в симуляторе.
Можно обойтись и без экспорта модели робота в формат URDF. Он нужен для сохранения информации о подвижных сочленениях робота. Можно и в самом симуляторе указать связи между звеньями робота, его колесами и приводами. Но лично мне удобнее это делать в специализированном САПР, чем в симуляторе. Я постараюсь показать оба варианта.
Рассмотрим все этапы подробнее.
Создание модели робота в САПР
Можно использовать любую систему автоматического проектирования, удобную и привычную для Вас. Нам потребуется нарисовать модель робота и задать ограничивающие связи между элементами, соответствующие механическим ограничениям. Например, достаточно задать совпадение осей колес и вала мотора, или вращение звена вокруг основания. Очевидно, что модель робота состоит не из одной сплошной детали, а представляет собой сборку из нескольких деталей.
Для младшей категории у меня получился вот такой робот:
Обратите внимание, что я не стал прорабатывать подробно схват. Симулятор содержит типовые модели роботов и их частей, я рассчитываю использовать какой-нибудь из них.
Для старшей категории хорошо подходит манипулятор с кинематикой SCARA. Она отличается высокой скоростью работы, так как почти все движения звеньев происходят в одной плоскости, а вверх-вниз движется либо первое, либо последнее звено. Можно было даже скачать готовую модель робота, например с сайта GrabCAD, но я нарисовал собственную модель:
В обеих моделях я старался указать материал деталей. Это будет полезно при переносе через URDF — САПР посчитает массы и легче будет в дальнейшем настроить параметры объектов. Цвет, к сожалению, не переносится в симулятор, его придется указывать повторно.
При переносе удобнее расположить детали робота в стартовом, «нулевом» положении. Сделать это проще в САПР, поэтому задаем его. Не стоит создавать лишние связи между звеньями. Если необходимо выставить детали робота параллельно или до полного совпадения плоскостей, то можно создать подобную связь и удалить ее — деталь останется в том же положении, но ее легко можно передвинуть.
Создание модели полигона и игровых элементов в САПР
Процесс похож на создание модели робота. Точные параметры полигона и игровых элементов можно найти на странице номинаций (младшая и старшая) в разделе «Техническое задание на изготовление полигона и реквизита». Создаем модели основания, подставок, объектов по указанным размерам; объединяем их в сборку.
Опять же, удобнее сразу в САПР расположить детали ровно так, как хочется видеть их на сцене. Тут стоит упомянуть одну особенность — симуляторам очень сложно просчитывать физику и поведение объектов, проникающих друг в друга или расположенных ближе, чем на 1 мм друг к другу. Подобные объекты могут «выстрелить» — разлететься в разные стороны в первый момент симуляции или в момент их взаимного проникновения. Поэтому можно пойти на небольшую хитрость — «повесить» кубики и шарики на 1 мм над своими подставками. В начале симуляции они упадут на свои места почти без инерции. Можно будет их приподнять и в самом симуляторе, это дело вкуса.
Вот тут красный кубик приподнят на 1 мм над подставкой, а синий остался на исходной позиции:
В итоге получились два таких полигона:
В младшей категории я раскрасил объекты, в старшей оставил белыми. В симуляторе все-равно придется им задавать правильные цвета, но далее возможны два варианта действий, оба я хочу показать на разных полигонах. В младшей категории я дал имя каждому игровому объекту в зависимости от его цвета и формы (RedBall, BlueCube, GreenCubeHole), а в старшей назвал объекты согласно их расположению (BigCube1, SmallCube2, Indicator9). В младшей категории я один раз раскрашу объекты и буду их перемещать в разные позиции, чтобы проводить симуляции с разными расстановками, так как в ней все объекты перемещаются по прямым влево-вправо и вперед-назад. В старшей категории перемещать объекты придется по окружности с центром в середине поля, это не очень удобно делать в симуляторе, поэтому я буду просто перекрашивать объекты на разных позициях.
Экспорт модели робота в формат URDF
URDF (Universal Robotic Description Format — универсальный формат описания роботов) широко используется в ROS и подходит для переноса информации о роботе в симулятор. Формат описывает геометрию звеньев робота и их сочленения, датчики и вспомогательную информацию о них (инерции, массы, цвета). К сожалению, не все САПР умеют сохранять в этот формат. Например, для AutoCAD, Fusion и SolidWorks эта функция реализована через сторонние плагины и дополнения. Покажу процесс на примере SolidWorks.
После того, как модель готова, необходимо скачать SW2URDF Exporter — расширение для SolidWorks. Оно подходит для 64-битной версии SolidWorks 2018 и более поздних. Проще всего использовать откомпилированный файл-установщик, достаточно запустить и следовать инструкциям. Но можно попытаться использовать исходный код, следуя инструкциям по указанной ссылке.
Далее необходимо в SolidWorks’е зайти в меню «Инструменты — добавления»:
Откроется новое окно со списком доступных добавлений-расширений. Отметим галочками «Активные» и «Запуск» строку SW2URDF, нажмем ОК:
Теперь важный момент — если меню SolidWorks не на английском языке, то нужный пункт в нем не появится. В этом случае необходимо зайти в то же меню «Инструменты» и открыть «Параметры». В появившемся окне находим «Настройки пользователя — Общие — Использовать меню на английском языке». Изменения появятся после перезапуска программы:
Перезапускаем, открываем требуемую модель и в меню «File» видим искомый пункт Export as URDF.
Далее можно двигаться согласно этому видео (просмотр доступен только на YouTube). Инструмент создаст оси согласно связям, заданным в модели. Необходимо будет указать имена звеньев, связей и типы соединений (взаимных движений звеньев, кинематических пар). Можно немного поэкспериментировать и подобрать нужные, но, в основном, будут использоваться две-три: continuous для неограниченного вращения (ограничим в самом симуляторе), prismatic для поступательного движения и fixed для жестко зафиксированных деталей (например, датчик или схват закреплены на подвижной каретке). Нажимаем «Preview and Export» и переходим в новое окно. Лимиты, то есть крайние положения при поворотах и перемещениях звеньев можно не задавать.
На этом следующем шаге проверяем, чтобы массы звеньев были адекватны. Если мы верно задавали размеры и материалы деталей, то они будут приближенными к действительным.
Импорт модели робота URDF в симулятор
В указанном выше видео показан процесс импорта моделей в симулятор CoppeliaSim (который раньше назывался V-REP). Используем плагин «URDF import», выбираем сохраненный файл URDF, дожидаемся окончания импорта, получаем модель, белую как чистый лист:
Теперь этот чистый лист надо «заполнить» — задать параметры объектов, чем займемся чуть позже, после….
Импорт модели полигона и игровых элементов в САПР
В том же САПР, где нарисована модель полигона и объектов, выбираем «Сохранить как» и выбираем один из доступных форматов: OBJ, STL. Они служат для переноса геометрии объектов между разными программами, подойдут и для переноса в симулятор. Скорее всего, каждый объект сохранится отдельным файлом, но это не страшно, их можно будет добавить одной операцией.
В CoppeliaSim идем в меню «File — Import — Mesh».
Находим все объекты в формате STL или OBJ и выбираем их все («рамочкой» или через зажатый Shift или Ctrl).
Следующий шаг достаточно важен: в появившемся окне необходимо снять галку «Auto scalling» и установить масштаб (Scaling) равным 0.001 — именно через точку. Скорее всего Ваш САПР при сохранении OBJ / STL за единицу измерения принимал миллиметры, а симулятор воспринимает их как метры и увеличивает модель в 1000 раз. Если при создании полигона в САПР за единицу измерения принимались дюймы, сантиметры или иные единицы измерения, то потребуется дополнительно считать масштаб.
Здесь стоит рассказать про одну хитрость, используемую в модели старшей категории. Игровые объекты в ней «утоплены» в полигон, расстояние между кубиком и полигоном составляет всего 1 мм. Это вызывает ошибки при расчетах столкновений и кубики «выстреливают» из своих позиций. Поэтому мы просто увеличили масштаб всей сцены в 10 раз: робота, всех элементов. Это потянуло за собой необходимость увеличивать массы объектов, силу приводов и т.д., но теперь кубики располагаются на расстоянии 10 мм от полигона и не вызывают ошибок расчетов. Далее, для упрощения, я буду показывать все действия на примере младшей категории, чтобы не углубляться в пересчет размеров, массы и других параметров.
В результате импорта получаем такую модель:
Все объекты полигона расположены верно друг относительно друга, но стоят вертикально. Ничего страшного, надо их повернуть на 90 градусов. Выбираем все элементы полигона в списке слева и нажимаем кнопку Rotate.
В появившемся окне переходим на вкладку Rotation и внимательно смотрим, вокруг какой оси надо повернуть полигон. В правом нижнем углу скриншота видны оси сцены и становится понятно, что поворачивать полигон надо вокруг оси Х. Вводим в нужное окно число 90 и нажимаем «Rotate selection».
Платформа повернулась и даже легла на пол сцены.
Теперь ее нужно передвинуть так, чтобы совпали опоры робота и зоны основания полигона. Не снимая выделения, так как двигать будем сразу все объекты, нажимаем кнопку «Object/item shifr».
В появившемся окне выбираем самый маленький доступный шаг перемещения (0.001) и оси, вдоль которых будем двигать объекты. После этого их можно «захватить» левой кнопкой мыши и перемещать вдоль выбранных осей.
Добиваемся точного совпадения опор робота и игрового полигона. В процессе подгонки я заметил, что полигон не лег на пол сцены, а висит над ним, поэтому пришлось сместить его вниз по оси Z.
Давайте теперь посмотрим на список объектов в симуляторе. Имена деталей и осей робота перенеслись корректно, а игровые элементы и полигон потеряли их и называются ShapeNN. Что ж, придется восстановить, переименовав каждый, для этого достаточно просто дважды щелкнуть по имени объекта в списке. Русские буквы в именах недопустимы.
Указание свойств и параметров всех объектов в симуляторе
Переходим к самому интересному. В первую очередь, нам надо указать параметры кинематических пар робота. Находим в списке объекты с подобными значками:
Это приводы робота, связи, которые могут управляться из скрипта — им можно будет указать положение или скорость вращения. Если модель робота переносилась не через URDF, то подобные приводы придется создавать вручную, связывая узлы робота. Инструкция по созданию робота с подобными связями доступна в официальных справочных материалах. Дважды щелкаем по объекту открывается окно его настроек:
В разделе Mode выбираем «Passive mode» для того, чтобы управлять положением привода из скрипта, или «Torque/force mode», чтобы управлять силой и крутящим моментом привода из скрипта. Второй режим позволит указать силу/момент привода и проверить, достаточно ли их для поднятия объектов. Подробнее о режимах можно почитать в официальной справке. Нам пока достаточно выбрать режим «Passive mode».
В разделе Configuration необходимо выбрать минимальную и максимальную позиции (то есть ограничения) для движений и поворотов или установить галочку «Position in cyclic» для неограниченного вращательного движения. Если при экспорте из САПР робот был в нулевом положении, то можно его и указать в окне текущей позиции.
Если используется режим «Torque/force mode», то имеет смысл зайти в настройки динамики привода, нажав кнопку «Show dynamic properties dialog»:
Здесь можно настроить максимальную силу/момент привода, например, подсмотрев их на сайте производителя конкретного мотора, начальную скорость движения или вращения привода (если хотим сделать активный элемент, например, конвейер).
Теперь перейдем к настройкам игровых объектов и полигона. Изначально они все отключены для физически расчетов — не будут падать под действием силы тяжести, не будут отскакивать друг от друга, будут пролетать через другие объекты. Вот это и настроим.
Сам полигон и подставки (в младшей категории) должны быть несмещаемые, как бы приклеенные жестко к полу сцены, но при попадании на них игровых объектов они должны учитываться, пружинить. Поэтому заходим в свойства основания и переходим в настройки динамики.
Ставим галочку «Body is respondable», обозначая этим, что объект учитывается при соударениях. Ставим все галки локальной и глобальной масок — учитывать соударения со всеми объектами.
Галочку «Body is dynamic» не ставим, тем самым «замораживая» объект в пространстве — он сам не двигается, но от него могут отскакивать другие объекты.
Можно зайти в редактирование материала и попробовать настроить то, как сильно он будет пружинить, изгибаться и сминаться и т.д. Но для решения задач олимпиады это избыточно.
Выберем теперь свойства какого-нибудь кубика или шарика:
Подобный объект не только учитывается при соударениях, но и имеют собственную динамику: будет падать под действием силы тяжести, отскакивать при соударениях. Для корректного расчета динамики необходимо указать массу объекта. Для кубиков в младшей категории это примерно 30 граммов, для шариков — до 20 граммов и т.д.
Посмотрим внимательно на основное окно свойств игровых объектов — там есть замечательная кнопка «Adjust color», позволяющая задать цвет объекта (и даже его прозрачность, свечение, пульсацию и т.д.). В появившемся окне выбираем «Ambient/diffuse component» и устанавливаем RGB-компоненты цвета. На скриншоте официальный синий цвет Lego.
После установки свойств игровым объектам необходимо вернуться к модели робота. Во-первых, его части тоже должны учитываться при соударениях с игровыми объектами, во-вторых, его тоже не мешает покрасить. Выбираем те детали робота, которые будут двигаться и участвовать в расчетах при симуляции. Это объекты со словом «respondable» в имени.
Объектам, в имени которых содержится «visual», можно задать цвет детали.
Все перенесенные из САПР модели роботов, полигона и игровых элементов перенесены, осталось только добавить схват. Открываем библиотеку стандартных компонентов и роботов, выбираем «Components — grippers — suction pad». Это модель пневматического схвата.
Добавим модель на сцену простым перетягиванием. Выскакивает окно с кратким описанием модели. Обратите внимание, схват немного больше наших игровых элементов, значит необходимо его уменьшить.
Заходим в свойства объекта, переходим на вкладку Common и внизу выбираем Scalling. В появившемся окне выбираем масштаб (меньше единицы — уменьшение, больше единицы — увеличение).
Добиваемся подходящего размера и уже знакомым инструментом Object shift перемещаем его к рабочему органу робота:
Теперь надо в списке объектов перетянуть объект «Suction pad» на тот «respondable» объект, который обозначает рабочий орган. В моем случае это «End_Effector_respondable»:
Для старшей номинации я использовал другой схват, с двумя пальцами:
В итоге мы получили сцену и робота, пригодных для проведения симуляций и тестирования алгоритмов роботов. Пока что «за скобками» остались датчики, камеры, изменением параметров и скриптов готовых схватов. Рассмотрим это на курсах или в следующих статьях, так как эта уже вышла очень длинной.
В следующей части мы рассмотрим основы написания управляющих скриптов для нашей модели робота или подключения внешней программы. Это облегчит начало работы на курсах. Оставайтесь на связи!