xacro 语法总结

本文总字数:2574,阅读预计需要:6分钟

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

posted @   北极星!  阅读(1239)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示