xacro精讲

xacro

  • 中间不可以有中文注释

  • Xacro(XML宏)Xacro是一种XML宏语言。使用xacro,您可以使用扩展到更大的XML表达式的宏来构造更短、更可读的XML文件。

  • 在URDF文件的顶部,必须指定一个名称空间,以便文件正确解析。例如,以下是有效xacro文件的前两行:

<?xml version="1.0"?>
 <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="firefighter">

new feature 这个比较常用

<xacro:macro name="pr2_arm" params="suffix parent reflect">
  <pr2_upperarm suffix="${suffix}" reflect="${reflect}" parent="${parent}" />
  <pr2_forearm suffix="${suffix}" reflect="${reflect}" parent="elbow_flex_${suffix}" />
</xacro:macro>
<!--调用宏进行生成如果没有params就是<mrobot />-->
<xacro:pr2_arm suffix="left" reflect="1" parent="torso" />
<xacro:pr2_arm suffix="right" reflect="-1" parent="torso" />

解析出来就是

<pr2_upperarm suffix="left" reflect="1" parent="torso" />
<pr2_forearm suffix="left" reflect="1" parent="elbow_flex_left" />
<pr2_upperarm suffix="right" reflect="-1" parent="torso" />
<pr2_forearm suffix="right" reflect="-1" parent="elbow_flex_right" />

property and property blocks

property是可以在XML文档中任何位置插入的命名值。property block是XML的代码片段,可以将其插入XML允许的任何位置

  • use property
<xacro:property name="the_radius" value="2.1" />
<xacro:property name="the_length" value="4.5" />

<geometry type="cylinder" radius="${the_radius}" length="${the_length}" />

通过 ( p s : 也 可 以 使 用 {}(ps:也可以使用 (ps:使())将属性的几何值插入到表达式中,如果要使用文字KaTeX parse error: Expected '}', got 'EOF' at end of input: { 要转义${

  • use property block
<xacro:property name="front_left_origin">
  <origin xyz="0.3 0 0" rpy="0 0 0" />
</xacro:property>

<pr2_wheel name="front_left_wheel">
  <xacro:insert_block name="front_left_origin" />
</pr2_wheel>

math expressions

使用${}你可以编写一些简单的表达式,特别是sin 和cos

<xacro:property name="radius" value="4.3" />
<circle diameter="${2 * radius}" />

conditional blocks

类似于roslaunch的条件快。对于如何配置机器人和加载不同的Gazebo插件很有用

<xacro:if value="<expression>">
  <... some xml code here ...>
</xacro:if>
<xacro:unless value="<expression>">
  <... some xml code here ...>
</xacro:unless>

表达式计算为0,1,true ,false否则会引发错误

实际上任何计算出来是bool值的python 表达式都是可行的

macros

xacro的主要功能是支持宏。使用宏标记定义宏,并指定宏名称和参数列表。参数列表应以空格分隔。它们成为宏本地属性。

<xacro:macro name="pr2_caster" params="suffix *origin **content **anothercontent">
  <joint name="caster_${suffix}_joint">
    <axis xyz="0 0 1" />
  </joint>
  <link name="caster_${suffix}">
    <xacro:insert_block name="origin" />
    <xacro:insert_block name="content" />
    <xacro:insert_block name="anothercontent" />
  </link>
</xacro:macro>

<xacro:pr2_caster suffix="front_left">
  <pose xyz="0 1 0" rpy="0 0 0" />
  <container>
    <color name="yellow"/>
    <mass>0.1</mass>
  </container>
  <another>
    <inertial>
      <origin xyz="0 0 0.5" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
    </inertial>
  </another>
</xacro:pr2_caster>

这里面有两个参数“suffix origin” origin前面加了一个星标表明origin是一个块参数而不是一个简单的文本参数。

而双星的参数允许插入任意数量的元素,这些元素将在随后可用的元素中使用(container another)

<joint name="caster_front_left_joint">
  <axis xyz="0 0 1" />
</joint>
<link name="caster_front_left">
  <pose xyz="0 1 0" rpy="0 0 0" />
  <color name="yellow" />
  <mass>0.1</mass>
  <inertial>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
    <mass value="1"/>
    <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
  </inertial>
</link>

宏可以包含其他宏。首先展开外部宏,然后展开内部宏。

including other xacro files

使用inclde tag

<xacro:include filename="$(find package)/other_file.xacro" />
<xacro:include filename="other_file.xacro" />
<xacro:include filename="$(cwd)/other_file.xacro" />

为了避免宏定义冲突还可以使用namespace

<xacro:include filename="other_file.xacro" ns="namespace"/>

对于命名空间内宏和属性的访问方法

${namespace.property}

其他功能

  • 支持 yaml文件
  • 在CMakeList.txt中进行编译
  • 等等

详细的可以查询

http://wiki.ros.org/xacro#Local_properties

参考

https://blog.youkuaiyun.com/qq_32761549/article/details/102624564

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值