воскресенье, 1 октября 2017 г.

Xacro. Макросы

XML хорош тем, что позволяет описать почти всё, что угодно. В ROS он используется для описания роботов (URDF, SDF), и чем больше робот, тем больше текста содержит файл, который и создавать бывает не просто, а изменять параметры ещё сложнее. Xacro (XML Macros) является языком макрорасширений для работы с XML. Он позволяет определять как отдельные параметры, так и целые блоки, которые будут преобразованы в текст и вставлены в заданном месте. Если вы знакомы с макросами в C/C++, с Xmacro тоже легко разберётесь.


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

   <xacro:property name="имя_параметра" value="значение_параметра" />

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

   ${имя_параметра}

Xacro подставит на это место текстовое значение параметра. Поскольку это текст, вполне допустимо использовать его как часть строки, например, префикса: "${параметр}_окончание". В случае числовых переменных можно использовать арифметические выражения типа ${параметр1*параметр2+параметр3}, ${sin(параметр4)} и т.п. Начиная с версии ROS Jade для обработки выражений в фигурных скобках используется python, так что можно применять любые арифметические и булевы конструкции, синтаксически допустимые в данном языке. Логические выражения могут быть полезны в условных конструкциях типа

   <xacro:if value="${ условие }">
      <   ...xml код...   >
   </xacro:if>

или 

   <xacro:unless value="${ условие }">
      <   ...xml код... >
   </xacro:unless>

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

   <тэг value="$ (find пакет)" />
   <тэг value="$ (arg переменная)" />

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

   <xacro:include filename="путь/файл.xacro" />

Наконец, в Xacro можно создавать большие фрагменты текста, содержимое которых зависит от задаваемых параметров (т.е. те самые макросы). Делается это с помощью конструкции

   <xacro:macro name="имя_макроса" params="параметр1 параметр2">
      <   ...xml код, ключающий параметр1 и параметр2...   >
   </xacro:macro>

Вставить макрос в файл можно в следующем виде

   <xacro:имя_макроса параметр1="значение1" параметр2="значение2" />

В качестве примера рассмотрим следующий игрушечный файл test.xacro, который, в сущности, не описывает ничего, а лишь показывает, как использовать данный макроязык.


Особенностью Xacro является необходимость указания параметра для xml:xacro. С помощью name можно также определить пространство имён. При объединении нескольких файлов это позволит избежать конфликтов между макросами.

Первая половина данного файла определяет свойство radius и макрос my_macro, а вторая описывает пример их использования. Сгенерировать, например, XML файл можно с помощью команды 

   rosrun xacro xacro test.xacro > test.xml



Комментариев нет:

Отправить комментарий