Adding shapes to a model with collisions and visuals in SDFormat
This documentation explains how to add geometric shapes to a model that describe the
physical and visual characteristics of each link in a model.
These characteristics are specified
using <visual> and <collision> tags in SDFormat.
Each <visual> and <collision> must contain one <geometry> tag, which
specifies the shape of the object.
A <visual> element may contain a <material> tag that can specify the
visual appearance of the shape, such as color and texture,
while a <collision> element may contain a <surface> tag that can specify
physical properties of the surface related to friction and contact.
A link can have zero or more <visual> or <collision> elements
placed in the parent link frame using a <pose> element.
This allows a link to define complex geometries by composition of
individual shapes with distinct visual and physical properties.
The full specifications can be found
here for <visual>
and here for <collision>.
The <geometry> tag
The following shapes are supported by the <geometry> tag in SDFormat:
- <box>
- <cylinder>(aligned with Z-axis)
- <sphere>
- <plane>
- <mesh>
- <heightmap>
- <image>
The full specification for <geometry> can be found
here.
For box, cylinder, and sphere shapes, the geometric center is used as
the attachment point to its parent.
Examples of each shape type are given below for which
the extents are -0.5 -0.5 -0.5 and 0.5 0.5 0.5 in the local frame,
ie. that have the unit cube as a bounding box.
<geometry>
  <sphere>
    <radius>0.5</radius>
  </sphere>
</geometry>
<geometry>
  <cylinder>
    <length>1</length>
    <radius>0.5</radius>
  </cylinder>
</geometry>
<geometry>
  <box>
    <size>1 1 1</size>
  </box>
</geometry>
A link with matching sphere shapes in a collision and visual can be expressed as:
<link name="link">
  <collision name="collision">
    <geometry>
      <sphere>
        <radius>0.5</radius>
      </sphere>
    </geometry>
  </collision>
  <visual name="visual">
    <geometry>
      <sphere>
        <radius>0.5</radius>
      </sphere>
    </geometry>
  </visual>
</link>
The geometry for collisions and visuals in a link is not required to match.
This can be used, for example, to reduce computation time of collision detection
algorithms by setting simpler shapes in the <collision> element.
Placing visuals and collisions using the <pose> tag
Similar to models, links, and joints, visuals and collisions have their own
coordinate frames that can be offset using the <pose> tag. By default, the
parent frame for this pose element is the parent link. However, a different
frame of reference can be set using the frame attribute of the <pose> tag.
For more information about the <pose> tag, see the Specifying pose in
SDFormat and Pose frame semantics
 documentation.
Composition of Shapes
Multiple visual elements can be used in a single link. In the following example, a cylinder and a sphere are combined to create a more complex shape.
<link name="link1">
  <pose>0 0 0.5 0 0 0</pose>
  <visual name="vis1">
    <pose>0 0 0 0 0 0</pose>
    <geometry>
      <cylinder>
        <radius>1</radius>
        <length>1</length>
      </cylinder>
    </geometry>
  </visual>
  <visual name="vis2">
    <pose>0 0 0.5 0 0 0</pose>
    <geometry>
      <sphere>
        <radius>1</radius>
      </sphere>
    </geometry>
  </visual>
</link>
The resulting shape is shown in the following image

Note that when multiple <visual> tags are present inside a link, the name
attribute must be unique. The same holds for the name attribute of
<collision> tags.
The <material> tag
A <visual> tag may also contain a <material> tag which is used to set the
color and texture properties of a visual.
The full specification for <material> can be found
here.
Documentation on specifying the color of a visual can be found here.
