xacro 語法總結


xacro是為了解決在編寫urdf文件過程中,出現的標簽內容重復,但又不得不去寫。一些值的計算有依賴的問題。為了和urdf文件區分,我們定義的模型文件名后綴為.xacro

從功能的角度來說,xacro提供了屬性定義,數學運算,條件判斷和宏定義等功能。

注意:必須在robot標簽中加入xmlns:xacro="http://www.ros.org/wiki/xacro"屬性!!

該文件中注釋不能用中文!!!

http://wiki.ros.org/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數學模塊中的函數和常量

包括,但不限於以下:

  1. pi:π
  2. sin:正弦函數
  3. cos:余弦函數
  4. tan:正切函數
  5. 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> 屬性 namevalue
<xacro:if> 如果 value
<xacro:unless> 如果不 value
<xacro:macro> 宏定義 nameparams
  1. 數學運算的時候可以使用Python中Math里面的函數
  2. if判斷的時候可以使用Python中所有能得到bool值的判斷,比如in

轉自:https://www.askeynil.com/2019/3f08735f.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM