一个简单的用于sdf的XML宏脚本,比如为urdf设计的ros/xacro。
xacro4sdf的Python项目详细描述
哈克罗4SDF
一个简单的python脚本,用于定义和解析sdf (sdformat)的XML宏,比如为urdf设计的ros/xacro。在
Reference: ros/xacro
With Xacro, you can construct shorter and more readable XML files by using macros that expand to larger XML expressions.
xacro4sdf与xacro API(ros/xacro)不兼容
1。示例和用法
安装
#install by pip pip install xacro4sdf # or install from source code# git clone https://github.com/gezp/xacro4sdf.git# cd xacro4sdf && sudo python3 setup.py install
创建型号.sdf.xacro文件(测试/型号.sdf.xacro)在
^{pr2}$inertia_box
的宏在common.xacro
中预定义(请参阅2.5 pre-defined common.xacro
)
跑
xacro4sdf model.sdf.xacro
- 它会产生模型.sdf(结果应与试验结果一致/模型.sdf)在
- 更多示例可以在
test
文件夹中找到。在
2。特点
- 属性
- 宏
- 数学表达式
- 包括
2.1条。属性
属性是可以插入XML文档中任何位置的命名值
xacro定义
<!--definition of properties --><xacro_define_propertyname="radius"value="4.3"/><!--use of properties--><circlediameter="${2 * radius}"/>
生成的xml
<circlediameter="8.6"/>
2.2条。宏
xacro4sdf
的主要功能是宏。在
用宏标记<xacro_define_property>
定义宏,然后指定宏名称和参数列表。参数列表应该用空格隔开。在
宏的用法是定义<xacro_macro>
,它将根据参数name
替换为<xacro_define_property>
块。在
xacro定义
<!--definition of macro--><xacro_define_propertyname="mass"value="0.2"/><xacro_define_macromacro_name="box_inertia"params="m x y z"><mass>${m}</mass><inertia><ixx>${m*(y*y+z*z)/12}</ixx><ixy>0</ixy><ixz>0</ixz><iyy>${m*(x*x+z*z)/12}</iyy><iyz>0</iyz><izz>${m*(x*x+z*z)/12}</izz></inertia></xacro_macro_define><!--use of macro--><inertial><pose>0 0 0.02 0 0 0</pose><xacro_macroname="box_inertia"m="${mass}"x="0.3"y="0.1"z="0.2"/></inertial>
生成的xml
<inertial><pose>0 0 0.02 0 0 0</pose><mass>0.2</mass><inertia><ixx>0.0008333333333333335</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.002166666666666667</iyy><iyz>0</iyz><izz>0.002166666666666667</izz></inertia></inertial>
- 只支持简单参数(字符串和数字),但不支持块参数。在
- 支持在
xacro_define_macro
中使用其他xacro_macro
,这是递归定义。在
it's not recommended to define macro recursively (only support <=5 ).
2.3条。数学表达式
- 在dollared大括号
${xxxx}
中,您还可以编写简单的数学表达式。在 - 请参阅Properties和宏
- 它是通过在python中调用
eval()
来实现的,因此在某些情况下它是不安全的。在
2.4条。包括其他xacro文件
定义包含
您可以使用<xacro_include_definition>
标记包含其他xacro文件,根据参数uri
包含其他xacro文件。在
- 它将只包含带有标记
<xacro_define_property>
的属性和带有标记<xacro_define_macro>
的宏的定义。在
<xacro_include_definitionuri="model://simple_car/model.sdf.xacro"/><xacro_include_definitionuri="file://simple_car/model.sdf.xacro"/>
model
的uri表示在由环境变量IGN_GAZEBO_RESOURCE_PATH
和{}定义的文件夹列表中搜索文件 file
的uri表示直接打开文件。它试图打开相对路径为simple_car/model.sdf.xacro
的文件。您也可以尝试打开绝对路径为/simple_car/model.sdf.xacro
,uri为file:///simple_car/model.sdf.xacro
的文件。在
模型包含
您可以使用<xacro_include_model>
标记包含其他xacro文件。在
- 它只包含其他xacro文件中
<model>...<model/>
之间的内容。在
<xacro_include_modeluri="model://simple_car/model.sdf.xacro"/>
Tips:
<xacro_include_definition>
supports to include recursively.<xacro_include_model>
doesn't support to include recursively. and<xacro_include_definition>
should be used before using<xacro_include_model>
.- it's generally used to overwrite property with
<xacro_define_property>
.- Don't use same name for xacro definition (the param
name
of<xacro_define_property>
and<xacro_define_macro>
) , otherwise the priority of xacro definition need be considered.- Be carefully when using
<xacro_include_definition>
and<xacro_include_model>
2.5预定义普通.xacro
<!--macro defination:inertia--><xacro_define_macroname="inertia_cylinder"params="m r l"><xacro_define_macroname="inertia_box"params="m x y z"><xacro_define_macroname="inertia_sphere"params="m r"><!--macro defination:geometry--><xacro_define_macroname="geometry_cylinder"params="r l"><xacro_define_macroname="geometry_box"params="x y z"><xacro_define_macroname="geometry_sphere"params="r"><xacro_define_macroname="geometry_mesh"params="uri"><!--macro defination:visual_collision_with_mesh--><xacro_define_macroname="visual_collision_with_mesh"params="prefix uri">
- 可以直接在xacro文件中使用宏。在
3。xacro4sdf的额外说明
xacro4sdf摘要
- 属性与宏的定义:核心功能
<xacro_define_property>
和{}
- 包括
<xacro_include_definition>
:包含其他xacro文件的属性和宏的定义,对于模块化建模非常有用。在<xacro_include_model>
:include<model>...<model/>
内容(不支持递归包含),请小心使用此标记。在
- 属性和宏的使用:
${xxx}
:属性的使用,使用数学表达式非常有用。在<xacro_macro>
:使用宏,它对模块化建模非常有用。在
Tip: the xacro defination (
<xacro_define_property>
,<xacro_define_macro>
and<xacro_include_definition>
) must be child node of root node<sdf>
.
Steps of xacro4sdf
- 获取xacro定义(
<xacro_define_property>
,<xacro_define_macro>
,<xacro_include_definition>
),将宏定义存储到字典。- 获取通用xacro(最低优先级,可以重写)
- 递归地获取xacro(优先级取决于标记
<xacro_include_definition>
的顺序) - 获取当前xacro(最高优先权)
- 删除xacro定义xml(
<xacro_define_property>
,<xacro_define_macro>
,<xacro_include_definition>
)
- 放松西药(使用西药)
- 更换xacro include型号
- 替换
<model>...<model/>
(进程全局变量)之间的xacro属性(${...}
) - 将xacro宏(
<xacro_macro>
)替换为循环(包括递归深度<;=5)
Tip:
- the definitions of dictionary
- property dictionary (
<param,value>
) .- macro dictionary (
<macro_name,xml_string>
,<macro_name,params>
).- process
${xxx}
in<xacro_macro>
: useeval()
with global property dictionary and local property dictionary.
- the params of
<xacro_define_property>
make up global property dictionary- the params of
<xacro_macro>
make up local property dictionary.
4。维护者和许可证
维护人:葛振鹏,zhenpeng.ge@qq.com
xacro4sdf
由麻省理工学院提供。在
- 项目
标签: