一个简单的用于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> : use eval() 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由麻省理工学院提供。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android首选项相同getPreference()值的不同数据   字符串如何在Java中连接两个列表中的单词   安卓 Java Socket编程:检测客户端和服务器是否连接   使用JTextField的java无法将值转换为int   在java中,如何在不通过超级构造函数设置的情况下将消息设置为自定义异常类   用于标识属性值的java正则表达式模式   Android中的java不可见谷歌地图   java正确取消启动ExecutorService的JavaFX任务   在非活动java类中使用安卓的融合位置提供程序,并在主活动类中获取经度和纬度   spring为什么我的大摇大摆不能用springboot在java中工作?   java JSF(2.2)ViewScope在Weblogic 12.2.1.2和JDK 8上使用Spring 4.3.7(在Mac OS和Docker Oracle Linux环境上)   java如何用一个按钮提高计时器速度   java如何检查字符是否是元音?   注册表引用了不存在的Java运行时环境安装或运行时已损坏错误   来自ResultSet java的mysql getDateTime   maven LanguageTool Java API是否具有“无用”依赖关系?   twitter api身份验证的java Trycatch问题   java在Apache Struts 1.1中是否可以显式白名单?   安卓致命异常:主java。lang.RuntimeException:被问及未知片段