xmacro
xmacro is a simple tool to define and parse XML macro. it's inspired by ros/xacro which is an XML macro language desiged for urdf. xmacro looks like a simplified version of ros/xacro, it's simpler, but it works well both for urdf and sdf. in addition it's flexible, and also easy to use.
xmacrois independent of ROS, you could install it bypip.- XML namespace isn't used in
xmacro, there are some reserved tags:xmacro_include,xmacro_define_value,xmacro_define_block,xmacro_block. - it provides python api so that we could parse xml file in ROS2 launch file.
xmacro4sdf:xmacrowith some specific functions forsdf(pre-defined common macro,xmacro_includepath parser formodel://).xmacro4urdf:xmacrowith some specific functions forurdf(pre-defined common macro,xmacro_includepath parser forpackage://).
Usage
Installation
# install by pip
pip install xmacro
# install from source code
git clone https://github.com/gezp/xmacro.git
cd xmacro && sudo python3 setup.py install
examples
# some examples in folder test/xmacro
xmacro test_xmacro_block.xml.xmacro > test_xmacro_block.xml
XMLMacro Features
- Value macro
- Block macro
- Math expressions
- Include
- Python API
Value macro
Value macro are named values that can be inserted anywhere into the XML document except <xmacro_define_block> block.
xmacro definition
<!--definition of properties -->
<xmacro_define_value name="radius" value="4.3" />
<!--use of properties-->
<circle diameter="${2 * radius}" />
generated xml
<circle diameter="8.6" />
Block macro
Define block macros with the macro tag <xmacro_define_block>, then specify the macro name and a list of parameters. The list of parameters should be whitespace separated.
The usage of block macros is to define <xmacro_block> which will be replaced with corresponding <xmacro_define_block> block.
xmacro definition
<!--definition of macro-->
<xmacro_define_value name="mass" value="0.2" />
<xmacro_define_block 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>
</xmacro_define_block>
<!--use of macro-->
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<xmacro_block name="box_inertia" m="${mass}" x="0.3" y="0.1" z="0.2"/>
</inertial>
generated 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>
- only support simple parameters (string and number), and block parameters isn't supported.
- it's supported to use other
xmacro_blockinxmacro_define_blockwhich is recursive definition (the max nesting level is 5).
condition block
a example here (you could find more examples in test/xmacro/test_xmacro_condition.xml.xmacro)
<!--use of macro-->
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<xmacro_block name="box_inertia" m="${mass}" x="0.3" y="0.1" z="0.2" condition="${mass==0.2}"/>
</inertial>
- the
conditioncan beTrue,False,1,0, we can also use math expression to define condition, but operator<and>isn't supported in math expression. - if
conditionisFalseor0, thexmacro_blockwou't be loaded. conditionis reserved attribute of<xmacro_block>, soconditioncan't be used asparamsof<xmacro_define_block>.
Math expressions
- within dollared-braces
${xxxx}, you can also write simple math expressions. - refer to examples of Value macro and Block macro
- it's implemented by calling
eval()in python, so it's unsafe for some cases.
Including other xmacro files
You can include other xmacro files by using the <xmacro_include> tag.
- it will include the xmcaro definition with tag
<xmacro_define_value>and macros with tag<xmacro_define_block>.
<xmacro_include uri="file://simple_car/model.sdf.xmacro"/>
- The uri for
filemeans to open the file directly.- it try to open the file with relative path
simple_car/model.sdf.xmacro. - you can also try to open file with absolute path
/simple_car/model.sdf.xmacrowith urifile:///simple_car/model.sdf.xmacro.
- it try to open the file with relative path
<xmacro_include>supports to include recursively.
Python API
you can use xmacro in python easily
from xmacro.xmacro import XMLMacro
xmacro=XMLMacro()
#case1 parse from file
xmacro.set_xml_file(inputfile)
xmacro.generate()
xmacro.to_file(outputfile)
#case2 parse from xml string
xmacro.set_xml_string(xml_str)
xmacro.generate()
xmacro.to_file(outputfile)
#case3 generate to string
xmacro.set_xml_file(inputfile)
xmacro.generate()
xmacro.to_string()
#case4 custom macro value
xmacro.set_xml_file(inputfile)
# use custom dictionary to overwrite global macro value defined by <xmacro_define_value>
kv={"rplidar_a2_h":0.8}
xmacro.generate(kv)
xmacro.to_file(outputfile)
XMLMacro4sdf Features
pre-defined common.sdf.xmacro
<!--macro defination:inertia-->
<xmacro_define_block name="inertia_cylinder" params="m r l">
<xmacro_define_block name="inertia_box" params="m x y z">
<xmacro_define_block name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xmacro_define_block name="geometry_cylinder" params="r l">
<xmacro_define_block name="geometry_box" params="x y z">
<xmacro_define_block name="geometry_sphere" params="r">
<xmacro_define_block name="geometry_mesh" params="uri">
<!--macro defination:visual_collision_with_mesh-->
<xmacro_define_block name="visual_collision_with_mesh" params="prefix uri">
examples
# some examples in folder test/sdf
xmacro4sdf model.sdf.xmacro > model.sdf
XMLMacro4urdf Features
pre-defined common.urdf.xmacro
<!--macro defination:inertia-->
<xmacro_define_block name="inertia_cylinder" params="m r l">
<xmacro_define_block name="inertia_box" params="m x y z">
<xmacro_define_block name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xmacro_define_block name="geometry_cylinder" params="r l">
<xmacro_define_block name="geometry_box" params="x y z">
<xmacro_define_block name="geometry_sphere" params="r">
<xmacro_define_block name="geometry_mesh" params="uri">
examples
# some examples in folder test/urdf
xmacro4urdf robot.urdf.xmacro > robot.urdf
Maintainer and License
maintainer : Zhenpeng Ge, zhenpeng.ge@qq.com
xmacro is provided under MIT License.
Release files for xmacro 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xmacro-1.2.1.tar.gz | 10.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xmacro-1.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.6 kB
Release files / xmacro-1.2.1.tar.gz
| Download URL | xmacro-1.2.1.tar.gz |
|---|---|
| Size | 10.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
774cbcb393533ca1fbe71a27393e18d6f5d7c8af8071a18e43e00029149f8d62
|
|
BLAKE2b-256 checksum How to use checksums |
daee46125757ecbdc94c39e179dfdcf6d7f4f2df4a78b97805569869770d4d93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
|
Release files / xmacro-1.2.1-py3-none-any.whl
| Download URL | xmacro-1.2.1-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e79811915e3d8db1932615f239b5dab73972496454ad9315fb46fb696d956cc
|
|
BLAKE2b-256 checksum How to use checksums |
5efc2af0caaa9b72b5185951b3655da23293518c6497849a012dfe8ec3a8354d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
|