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
3537

被折叠的 条评论
为什么被折叠?



