# 4.1.2 Базовый файл URDF / Xacro.

Давайте теперь посмотрим на файл URDF/Xacro, который использовался выше для загрузки блочной модели базы робота. Файл называется *base.urdf.xacro* и находится в каталоге *rbx2\_description/urdf/box\_robot*. Мы рассмотрим файл в разделах начиная сверху:

```
1     <?xml version="1.0"?>
2     <robot name="base" xmlns:xacro="http://ros.org/wiki/xacro">
```

Все файлы URDF / Xacro начинаются с этих двух открывающих тегов. Все после тега  будет определять наш компонент, и мы закроем весь файл с завершающим тегом *\</ robot>*.

```
4     <!-- Define a number of dimensions using properties -->
5     <property name="base_size_x" value="0.30" />
6     <property name="base_size_y" value="0.30" />
7     <property name="base_size_z" value="0.12" />
8     <property name="wheel_length" value="0.02032" />
9     <property name="wheel_radius" value="0.06191" />
10    <property name="wheel_offset_x" value="0.09" />
11    <property name="wheel_offset_y" value="0.17" />
12    <property name="wheel_offset_z" value="-0.038" />
13
14    <property name="PI" value="3.1415" />
```

Раздел свойств позволяет нам назначать все измерения и смещения переменным, которые затем могут использоваться в остальной части файла. Если изменения будут внесены в робота позднее, просто измените эти значения соответствующим образом. При установке значений свойств учитывайте следующие моменты:

·      линейные размеры указаны в метрах

·      угловые значения приведены в радианах

·      при указании параметров *xyz* оси координат выровнены по x, указывая направление робота вперед, yуказывает влево, а z указывает вверх. Например, свойство *wheel\_offset\_y* выше указывает расстояние, на которое каждое колесо установлено слева или справа от центральной линии робота.

·      при назначении параметров вращения *rpy* (roll, pitch, yaw) параметр roll (r) вращается вокруг оси x, шаг (p) - вокруг оси y, а yaw (y) вращается вокруг оси z.

Чтобы увидеть оси, прикрепленные к базе в RViz, установите значение **Alpha** для *base\_link* примерно на *0,5*, например:

![](https://3124508696-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M9OclvMFX0tnOa4eaat%2F-M9oFIZTPY9mR4IDMFYi%2F-M9oH2qJkUy22bFK5kIU%2F%D0%91%D0%B5%D0%B7%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B02.png?alt=media\&token=d6691123-e691-4ac2-af61-7cb1aff1e09f)

Здесь мы установили значение **Alpha** равным 0,5 для *base\_link* и отметили поле рядом с **Show Axes**. *RViz* всегда использует один и тот же код цвета для осей кадра, прикрепленных к ссылке: красный для оси x, зеленый для y и синий для z.

Теперь вернемся к нашему обсуждению файла *base.urdf.xacro*. Вот блок для колеса:

```
16     <!-- define a wheel -->
17     <macro name="wheel" params="suffix parent reflect color">
18     <joint name="${parent}_${suffix}_wheel_joint" type="continuous">
19     <axis xyz="0 0 1" />
20     <limit effort="100" velocity="100"/>
21     <safety_controller k_velocity="10" />
22     <origin xyz="${wheel_offset_x} ${reflect*wheel_offset_y} $
{wheel_offset_z}" rpy="${reflect*PI/2} 0 0" />
23     <parent link="${parent}_link"/>
24     <child link="${parent}_${suffix}_wheel_link"/>
25     </joint>    
26     <link name="${parent}_${suffix}_wheel_link">
27     <visual>
28     <origin xyz="0 0 0" rpy="0 0 0" />
29     <geometry>
30     <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
31     </geometry>
32     <material name="${color}" />
33     </visual>
34     </link>
35     </macro>
```

Колесо определяется как макрос, так что мы можем использовать его для каждого колеса без повторения *XML*. Мы не будем подробно описывать синтаксис, так как он уже описан URDF tutorials. Однако обратите внимание на использование параметра *reflect,* который принимает значения *1* или *-1* для левой и правой сторон соответственно и позволяет нам переворачивать колесо и знак смещения y.

```
37     <!-- The base xacro macro -->
38     <macro name="base" params="name color">
39     <link name="${name}_link">
40     <visual>
41     <origin xyz="0 0 0" rpy="0 0 0" />
42     <geometry>
43     <box size="${base_size_x} ${base_size_y} ${base_size_z}" />
44     </geometry>
45     <material name="${color}" />
46     </visual>
47     <collision>
48     <origin xyz="0 0 0" rpy="0 0 0" />
49     <geometry>
50     <box size="${base_size_x} ${wheel_offset_y*2 + wheel_length} $
{base_size_z}" />
51     </geometry>
52     </collision>
53     </link>
54     </macro>
```

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

```
56     <link name="base_footprint">
57     <visual>
58     <origin xyz="0 0 0" rpy="0 0 0" />
59     <geometry>
60     <box size="0.05 0.05 0.001" />
61     </geometry>
62     <material name="TransparentGreen" />
63     </visual>
64     </link>
65
66     <joint name="base_joint" type="fixed">
67     <origin xyz="0 0 ${base_size_z/2 - wheel_offset_z}" rpy="0 0 0" /> 68
<parent link="base_footprint"/>
69     <child link="base_link" />
70     </joint>

```

Здесь мы определяем ссылку *base\_footprint* и фиксированное соединение, которое определяет ее отношение к *base\_link*. Как объяснено в следующем разделе, роль base\_footprint по существу состоит в определении высоты основания над землей. Как вы можете видеть выше, соединение между опорой и основанием поднимает основание на величину, рассчитанную по высоте основания и смещению по оси z колес. Чтобы понять, почему мы должны поднять робота на величину *base\_size\_z / 2,* измените **Fixed Frame** в *RViz* на */base\_link*. Если вы используете мышь, чтобы сместить точку обзора так, чтобы вы смотрели на землю почти с ребра, изображение должно выглядеть так:

![](https://3124508696-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M9OclvMFX0tnOa4eaat%2F-M9oFIZTPY9mR4IDMFYi%2F-M9oHIxe9dSXevA2FAwO%2F%D0%91%D0%B5%D0%B7%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B03.png?alt=media\&token=1b1b2a3e-0d61-4415-989c-882a740b8486)

Обратите внимание, как источник компонента URDF-блока расположен в центре блока; то есть на высоте *base\_size\_z / 2* метра над дном робота. Следовательно, фиксированное соединение между рамкой */base\_footprint* (которая опирается на землю) и рамкой */base\_link* должно включать перемещение в направлении z на расстояние *base\_size\_z/2* метра, чтобы поднять дно робота. Наконец, давайте добавим два ведущих колеса к роботу:

```
72     <!-- Add the drive wheels -->
73     <wheel parent="base" suffix="l" reflect="1" color="Orange"/>
74     <wheel parent="base" suffix="r" reflect="-1" color="Orange"/>

```

Здесь мы дважды вызываем макрос  с параметром *reflect*, установленным сначала *1* для левого колеса и *-1* для правого, чтобы убедиться, что колеса установлены на противоположных сторонах основания. Параметр суффикса заставляет макрос  давать каждой ссылке на колесо уникальное имя.
