Skip to content

Links, joints and sensors

A physical link in the simulation contains inertia, collision and visual properties. A link must be a child of a model and a model can have multiple links.

# Import the element creator
from pcg_gazebo.parsers.sdf import create_sdf_element
# The link is empty by default
link = create_sdf_element('link')
print(link)
<link name="link"/>
# Let's create the elements dynamically at first
link = create_sdf_element('link')

# The link's name must be unique in a model
link.name = 'base_link'
print(link)
<link name="base_link"/>
# Mass of the link in kg
link.mass = 30
# The center of mass are the cartesian coordinates in link.inertial.pose
link.center_of_mass = [0, 10, 0]
# The moments of inertia describe the elements of the 3x3 rotational inertial matrix
link.inertia.ixx = 0.5
link.inertia.iyy = 0.5
link.inertia.izz = 0.5
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
</link>
# If gravity is set as true, the link will be affected by gravity
link.gravity = True
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <gravity>1</gravity>
</link>
# If kinematic is set to true, the link is kinematic only
link.kinematic = False
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <gravity>1</gravity>
</link>
# The pose of the link with respect to a frame
link.pose = [0, 0, 1, 0, 0, 0]
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
</link>
# As mentioned in previous notebooks, a link can have multiple visual and collision elements
# To create an empty collision geometry, use the function add_collision as follows
link.add_collision(name='collision_1')
print(link.collisions[0])
<collision name="collision_1">
  <geometry>
    <empty></empty>
  </geometry>
</collision>
# Set the geometry of the collision
link.collisions[0].box = create_sdf_element('box')
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
</link>
# You can also add a collision geometry by creating a collision entity and 
# adding it to the link as follows
collision = create_sdf_element('collision')
collision.reset(with_optional_elements=True)
collision.geometry.cylinder = create_sdf_element('cylinder')

link.add_collision('collision_2', collision)
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
# You can't add collision or visual elements with duplicated names
# You can also add a collision geometry by creating a collision entity and 
# adding it to the link as follows
collision = create_sdf_element('collision')
collision.reset(with_optional_elements=True)
collision.geometry.box = create_sdf_element('box')

link.add_collision('collision_2', collision)
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_2_0">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
link.add_collision('collision_3', collision)
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_2_0">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_3">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
# You can retrieve the collision geometry by its name
# If the name given is not found, the function will return None
print(link.get_collision_by_name('collision_1'))
print(link.get_collision_by_name('collision_10'))
# Or iterate in the collisions list
for elem in link.collisions:
    print(elem)
<collision name="collision_1">
  <geometry>
    <empty></empty>
  </geometry>
</collision>

None
<collision name="collision_1">
  <geometry>
    <empty></empty>
  </geometry>
</collision>

<collision name="collision_2">
  <geometry>
    <cylinder>
      <radius>0</radius>
      <length>0</length>
    </cylinder>
  </geometry>
  <max_contacts>10</max_contacts>
  <contact>
    <bullet>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <soft_erp>0.2</soft_erp>
      <split_impulse>1</split_impulse>
      <kd>1</kd>
      <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
    </bullet>
    <ode>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <min_depth>0</min_depth>
      <max_vel>0.01</max_vel>
      <kd>1</kd>
      <soft_erp>0.2</soft_erp>
    </ode>
  </contact>
  <laser_retro>0</laser_retro>
  <pose frame="">0 0 0 0 0 0</pose>
  <surface>
    <bounce>
      <restitution_coefficient>0</restitution_coefficient>
      <threshold>100000</threshold>
    </bounce>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <friction>
      <torsional>
        <patch_radius>0</patch_radius>
        <surface_radius>0</surface_radius>
        <ode>
          <slip>0</slip>
        </ode>
        <coefficient>1</coefficient>
        <use_patch_radius>1</use_patch_radius>
      </torsional>
      <bullet>
        <fdir1>0 0 0</fdir1>
        <friction>1</friction>
        <rolling_friction>1</rolling_friction>
        <friction2>1</friction2>
      </bullet>
      <ode>
        <mu2>1</mu2>
        <mu>1</mu>
        <fdir1>0 0 0</fdir1>
        <slip1>0</slip1>
        <slip2>0</slip2>
      </ode>
    </friction>
  </surface>
</collision>

<collision name="collision_2_0">
  <geometry>
    <box>
      <size>0 0 0</size>
    </box>
  </geometry>
  <max_contacts>10</max_contacts>
  <contact>
    <bullet>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <soft_erp>0.2</soft_erp>
      <split_impulse>1</split_impulse>
      <kd>1</kd>
      <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
    </bullet>
    <ode>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <min_depth>0</min_depth>
      <max_vel>0.01</max_vel>
      <kd>1</kd>
      <soft_erp>0.2</soft_erp>
    </ode>
  </contact>
  <laser_retro>0</laser_retro>
  <pose frame="">0 0 0 0 0 0</pose>
  <surface>
    <bounce>
      <restitution_coefficient>0</restitution_coefficient>
      <threshold>100000</threshold>
    </bounce>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <friction>
      <torsional>
        <patch_radius>0</patch_radius>
        <surface_radius>0</surface_radius>
        <ode>
          <slip>0</slip>
        </ode>
        <coefficient>1</coefficient>
        <use_patch_radius>1</use_patch_radius>
      </torsional>
      <bullet>
        <fdir1>0 0 0</fdir1>
        <friction>1</friction>
        <rolling_friction>1</rolling_friction>
        <friction2>1</friction2>
      </bullet>
      <ode>
        <mu2>1</mu2>
        <mu>1</mu>
        <fdir1>0 0 0</fdir1>
        <slip1>0</slip1>
        <slip2>0</slip2>
      </ode>
    </friction>
  </surface>
</collision>

<collision name="collision_3">
  <geometry>
    <box>
      <size>0 0 0</size>
    </box>
  </geometry>
  <max_contacts>10</max_contacts>
  <contact>
    <bullet>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <soft_erp>0.2</soft_erp>
      <split_impulse>1</split_impulse>
      <kd>1</kd>
      <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
    </bullet>
    <ode>
      <soft_cfm>0</soft_cfm>
      <kp>1000000000000.0</kp>
      <min_depth>0</min_depth>
      <max_vel>0.01</max_vel>
      <kd>1</kd>
      <soft_erp>0.2</soft_erp>
    </ode>
  </contact>
  <laser_retro>0</laser_retro>
  <pose frame="">0 0 0 0 0 0</pose>
  <surface>
    <bounce>
      <restitution_coefficient>0</restitution_coefficient>
      <threshold>100000</threshold>
    </bounce>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <friction>
      <torsional>
        <patch_radius>0</patch_radius>
        <surface_radius>0</surface_radius>
        <ode>
          <slip>0</slip>
        </ode>
        <coefficient>1</coefficient>
        <use_patch_radius>1</use_patch_radius>
      </torsional>
      <bullet>
        <fdir1>0 0 0</fdir1>
        <friction>1</friction>
        <rolling_friction>1</rolling_friction>
        <friction2>1</friction2>
      </bullet>
      <ode>
        <mu2>1</mu2>
        <mu>1</mu>
        <fdir1>0 0 0</fdir1>
        <slip1>0</slip1>
        <slip2>0</slip2>
      </ode>
    </friction>
  </surface>
</collision>
# The same is true for visual elements, create an empty visual element by using add_visual
link.add_visual('visual_1')
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <visual name="visual_1">
    <geometry>
      <empty></empty>
    </geometry>
  </visual>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_2_0">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_3">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
# Set the geometry of the visual element
link.visuals[0].geometry.plane = create_sdf_element('plane')
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <visual name="visual_1">
    <geometry>
      <plane>
        <size>0 0</size>
        <normal>0 0 1</normal>
      </plane>
    </geometry>
  </visual>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_2_0">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_3">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
# You can also add a collision geometry by creating a collision entity and 
# adding it to the link as follows
visual = create_sdf_element('visual')
visual.reset(with_optional_elements=True)
visual.geometry.cylinder = create_sdf_element('cylinder')

link.add_visual('visual_2', visual)
print(link)
<link name="base_link">
  <inertial>
    <pose frame="">0.0 10.0 0.0 0 0 0</pose>
    <mass>30.0</mass>
    <inertia>
      <ixx>0.5</ixx>
      <iyy>0.5</iyy>
      <ixz>0</ixz>
      <iyz>0</iyz>
      <izz>0.5</izz>
      <ixy>0</ixy>
    </inertia>
  </inertial>
  <visual name="visual_1">
    <geometry>
      <plane>
        <size>0 0</size>
        <normal>0 0 1</normal>
      </plane>
    </geometry>
  </visual>
  <visual name="visual_2">
    <pose frame="">0 0 0 0 0 0</pose>
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <cast_shadows>1</cast_shadows>
    <transparency>0</transparency>
    <material>
      <shader type="pixel">
        <normal_map>default</normal_map>
      </shader>
      <specular>0.1 0.1 0.1 1</specular>
      <ambient>0 0 0 1</ambient>
      <emissive>0 0 0 1</emissive>
      <lighting>0</lighting>
      <script>
        <uri>file://media/materials/scripts/gazebo.material</uri>
        <name>default</name>
      </script>
      <diffuse>0 0 0 1</diffuse>
    </material>
  </visual>
  <kinematic>0</kinematic>
  <pose frame="">0 0 1 0 0 0</pose>
  <gravity>1</gravity>
  <collision name="collision_1">
    <geometry>
      <empty></empty>
    </geometry>
  </collision>
  <collision name="collision_2">
    <geometry>
      <cylinder>
        <radius>0</radius>
        <length>0</length>
      </cylinder>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_2_0">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
  <collision name="collision_3">
    <geometry>
      <box>
        <size>0 0 0</size>
      </box>
    </geometry>
    <max_contacts>10</max_contacts>
    <contact>
      <bullet>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <soft_erp>0.2</soft_erp>
        <split_impulse>1</split_impulse>
        <kd>1</kd>
        <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
      </bullet>
      <ode>
        <soft_cfm>0</soft_cfm>
        <kp>1000000000000.0</kp>
        <min_depth>0</min_depth>
        <max_vel>0.01</max_vel>
        <kd>1</kd>
        <soft_erp>0.2</soft_erp>
      </ode>
    </contact>
    <laser_retro>0</laser_retro>
    <pose frame="">0 0 0 0 0 0</pose>
    <surface>
      <bounce>
        <restitution_coefficient>0</restitution_coefficient>
        <threshold>100000</threshold>
      </bounce>
      <contact>
        <bullet>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <soft_erp>0.2</soft_erp>
          <split_impulse>1</split_impulse>
          <kd>1</kd>
          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
        </bullet>
        <ode>
          <soft_cfm>0</soft_cfm>
          <kp>1000000000000.0</kp>
          <min_depth>0</min_depth>
          <max_vel>0.01</max_vel>
          <kd>1</kd>
          <soft_erp>0.2</soft_erp>
        </ode>
      </contact>
      <friction>
        <torsional>
          <patch_radius>0</patch_radius>
          <surface_radius>0</surface_radius>
          <ode>
            <slip>0</slip>
          </ode>
          <coefficient>1</coefficient>
          <use_patch_radius>1</use_patch_radius>
        </torsional>
        <bullet>
          <fdir1>0 0 0</fdir1>
          <friction>1</friction>
          <rolling_friction>1</rolling_friction>
          <friction2>1</friction2>
        </bullet>
        <ode>
          <mu2>1</mu2>
          <mu>1</mu>
          <fdir1>0 0 0</fdir1>
          <slip1>0</slip1>
          <slip2>0</slip2>
        </ode>
      </friction>
    </surface>
  </collision>
</link>
# You can retrieve the visual geometry by its name
# If the name given is not found, the function will return None
print(link.get_visual_by_name('visual_1'))
print(link.get_visual_by_name('visual_10'))
# Or iterate in the visuals list
for elem in link.visuals:
    print(elem)
<visual name="visual_1">
  <geometry>
    <plane>
      <size>0 0</size>
      <normal>0 0 1</normal>
    </plane>
  </geometry>
</visual>

None
<visual name="visual_1">
  <geometry>
    <plane>
      <size>0 0</size>
      <normal>0 0 1</normal>
    </plane>
  </geometry>
</visual>

<visual name="visual_2">
  <pose frame="">0 0 0 0 0 0</pose>
  <geometry>
    <cylinder>
      <radius>0</radius>
      <length>0</length>
    </cylinder>
  </geometry>
  <cast_shadows>1</cast_shadows>
  <transparency>0</transparency>
  <material>
    <shader type="pixel">
      <normal_map>default</normal_map>
    </shader>
    <specular>0.1 0.1 0.1 1</specular>
    <ambient>0 0 0 1</ambient>
    <emissive>0 0 0 1</emissive>
    <lighting>0</lighting>
    <script>
      <uri>file://media/materials/scripts/gazebo.material</uri>
      <name>default</name>
    </script>
    <diffuse>0 0 0 1</diffuse>
  </material>
</visual>
Joints
# The joint is empty by default
joint = create_sdf_element('joint')
print(joint)
<joint name="joint" type="revolute">
  <parent>parent</parent>
  <child>none</child>
</joint>
Sensors
sensor = create_sdf_element('sensor')
print(sensor)
<sensor name="default" type="altimeter"/>
print(sensor.get_modes())
['none', 'altimeter', 'camera', 'contact', 'depth', 'gps', 'gpu_ray', 'imu', 'logical_camera', 'magnetometer', 'multicamera', 'ray', 'rfid', 'rfidtag', 'sonar', 'wireless_receiver', 'wireless_transmitter', 'force_torque']
sensor.reset(mode='altimeter', with_optional_elements=True)
print(sensor)
<sensor name="default" type="default">
  <topic>none</topic>
  <update_rate>0</update_rate>
  <always_on>0</always_on>
  <altimeter>
    <vertical_position>
      <noise type="none">
        <precision>0</precision>
        <stddev>0</stddev>
        <bias_stddev>0</bias_stddev>
        <bias_mean>0</bias_mean>
        <mean>0</mean>
      </noise>
    </vertical_position>
    <vertical_velocity>
      <noise type="none">
        <precision>0</precision>
        <stddev>0</stddev>
        <bias_stddev>0</bias_stddev>
        <bias_mean>0</bias_mean>
        <mean>0</mean>
      </noise>
    </vertical_velocity>
  </altimeter>
  <pose frame="">0 0 0 0 0 0</pose>
  <visualize>0</visualize>
  <plugin filename="" name=""/>
</sensor>
sensor.reset(mode='camera', with_optional_elements=True)
print(sensor)
<sensor name="default" type="default">
  <topic>none</topic>
  <update_rate>0</update_rate>
  <always_on>0</always_on>
  <pose frame="">0 0 0 0 0 0</pose>
  <visualize>0</visualize>
  <plugin filename="" name=""/>
  <camera name="default">
    <clip>
      <near>100</near>
      <far>0.1</far>
    </clip>
    <distortion>
      <k3>0</k3>
      <k2>0</k2>
      <k1>0</k1>
      <center>0.5 0.5</center>
      <p2>0</p2>
      <p1>0</p1>
    </distortion>
    <noise type="none">
      <precision>0</precision>
      <stddev>0</stddev>
      <bias_stddev>0</bias_stddev>
      <bias_mean>0</bias_mean>
      <mean>0</mean>
    </noise>
    <horizontal_fov>1.047</horizontal_fov>
    <image>
      <width>320</width>
      <format>R8G8B8</format>
      <height>1</height>
    </image>
    <depth_camera>
      <output>depths</output>
    </depth_camera>
    <save enabled="False">
      <path>__default__</path>
    </save>
  </camera>
</sensor>
sensor.reset(mode='force_torque', with_optional_elements=True)
print(sensor)
<sensor name="default" type="default">
  <topic>none</topic>
  <update_rate>0</update_rate>
  <always_on>0</always_on>
  <pose frame="">0 0 0 0 0 0</pose>
  <visualize>0</visualize>
  <plugin filename="" name=""/>
  <force_torque>
    <frame>child</frame>
    <measure_direction>child_to_parent</measure_direction>
  </force_torque>
</sensor>