xacro
是为了解决在编写urdf
文件过程中,出现的标签内容重复,但又不得不去写。一些值的计算有依赖的问题。为了和urdf
文件区分,我们定义的模型文件名后缀为.xacro
。从功能的角度来说,
xacro
提供了属性定义,数学运算,条件判断和宏定义等功能。注意:必须在robot标签中加入
xmlns:xacro="http://www.ros.org/wiki/xacro"
属性!!该文件中注释不能用中文!!!
属性
属性的定义使用
<xacro:property>
标签完成,使用的时候用${属性名称}
来调用该参数。
例如:
<!-- define -->
<xacro:property name="the_radius" value="2.1" />
<xacro:property name="the_length" value="4.5" />
<!-- use -->
<geometry type="cylinder" radius="${the_radius}" length="${the_length}" />
数学运算
在变量的大括号中可以使用基本的数学运算,可以使用Python数学模块中的函数和常量
包括,但不限于以下:
pi
:πsin
:正弦函数cos
:余弦函数tan
:正切函数radians
:角度值转弧度制
例如:
<xacro:property name="R" value="2" />
<xacro:property name="alpha" value="${30/180*pi}" />
<circle circumference="${2 * pi * R}" pos="${sin(alpha)} ${cos(alpha)}" />
<limit lower="${radians(-90)}" upper="${radians(90)}" effort="0" velocity="${radians(75)}" />
条件判断
语法:
<xacro:if value="<expression>">
<... some xml code here ...>
</xacro:if>
<xacro:unless value="<expression>">
<... some xml code here ...>
</xacro:unless>
表达式中的结果必须是0、1、true或false,否则将会出现错误。
在
<expression>
中任何结果为布尔值的Python表达式都是可以的。
例子:
<xacro:property name="var" value="useit"/>
<xacro:if value="${var == 'useit'}"/>
<xacro:if value="${var.startswith('use') and var.endswith('it')}"/>
<xacro:property name="allowed" value="${[1,2,3]}"/>
<xacro:if value="${1 in allowed}"/>
宏定义
宏定义使用
xacro:macro
来定义一个宏,参数用空格分割,参数可以用:=
来添加默认值
语法:
<!-- define -->
<xacro:macro name="<name>" params="<params>">
<... some xml code here ...>
</xacro:macro>
<!-- use -->
<xacro:<name> <params>="" />
例子:
<xacro:macro name="ak_axis_x">
<axis xyz="1 0 0"/>
</xacro:macro>
<xacro:macro name="ak_link" params="name type:=box">
<link name="${name}">
<visual>
<geometry>
<xacro:if value="${type == 'box'}">
<box size="1 2 3"/>
</xacro:if>
<xacro:if value="${type == 'cylinder'}">
<cylinder length="1" radius="0.5"/>
</xacro:if>
<xacro:if value="${type == 'sphere'}">
<sphere radius="1"/>
</xacro:if>
</geometry>
</visual>
</link>
</xacro:macro>
<xacro:ak_axis_x />
<xacro:ak_link name="my_box" />
<xacro:ak_link name="my_cylinder" type="cylinder"/>
总结
标签 | 解释 | 属性 |
---|---|---|
<xacro:property> |
属性 | name 、value |
<xacro:if> |
如果 | value |
<xacro:unless> |
如果不 | value |
<xacro:macro> |
宏定义 | name 、params |
- 数学运算的时候可以使用Python中Math里面的函数
- if判断的时候可以使用Python中所有能得到bool值的判断,比如
in
转自:https://www.askeynil.com/2019/3f08735f.html