xacro语法

什么是xacro

xacro是为了解决在编写urdf文件过程中,出现的标签内容重复,但又不得不去写。一些值的计算有依赖的问题。

从功能的角度来说,xacro提供了常量定义,数学运算,宏定义等功能。

创建方式

xacrourdf文件的拓展,我们在使用的时候,为了和urdf文件进行区分,我们定义的模型文件名称后缀为.xacro.

同时,创建好的文件格式如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
</robot>

命令加载加载xacro

rosrun xacro xacro --inorder xxx.xacro

launch加载xacro

<param name="robot_description" command="$(find xacro)/xacro --inorder $(find pkg)/urdf/$(arg model)" />

常量

定义

<xacro:property name="width" value="0.2"/>
<xacro:property name="height" value="0.4"/>
<xacro:property name="len" value="0.6"/>

通过xacro:property标签定义常量。

name为常量名称,value为常量的值。

使用

<box size="${width} ${height} ${len}" />

通过 ${常量名称} 的方式进行使用。

完整示例

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
    <xacro:property name="width" value="0.2"/>
    <xacro:property name="height" value="0.4"/>
    <xacro:property name="len" value="0.6"/>

    <link name="base_link">
        <visual>
            <geometry>
                <box size="${width} ${height} ${len}" />
            </geometry>
        </visual>
    </link>
</robot>

数学运算

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
    <xacro:property name="a" value="0.3"/>
    <xacro:property name="b" value="0.1"/>

    <link name="base_link">
        <visual>
            <geometry>
                <box size="${a - b} ${a / 2 + b * 2} ${a * (b + 1.9)}"/>
            </geometry>
        </visual>
    </link>
</robot>

ab是定义的常量。

我们可以使用常量名进行加减乘除等数学操作。

宏定义

基本宏定义

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
    <xacro:macro name="default_box">
        <box size="0.2 0.4 0.6"/>
    </xacro:macro>

    <link name="base_link">
        <visual>
            <geometry>
                <xacro:default_box/>
            </geometry>
        </visual>
    </link>
</robot>

通过 <xacro:macro> 标签来定义宏,name确定宏的名称。

使用的时候,通过 <xacro:宏名称/> 的方式进行使用。

参数宏定义

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
    <xacro:macro name="link_box" params="name width height len">
        <link name="${name}">
            <visual>
                <geometry>
                    <box size="${width} ${height} ${len}"/>
                </geometry>
            </visual>
        </link>
    </xacro:macro>

    <xacro:link_box
            name="base_link"
            width="0.2" height="0.4" len="0.6"/>

</robot>

通过 <xacro:macro> 标签来定义宏,name确定宏的名称。

params定义参数变量名称,多个参数变量中间用空格分隔。

在宏定义过程中,参数变量通过 ${参数变量名称} 的方式进行访问,当然也可以做数学运算。

使用过程中,通过<xacro:宏名称/>的方式进行使用,需要传入的参数,通过参数名='值'的方式进行传递。

条件判断

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">

    <xacro:macro name="HMColor" params="name">
        <material name="${name}">
            <xacro:if value="${name=='red'}">
                <color rgba="1.0 0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='green'}">
                <color rgba="0 1.0 0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='blue'}">
                <color rgba="0 0 1.0 1.0"/>
            </xacro:if>
            <xacro:if value="${name=='white'}">
                <color rgba="1.0 1.0 1.0 1.0"/>
            </xacro:if>
        </material>
    </xacro:macro>

    <link name="base_link">
        <visual>
            <geometry>
                <box size="1 2 3" />
            </geometry>
            <xacro:HMColor name="blue"/>
        </visual>
    </link>
</robot>

通过xacro:if可以实现条件判断,value中是条件内容,值为bool类型。

需要注意的是,定义的宏名称不能和现有标签名称相同。