Для того, чтобы работать с роботом в 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: заменив во второй строчке название:
Затем нужно поправить файл display.launch, который находится в ~/ws_moveit/src/urdf_test/launch (строчки 3-5), указав новое название пакета:
Для того, чтобы запустился 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
$ pip install pycollada
Если после этого в FreeCAD при попытке экспорта в dae возникает ошибка, то можно открыть в нем консоль Python (Вид - Панели - Консоль Python) и импортировать модуль вручную (см. на рисунке выше):
$ import collada as pycollada
Сохранить детали dae и stl следует в папку meshes проекта urdf_test.
Экспорт в stl - здесь все работает из коробки и проблем быть не должно.
В итоге в папке meshes добавились два файла:
- test_part.dae
- test_part.stl
Команда для отображения этого робота:
$ 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 определяется двумя условиями:
- собственно начало координат второго звена задано в элементе joint - сдвинуто относительно "родительского" на 0,1 м по оси Х: <origin xyz="0.1 0 0"/> (вектор сдвига отображен красной стрелкой),
- начало координат визуального объекта (конуса), который является изображением второго звена задано в элементе link - сдвинуто на 0,1 м по осям X и Y: <origin rpy="0 0 0" xyz="0.1 0.1 0"/>.
Если в описании звена добавить информацию о массе и коллизиях, то данные элементы также будут иметь теги <origin/> задающие положение центров этих элементов относительно начала координат звена. При этом начало координат текущего звена задается по отношению к своему "родителю" - звену нижнего уровня.
Это позволяет с одной стороны создать иерархическую структуру звеньев, а с другой возможность гибкой настройки их элементов: визуальных, инерционных и ограничивающего для расчета коллизий.
В следующей части сделаю робота с четырьмя подвижными звеньями. А пока на этом все.
Let`s go design!
Комментарии
Отправить комментарий