Цель работы
- Знакомство с основами построения модели робота
- Создание первой urdf модели робота
- Изучение инструментов для визуализации модели робота
Целью данной работы является закрепление теоретического материала по созданию моделей роботов с использованием ROS и подготовка к лабораторной работе №3.
В данной работе необходимо пользоваться теоретическими материалами. Чтобы создать первую модель, нам понадобится пакет в системе catkin. В дальнейшем вы будете пользоваться некоторыми вспомогательными инструментами Visual Studio Code (VS Code), поэтому рекомендуется установка программы.
Создание первого urdf файла
- Создание пакета
Создайте новый пакет в рабочем пространстве catkin:
cd catkin_ws/src catkin_create_pkg my_robot_model rospy std_msgs roscpp catkin build
- Создание структуры папок
Внутри ROS пакета создайте подпапки scripts, launch и urdf:
cd my_robot_model mkdir scripts launch urdf
- Создание первой модели
Создайте свою первую модель в формате urdf, для этого перейдите в папку urdf и создайте xml файл с расширением .urdf:
cd urdf code my_first_model.urdf
Замечание! Убедитесь, что у вас в Visual Studio Code установлено расширение ROS от Microsoft. Также вам необходимо установить расширение ROS Snippets(Liews Wuttipat). Запустить визуализатор можно при помощи CTRL+Shift+P и выбрать из списка URDF Viewer. Также рекомендуется запускать VS Code из рабочего окружения catkin, например:
cd catkin_ws code .
Затем необходимо убедиться, что VS Code определил ваш проект как ROS (внизу окна слева должна отображаться версия ROS), это может быть необходимо для корректной работы расширений в VS Code.
- Создание модели
В качестве тренировки предлагается создать модель мобильного робота с дифференциальным приводом, показанную на рисунке ниже.
Мобильный робот с дифференциальным приводом
В первую очередь вы должны определить, какие элементы робота имеют относительную подвижность. Как можно видеть из изображения, два колеса являются приводными и имеют вращательную степень подвижности вокруг одной оси. Третье колесо (его не видно на изображении) имеет пассивно-сферический тип, т.е. может свободно вращаться. Также необходимо определить, какое звено является базовым, базовое звено - тот элемент, к которому все остальные звенья присоединяются при помощи шарниров, образуя при этом древовидную структуру. Важно отметить, что замкнутая кинематика в явном виде не поддерживается в разметке URDF.
- Создание базового звена
Создайте первый элемент - базовое звено, это будет корпус платформы для данного примера:
[Содержимое файла base_link.urdf] - Настройка шарниров
У шарнира, который соединяет колесо с базой необходимо установить type="continuous", поскольку мы не хотим задавать какие либо огрничения на его вращение. Также у шарниров типа "continuous" необходимо задать ось вращения:
<axis xyz="1.0 0.0 0.0"/>
-
Необходимо скопировать и переименовать звено wheel_left в звено wheel_right
-
После чего необходимо настроить положение и ориентацию колес в соответствии с изображением робота.
- Создание базового звена
- Настройка пакетов для работы с шарнирами
Поскольку в модели имеются шарниры, информация о состоянии этих элементов должны быть доступна в ROS, для этого необходимы два пакета: joint_state_publisher и robot_state_publisher, сделайте это в launch файле путем добавления следующих строк:
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
- Открытие модели в Rviz
Rviz можно открыть из терминала, воспользовавшись командой:
rviz
либо указать автоматический запуск в файле запуска. Однако, чтобы модель робота была доступна в Rviz, необходимо в файле запуска выполнить загрузку модели робота в robot_description сервера парметров ROS.
Далее показан пример с загрузкой модели робота в сервер парметров и запуск rviz:
<launch> <arg name="gui" default="False" /> <param name="robot_description" textfile="$(find my_robot_model)/urdf/my_first_model.urdf" /> <param name="use_gui" value="$(arg gui)"/> <node name="rviz" pkg="rviz" type="rviz" /> </launch>
Добавьте в файл запуска выше указанную разметку и запустите launch файл:
roslaunch my_robot_model robot.launch
В результате должен запуститься Rviz, но модель робота не отобразится. Далее рассмотрим причины и способы, как это исправить.
- Настройка визуализации в Rviz
После подключения пакетов и запуска Rviz, вы можете визуализировать все системы координат, имеющиеся в модели, для этого нажмите в Rviz следующие кнопки: Add a new display и выберите TF. Также необходимо в меню Global Options в пункте Fixed Frame выбрать base_link (система отсчета). Чтобы отобразить саму модель, необходимо нажать кнопку "Add" и выбрать "RobotModel".
Окно Rviz
- Управление шарниром
Запустите графический итерфейс для joint_state_publisher, чтобы попробовать поврощать шарниры колеса, но сначала нужно установить данный пакет под названием joint_state_publisher_gui:
sudo apt install ros-noetic-joint-state-publisher-gui
Подключение это можно сделать и через терминал, но вам рекомендуется сделать это через launch файл, указав дополнительную строку:
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
Также необходимо закомментировать joint_state_publisher так как одновременно два пакета не должны публиковать в одни и те же топики.
Проверьте корректность расположения осей вращения и звеньев мобильного робота и внесите необходимые изменения, чтобы модель соответствовала роботу, изображенному на картинке выше.
Создание модели в xacro
Чтобы ваша модель была более гибкой и универсальной, необходимо воспользоваться возможностями XACRO.
- Создание xacro файла
Создайте новый файл под названием diff_robot_model.urdf.xacro, скопируйте туда описание модели и укажите дополнительный параметр тега robot:
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="my_robot">
- Изменение launch файла
Для работы xacro вам необходимо изменить launch файл, интересует строка загрузки robot_description в сервере параметров:
<param name="robot_description" command="xacro '$(find my_robot_model)/urdf/diff_robot_model.urdf.xacro'" />
- Использование свойств
Создайте также свойство в файле:
<xacro:property name="side" value="right" />
Теперь вместо значения вы можете указать $(side), чтобы обеспечить быстрое редактирование (как у звена, так и у шарнира). Например:
<link name='wheel_${side}'> <visual name='wheel_${side}_visual'>
Задание на 5 минут: Создайте свойство с наванием wheel_diameter и в описании модели замените диаметры цилиндров на значение свойства. Проверьте в RViz результат.
- Создание файла материалов
Создайте новый файл с названием materials.xacro и задайте внутри цвета, которые вы хотите использовать в модели:
[Содержимое файла materials.xacro]Теперь в основном файле .xacro вы можете подключить этот файл следующим образом:
<xacro:include filename="$(find my_robot_model)/urdf/materials.xacro" />
И использовать данные цвета для модели робота:
<material name="red"/> <!--inside visual tag -->
- Использование макросов
Использование xacro:macro позволяет избегать повторения фрагментов разметки, например, колесо повторяется для левой и правой стороны, при этом в фрагменте меняется только имя элемента и положение. Создадим отдельный файл, в котором будет содержаться описание колеса и будем его копии импортировать с автоматической подстройкой под нужную сторону.
- Создание файла wheel.xacro
Создайте новый файл wheel.xacro со следующим содержанием:
[Содержимое файла wheel.xacro] - Использование макроса
В файле модели укажем вызов macro с необходимыми нам параметрами (парметры очень похожи на свойства, с единственным отличием - их значения нам надо передавать при вызове):
<xacro:wheel side="left" x="0.25" y="0.4" z="0.0" />
Использование трехмерных моделей сложной формы
Чтобы ваши модели были более реалистичными, вы можете подключить любой stl файл внутри блока "geometry" следующим образом:
<mesh filename="package://my_robot_model/models/base_frame.stl" scale="1.0 1.0 1.0"/>
При этом важно отметить, что путь до файла указывается относительно ROS пакета.
Первый запуск симуляции
Чтобы смоделировать движение мобильного робота, необходимо, чтобы у каждого звена были блоки collision и inertial. Если они отсутствуют, то их необходимо добавить. Также массы объектов должны быть больше 0 (рекомендуется не моделировать элементы массой менее 0.01 кг).
Для зупуска Gazebo пропишите следующий исходный код в launch файле:
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find my_robot_model)/worlds/empty.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>
<node name="my_robot_spawn" pkg="gazebo_ros" type="spawn_model" output="screen" args="-urdf -param robot_description -model my_robot_model"/>
Цвета объектов из urdf не поддерживаются в Gazebo, поэтому вам необходимо указывать специальные теги для симулятора.
Задание для самостояятельного выполнения
- Добавить двухзвенный манипулятор к подвижной платформе.
- Добавить ограничения к шарнирам манипулятора, чтобы он неимел возможности сталкиваться со вторым звеном
Вопросы для самопроверки
- Что такое URDF?
- Чем отличается XACRO от URDF?
- Зачем нужен joint_state_publisher в Gazebo?
- Для чего необходим robot_state_publisher?
- Какой тег обязательно должен присутствовать в разметке любого XACRO файла?
Оставить комментарий