Цель работы

  • Знакомство с основами построения модели робота
  • Создание первой urdf модели робота
  • Изучение инструментов для визуализации модели робота

Целью данной работы является закрепление теоретического материала по созданию моделей роботов с использованием ROS и подготовка к лабораторной работе №3.

В данной работе необходимо пользоваться теоретическими материалами. Чтобы создать первую модель, нам понадобится пакет в системе catkin. В дальнейшем вы будете пользоваться некоторыми вспомогательными инструментами Visual Studio Code (VS Code), поэтому рекомендуется установка программы.

Создание первого urdf файла

  1. Создание пакета

    Создайте новый пакет в рабочем пространстве catkin:

    cd catkin_ws/src
    catkin_create_pkg my_robot_model rospy std_msgs roscpp
    catkin build
  2. Создание структуры папок

    Внутри ROS пакета создайте подпапки scripts, launch и urdf:

    cd my_robot_model
    mkdir scripts launch urdf
  3. Создание первой модели

    Создайте свою первую модель в формате 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.

  4. Создание модели

    В качестве тренировки предлагается создать модель мобильного робота с дифференциальным приводом, показанную на рисунке ниже.

    Мобильный робот с дифференциальным приводомМобильный робот с дифференциальным приводом

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

    • Создание базового звена

      Создайте первый элемент - базовое звено, это будет корпус платформы для данного примера:

      [Содержимое файла base_link.urdf]
    • Настройка шарниров

      У шарнира, который соединяет колесо с базой необходимо установить type="continuous", поскольку мы не хотим задавать какие либо огрничения на его вращение. Также у шарниров типа "continuous" необходимо задать ось вращения:

      <axis xyz="1.0 0.0 0.0"/>
    • Необходимо скопировать и переименовать звено wheel_left в звено wheel_right

    • После чего необходимо настроить положение и ориентацию колес в соответствии с изображением робота.

  5. Настройка пакетов для работы с шарнирами

    Поскольку в модели имеются шарниры, информация о состоянии этих элементов должны быть доступна в 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" />
  6. Открытие модели в 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, но модель робота не отобразится. Далее рассмотрим причины и способы, как это исправить.

  7. Настройка визуализации в Rviz

    После подключения пакетов и запуска Rviz, вы можете визуализировать все системы координат, имеющиеся в модели, для этого нажмите в Rviz следующие кнопки: Add a new display и выберите TF. Также необходимо в меню Global Options в пункте Fixed Frame выбрать base_link (система отсчета). Чтобы отобразить саму модель, необходимо нажать кнопку "Add" и выбрать "RobotModel".

    Окно RvizОкно Rviz
  8. Управление шарниром

    Запустите графический итерфейс для 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.

  1. Создание xacro файла

    Создайте новый файл под названием diff_robot_model.urdf.xacro, скопируйте туда описание модели и укажите дополнительный параметр тега robot:

    <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="my_robot">
  2. Изменение launch файла

    Для работы xacro вам необходимо изменить launch файл, интересует строка загрузки robot_description в сервере параметров:

    <param name="robot_description" command="xacro '$(find my_robot_model)/urdf/diff_robot_model.urdf.xacro'" />
  3. Использование свойств

    Создайте также свойство в файле:

    <xacro:property name="side" value="right" />

    Теперь вместо значения вы можете указать $(side), чтобы обеспечить быстрое редактирование (как у звена, так и у шарнира). Например:

    <link name='wheel_${side}'>
    <visual name='wheel_${side}_visual'>

    Задание на 5 минут: Создайте свойство с наванием wheel_diameter и в описании модели замените диаметры цилиндров на значение свойства. Проверьте в RViz результат.

  4. Создание файла материалов

    Создайте новый файл с названием materials.xacro и задайте внутри цвета, которые вы хотите использовать в модели:

    [Содержимое файла materials.xacro]

    Теперь в основном файле .xacro вы можете подключить этот файл следующим образом:

    <xacro:include filename="$(find my_robot_model)/urdf/materials.xacro" />

    И использовать данные цвета для модели робота:

    <material name="red"/> <!--inside visual tag -->
  5. Использование макросов

    Использование xacro:macro позволяет избегать повторения фрагментов разметки, например, колесо повторяется для левой и правой стороны, при этом в фрагменте меняется только имя элемента и положение. Создадим отдельный файл, в котором будет содержаться описание колеса и будем его копии импортировать с автоматической подстройкой под нужную сторону.

  6. Создание файла wheel.xacro

    Создайте новый файл wheel.xacro со следующим содержанием:

    [Содержимое файла wheel.xacro]
  7. Использование макроса

    В файле модели укажем вызов 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, поэтому вам необходимо указывать специальные теги для симулятора.

Задание для самостояятельного выполнения

  1. Добавить двухзвенный манипулятор к подвижной платформе.
  2. Добавить ограничения к шарнирам манипулятора, чтобы он неимел возможности сталкиваться со вторым звеном

Вопросы для самопроверки

  • Что такое URDF?
  • Чем отличается XACRO от URDF?
  • Зачем нужен joint_state_publisher в Gazebo?
  • Для чего необходим robot_state_publisher?
  • Какой тег обязательно должен присутствовать в разметке любого XACRO файла?