xacro
什么是xacro¶
xacro
是为了解决在编写urdf
文件过程中,出现的标签内容重复,但又不得不去写。一些值的计算有依赖的问题。
从功能的角度来说,xacro
提供了常量定义,数学运算,宏定义等功能。
创建方式¶
xacro
是urdf
文件的拓展,我们在使用的时候,为了和urdf
文件进行区分,我们定义的模型文件名称后缀为.xacro
.
同时,创建好的文件格式如下:
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mymodel">
</robot>
常量¶
定义¶
<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>
a
和b
是定义的常量。
我们可以使用常量名进行加减乘除等数学操作。
宏定义¶
基本宏定义¶
<?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
类型。
需要注意的是,定义的宏名称不能和现有标签名称相同。