Visuals
Visuals¶
The <visual> element specifies the shape of the geometry for rendering. It is a child element from <link> and a link can have multiple visual elements.
# Import the element creator from pcg_gazebo.parsers.sdf import create_sdf_element
# The visual element is created with an empty geometry by default visual = create_sdf_element('visual') print(visual)
<visual name="visual">
<geometry>
<empty></empty>
</geometry>
</visual>
# To see the optional elements, use the method reset() visual.reset(with_optional_elements=True) print(visual)
<visual name="visual">
<pose frame="">0 0 0 0 0 0</pose>
<geometry>
<empty></empty>
</geometry>
<transparency>0</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
# Setting the parameters for the visual element # Each visual in a link should have an unique name visual.name = 'custom_visual' # If cast_shadows is true, the geometry will cast shadows visual.cast_shadows = True # The transparency is a double in the range of [0, 1], 0 being opaque and 1 fully transparent visual.transparency = 0.2 # Pose of the visual geometry with respect to a frame visual.pose = [0, 0.2, 0, 0, 0, 0] visual.pose.frame = 'base_link' print(visual)
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<empty></empty>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
# Setting different geometries to the visual element visual.geometry.box = create_sdf_element('box') print(visual) visual.geometry.sphere = create_sdf_element('sphere') print(visual) visual.geometry.cylinder = create_sdf_element('cylinder') print(visual) visual.geometry.plane = create_sdf_element('plane') print(visual) visual.geometry.mesh = create_sdf_element('mesh') visual.geometry.mesh.reset(with_optional_elements=True) print(visual) visual.geometry.image = create_sdf_element('image') print(visual) visual.geometry.polyline = create_sdf_element('polyline') print(visual)
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<box>
<size>0 0 0</size>
</box>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<sphere>
<radius>0</radius>
</sphere>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<cylinder>
<radius>0</radius>
<length>0</length>
</cylinder>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<plane>
<size>0 0</size>
<normal>0 0 1</normal>
</plane>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<mesh>
<uri></uri>
<submesh>
<name>none</name>
<center>0</center>
</submesh>
<scale>1 1 1</scale>
</mesh>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<image>
<uri></uri>
<height>1</height>
<granularity>1</granularity>
<threshold>0</threshold>
<scale>1</scale>
</image>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
<visual name="custom_visual">
<pose frame="base_link">0 0.2 0 0 0 0</pose>
<geometry>
<polyline>
<height>1</height>
</polyline>
</geometry>
<transparency>0.2</transparency>
<cast_shadows>1</cast_shadows>
<material>
<specular>0.1 0.1 0.1 1</specular>
<diffuse>0 0 0 1</diffuse>
<shader type="pixel">
<normal_map>default</normal_map>
</shader>
<emissive>0 0 0 1</emissive>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>default</name>
</script>
<lighting>0</lighting>
<ambient>0 0 0 1</ambient>
</material>
</visual>
# Optional elements can also be created dynamically visual = create_sdf_element('visual') print(visual)
<visual name="visual">
<geometry>
<empty></empty>
</geometry>
</visual>
visual.cast_shadows = True print(visual)
<visual name="visual">
<geometry>
<empty></empty>
</geometry>
<cast_shadows>1</cast_shadows>
</visual>
visual.pose = [0, 0.2, 0, 0, 0, 0] print(visual)
<visual name="visual">
<pose frame="">0 0.2 0 0 0 0</pose>
<geometry>
<empty></empty>
</geometry>
<cast_shadows>1</cast_shadows>
</visual>
# The geometry entity can be set with a dictionary with all the child parameters visual.geometry.box = dict(size=[2, 3, 4]) print(visual)
<visual name="visual">
<pose frame="">0 0.2 0 0 0 0</pose>
<geometry>
<box>
<size>2 3 4</size>
</box>
</geometry>
<cast_shadows>1</cast_shadows>
</visual>
# The pose, as other variables, can be set using a dictionary # For SDF elements with no child elements, only values, the dictionary must always have a key 'value' # d = {value=[0, 0, 0, 0, 0, 0]} # If the element contains attributes, as the attribute 'frame' in the element 'pose', there should be a key # 'attributes' with a dictionary containing all the attributes # d = {value=[0, 0, 0, 0, 0, 0], attributes=dict(frame='new_frame')} visual.pose = {'value': [0, 0.2, 0, 0, 0, 0], 'attributes': {'frame': 'new_frame'}} print(visual)
<visual name="visual">
<pose frame="new_frame">0 0.2 0 0 0 0</pose>
<geometry>
<box>
<size>2 3 4</size>
</box>
</geometry>
<cast_shadows>1</cast_shadows>
</visual>