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
