ROS MoveIt - импорт модели робота с помощью URDF - ч.1

Для того, чтобы работать с роботом в ROS и MoveIt необходимо его импортировать (предполагается, что у нас есть готовая 3D-модель): для этого существуют URDF-файлы. Для SolidWorks есть расширение SolidWorks to URDF Exporter, позволяющее экспортировать в URDF детали и сборки. Для начала работы с ней можно посмотреть примеры в описании утилиты или более подробные руководства, например это. У меня первый опыт общения с этой утилитой оказался неудачным: части робота оказались разнесенными в пространстве, поэтому захотелось подробней разобраться в URDF.

План работ у меня такой: сделать простую модель робота в FreeCad и импортировать ее в MoveIt через URDF, после чего немного поуправлять ей с помощью PS3 контроллера.

В своих постах я буду опираться на примеры из Learning URDF Step by Step

Здесь можно найти подробное описание всех элементов XML, использующихся в описании URDF.

Экспорт в URDF из FreeCad - форматы и размеры

В URDF есть особенность - все размеры записываются в метрах, что необходимо учитывать при экспорте: рекомендуемый формат файлов с описанием геометрии звеньев - COLLADA (DAE), также можно использовать STL. При этом, если размеры модели заданы в миллиметрах (а это чаще всего так), то при использовании COLLADA все экспортируется без проблем, а для STL необходимо указывать масштабирование.

В качестве тестового примера используем несколько измененный пакет urdf_tutorial, который находится в /opt/ros/melodic/share/. Для начала, его надо скопировать в раздел src в catin workspace (у меня это ~/ws_moveit/src/) и переименовать в urdf_test. После этого необходимо изменить описание пакета: файл package.xml: заменив во второй строчке название:

<name>urdf_test</name>

Затем нужно поправить файл display.launch, который находится в ~/ws_moveit/src/urdf_test/launch (строчки 3-5), указав новое название пакета:

<arg name="model" default="$(find urdf_test)/urdf/01-myfirst.urdf"/>
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find urdf_test)/rviz/urdf.rviz" />

Для того, чтобы запустился catkin_make и пакет urdf_test зарегистрировался в ROS, необходимо в корневую папку пакета добавить файл CMakeLists.txt. Как показала практика, для начала вполне хватает такого минимального содержания:

cmake_minimum_required(VERSION 2.8.3)
project(urdf_test)
 
find_package(catkin REQUIRED)
 
catkin_package()
 
find_package(roslaunch)
 
foreach(dir config launch meshes urdf)
    install(DIRECTORY ${dir}/
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/${dir})
endforeach(dir)

После этого можно переходить в корень workspace и выполнять catkin_make:

$ catkin_make

Если команда выполнилась без ошибок, то можно проверить работает ли пакет, запустив display.launch:

$ roslaunch urdf_test display.launch

Должен открыться первый пример 01-myfirst.urdf в RViz

Теперь можно переходить к созданию своих файлов URDF!

Чтобы разобраться с особенностями экспорта/импорта моделей из FreeeCAD в URDF для начала можно поработать с простой тестовой деталью - усеченным конусом с основаниями 100/70 мм и высотой 50 мм. Начало координат детали находится в центре большего основания (плоскость Х0Y), ось Z направлена на меньшее основание.
 

Экспорт в COLLADA. Для этого необходимо установить расширение pycollada для Python. Сделать это можно с помощью pip:

$ pip install pycollada

Если после этого в FreeCAD при попытке экспорта в dae возникает ошибка, то можно открыть в нем консоль Python (Вид - Панели - Консоль Python) и импортировать модуль вручную (см. на рисунке выше):

$ import collada as pycollada

Сохранить детали dae и stl следует в папку meshes проекта urdf_test.

Экспорт в stl - здесь все работает из коробки и проблем быть не должно.

В итоге в папке meshes добавились два файла: 

  • test_part.dae
  • test_part.stl
Для того, чтобы проверить как эти модели импортируются, я создал простой URDF-файл part_export_test.urdf в папке ~/ws_moveit/src/urdf_test/urdf:
 
<?xml version="1.0"?>
<robot name="part_import_test">

<material name="blue">
<color rgba="0 0 1 1"/>
</material>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
<link name="import_part_dae">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="package://urdf_test/meshes/test_part.dae"/>
</geometry>
<material name="white"/>
</visual>
</link>

<link name="import_part_stl">
<visual>
<origin rpy="0 0 0" xyz="0.1 0.1 0"/>
<geometry>
<mesh filename="package://urdf_test/meshes/test_part.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="blue"/>
</visual>
</link>

<joint name="parts_joint" type="fixed">
<parent link="import_part_dae"/>
<child link="import_part_stl"/>
<origin xyz="0.1 0 0"/>
</joint>

</robot>

 Команда для отображения этого робота:

$ roslaunch urdf_test display.launch model:='$(find urdf_test)/urdf/part_export_test.urdf'

В итоге должно получиться нечто подобное (для правильного отображения Fixed Frame должно быть import_part_dae):


Оба звена здесь одного размера: для формата dae не требует никаких настроек, а для stl необходимо указать параметр: scale="0.001 0.001 0.001".

Первое звено - import_part_dae - базовое, находится в начале координат. Положение второго звена - import_part_stl определяется двумя условиями:

  1. собственно начало координат второго звена задано в элементе joint - сдвинуто относительно "родительского" на 0,1 м по оси Х: <origin xyz="0.1 0 0"/> (вектор сдвига отображен красной стрелкой),
  2. начало координат визуального объекта (конуса), который является изображением второго звена задано в элементе link - сдвинуто на 0,1 м по осям X и Y: <origin rpy="0 0 0" xyz="0.1 0.1 0"/>.

Если в описании звена добавить информацию о массе и коллизиях, то данные элементы также будут иметь теги <origin/> задающие положение центров этих элементов относительно начала координат звена. При этом начало координат текущего звена задается по отношению к своему "родителю" - звену нижнего уровня. 

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

В следующей части сделаю робота с четырьмя подвижными звеньями. А пока на этом все.

Let`s go design!





Комментарии