Geometries
Geometries¶
Geometry entities are child elements of <visual>
or <collision>
elements.
# Import the element creator from pcg_gazebo.parsers.sdf import create_sdf_element
Basic entities¶
Demonstration of the basic SDF elements that can be generated with and without the optional parameters.
Geometries¶
Box¶
# Default box box = create_sdf_element('box') print('Default box') print(box) print('Default box - as dict') print(box.to_dict()) print('Default box - as SDF') print(box.to_xml_as_str()) # Changing the size box.size = [2, 3, 4] print('Custom box') print(box) # Exporting # box.export_xml('/tmp/box.sdf')
Default box <box> <size>0 0 0</size> </box> Default box - as dict {'box': {'size': {'value': [0, 0, 0]}}} Default box - as SDF <box><size>0 0 0</size></box> Custom box <box> <size>2 3 4</size> </box>
Cylinder¶
# Default cylinder cylinder = create_sdf_element('cylinder') print('Default cylinder') print(cylinder) print('Default cylinder - as dict') print(cylinder.to_dict()) print('Default cylinder - as SDF') print(cylinder.to_xml_as_str()) # Changing the parameters cylinder.radius = 2 cylinder.length = 3 print('Custom cylinder') print(cylinder) # Exporting # cylinder.export_xml('/tmp/cylinder.sdf')
Default cylinder <cylinder> <length>0</length> <radius>0</radius> </cylinder> Default cylinder - as dict {'cylinder': {'length': {'value': 0}, 'radius': {'value': 0}}} Default cylinder - as SDF <cylinder><length>0</length><radius>0</radius></cylinder> Custom cylinder <cylinder> <length>3.0</length> <radius>2.0</radius> </cylinder>
Sphere¶
# Default sphere sphere = create_sdf_element('sphere') print('Default sphere') print(sphere) print('Default sphere - as dict') print(sphere.to_dict()) print('Default sphere - as SDF') print(sphere.to_xml_as_str()) # Changing the parameters sphere.radius = 2 print('Custom sphere') print(sphere) # Exporting # sphere.export_xml('/tmp/sphere.sdf')
Default sphere <sphere> <radius>0</radius> </sphere> Default sphere - as dict {'sphere': {'radius': {'value': 0}}} Default sphere - as SDF <sphere><radius>0</radius></sphere> Custom sphere <sphere> <radius>2.0</radius> </sphere>
Plane¶
# Default plane plane = create_sdf_element('plane') print('Default plane') print(plane) print('Default plane - as dict') print(plane.to_dict()) print('Default plane - as SDF') print(plane.to_xml_as_str()) # Changing the parameters # Length of each side of the plane plane.size = [10, 10] # Normal direction of the plane plane.normal = [1, 0, 0] print('Custom plane') print(plane) # Exporting # plane.export_xml('/tmp/plane.sdf')
Default plane <plane> <size>0 0</size> <normal>0 0 1</normal> </plane> Default plane - as dict {'plane': {'size': {'value': [0, 0]}, 'normal': {'value': [0, 0, 1]}}} Default plane - as SDF <plane><size>0 0</size><normal>0 0 1</normal></plane> Custom plane <plane> <size>10 10</size> <normal>1 0 0</normal> </plane>
Image¶
A grayscale image can be used to extrude a set of boxes
# Default image image = create_sdf_element('image') print('Default image') print(image) print('Default image - as dict') print(image.to_dict()) print('Default image - as SDF') print(image.to_xml_as_str()) # Height of the extruded boxes image.height = 10 # The amount of error in the model image.granularity = 1 # Grayscale threshold image.threshold = 100 # Scaling factor applied to the image image.scale = [2] # URI of the grayscale image image.uri = 'filename' print('Custom image') print(image) # Exporting # image.export_xml('/tmp/image.sdf')
Default image <image> <granularity>1</granularity> <height>1</height> <scale>1</scale> <uri></uri> <threshold>0</threshold> </image> Default image - as dict {'image': {'granularity': {'value': 1}, 'height': {'value': 1}, 'scale': {'value': [1]}, 'uri': {'value': ''}, 'threshold': {'value': 0}}} Default image - as SDF <image><granularity>1</granularity><height>1</height><scale>1</scale><uri></uri><threshold>0</threshold></image> Custom image <image> <granularity>1</granularity> <height>10.0</height> <scale>2</scale> <uri>filename</uri> <threshold>100.0</threshold> </image>
Mesh¶
mesh = create_sdf_element('mesh') print('Default mesh - with default parameters') print(mesh) print('Default mesh - as dict') print(mesh.to_dict()) print('Default mesh - as SDF') print(mesh.to_xml_as_str())
Default mesh - with default parameters <mesh> <scale>1 1 1</scale> <uri></uri> </mesh> Default mesh - as dict {'mesh': {'scale': {'value': [1, 1, 1]}, 'uri': {'value': ''}}} Default mesh - as SDF <mesh><scale>1 1 1</scale><uri></uri></mesh>
print('Mesh with optional parameters') mesh.reset(with_optional_elements=True) print(mesh) # Name of the submesh under the parent mesh mesh.submesh.name = 'submesh.stl' # Set to true to center the vertices of the submesh at (0, 0, 0) mesh.submesh.center = True # Scaling factor of the mesh mesh.scale = [2, 1, 1] # URI of the mesh mesh.uri = 'file://mesh.stl' print('Custom mesh') print(mesh)
Mesh with optional parameters <mesh> <scale>1 1 1</scale> <uri></uri> <submesh> <center>0</center> <name>none</name> </submesh> </mesh> Custom mesh <mesh> <scale>2 1 1</scale> <uri>file://mesh.stl</uri> <submesh> <center>1</center> <name>submesh.stl</name> </submesh> </mesh>
Polyline¶
polyline = create_sdf_element('polyline') print('Default polyline - with default parameters') print(polyline) print('Default polyline - as dict') print(polyline.to_dict()) print('Default polyline - as SDF') print(polyline.to_xml_as_str())
Default polyline - with default parameters <polyline> <height>1</height> </polyline> Default polyline - as dict {'polyline': {'height': {'value': 1}}} Default polyline - as SDF <polyline><height>1</height></polyline>
print('Polyline with optional parameters') polyline.reset(with_optional_elements=True) print(polyline) # Set new height polyline.height = 2.3 # Customize point polyline.points[0].value = [2.3, 4.5] # Add new point polyline.add_point() # Set the coordinates of new point polyline.points[1].value = [3.7, 10.1] print('Custom polyline') print(polyline)
Polyline with optional parameters <polyline> <point>0 0</point> <height>1</height> </polyline> Custom polyline <polyline> <point>2.3 4.5</point> <point>3.7 10.1</point> <height>2.3</height> </polyline>
Creating a geometry entity¶
# Initially, the geometry is created with a <empty/> element geometry = create_sdf_element('geometry') print(geometry)
<geometry> <empty></empty> </geometry>
# Creating a geometry for each of the basic forms # The geometry entity has a separate mode for each possible geometry forms, since it cannot hold # multiple geometries # When a new geometry is set, the former one is deleted print('All the geometry entity modes:') print(geometry.get_modes()) geometry.box = box print(geometry) geometry.cylinder = cylinder print(geometry) geometry.sphere = sphere print(geometry) geometry.plane = plane print(geometry) geometry.image = image print(geometry) geometry.mesh = mesh print(geometry) geometry.polyline = polyline print(geometry)
All the geometry entity modes: ['empty', 'box', 'image', 'cylinder', 'sphere', 'plane', 'mesh', 'polyline'] <geometry> <box> <size>2 3 4</size> </box> </geometry> <geometry> <cylinder> <length>3.0</length> <radius>2.0</radius> </cylinder> </geometry> <geometry> <sphere> <radius>2.0</radius> </sphere> </geometry> <geometry> <plane> <size>10 10</size> <normal>1 0 0</normal> </plane> </geometry> <geometry> <image> <granularity>1</granularity> <height>10.0</height> <scale>2</scale> <uri>filename</uri> <threshold>100.0</threshold> </image> </geometry> <geometry> <mesh> <scale>2 1 1</scale> <uri>file://mesh.stl</uri> <submesh> <center>1</center> <name>submesh.stl</name> </submesh> </mesh> </geometry> <geometry> <polyline> <height>2.3</height> <point>2.3 4.5</point> <point>3.7 10.1</point> </polyline> </geometry>