Collisions
Collision¶
The collision properties of a link. Note that this can be different from the visual properties of a link, for example, simpler collision models are often used to reduce computation time. This is a child element of <link>
and a link can have multiple collisions.
# Import the element creator from pcg_gazebo.parsers.sdf import create_sdf_element
# The collision element is created with an empty geometry by default collision = create_sdf_element('collision') print(collision)
<collision name="collision"> <geometry> <empty></empty> </geometry> </collision>
# To see the optional elements, use the method reset() collision.reset(with_optional_elements=True) print(collision)
<collision name="collision"> <max_contacts>10</max_contacts> <pose frame="">0 0 0 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <empty></empty> </geometry> <laser_retro>0</laser_retro> </collision>
# Setting the parameters of a collision element # Maximum number of contacts allowed between two entities, this value # will override the max_contacts element defined in physics collision.max_contacts = 30 # Pose of the collision geometry with respect to a speficied frame collision.pose = [0, 0, 1, 0, 0, 0] collision.pose.frame = 'base_link' print(collision)
<collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <empty></empty> </geometry> <laser_retro>0</laser_retro> </collision>
# Setting different geometries to the collision element collision.geometry.box = create_sdf_element('box') print(collision) collision.geometry.sphere = create_sdf_element('sphere') print(collision) collision.geometry.cylinder = create_sdf_element('cylinder') print(collision) collision.geometry.plane = create_sdf_element('plane') print(collision) collision.geometry.mesh = create_sdf_element('mesh') collision.geometry.mesh.reset(with_optional_elements=True) print(collision) collision.geometry.image = create_sdf_element('image') print(collision) collision.geometry.polyline = create_sdf_element('polyline') print(collision)
<collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <box> <size>0 0 0</size> </box> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <sphere> <radius>0</radius> </sphere> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <cylinder> <radius>0</radius> <length>0</length> </cylinder> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <plane> <normal>0 0 1</normal> <size>0 0</size> </plane> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <mesh> <uri></uri> <scale>1 1 1</scale> <submesh> <name>none</name> <center>0</center> </submesh> </mesh> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <image> <threshold>0</threshold> <uri></uri> <scale>1</scale> <granularity>1</granularity> <height>1</height> </image> </geometry> <laser_retro>0</laser_retro> </collision> <collision name="collision"> <max_contacts>30</max_contacts> <pose frame="base_link">0 0 1 0 0 0</pose> <surface> <bounce> <threshold>100000</threshold> <restitution_coefficient>0</restitution_coefficient> </bounce> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <friction> <torsional> <ode> <slip>0</slip> </ode> <surface_radius>0</surface_radius> <coefficient>1</coefficient> <use_patch_radius>1</use_patch_radius> <patch_radius>0</patch_radius> </torsional> <ode> <fdir1>0 0 0</fdir1> <mu>1</mu> <slip1>0</slip1> <slip2>0</slip2> <mu2>1</mu2> </ode> <bullet> <fdir1>0 0 0</fdir1> <rolling_friction>1</rolling_friction> <friction>1</friction> <friction2>1</friction2> </bullet> </friction> </surface> <contact> <ode> <kp>1000000000000.0</kp> <soft_erp>0.2</soft_erp> <kd>1</kd> <min_depth>0</min_depth> <soft_cfm>0</soft_cfm> <max_vel>0.01</max_vel> </ode> <bullet> <kp>1000000000000.0</kp> <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold> <kd>1</kd> <split_impulse>1</split_impulse> <soft_cfm>0</soft_cfm> <soft_erp>0.2</soft_erp> </bullet> </contact> <geometry> <polyline> <height>1</height> </polyline> </geometry> <laser_retro>0</laser_retro> </collision>
# Optional elements can also be created dynamically collision = create_sdf_element('collision') print(collision)
<collision name="collision"> <geometry> <empty></empty> </geometry> </collision>
collision.max_contacts = 40 print(collision)
<collision name="collision"> <max_contacts>40</max_contacts> <geometry> <empty></empty> </geometry> </collision>
collision.pose = [0, 0.2, 0, 0, 0, 0] collision.pose.frame = 'new_frame' print(collision)
<collision name="collision"> <max_contacts>40</max_contacts> <pose frame="new_frame">0 0.2 0 0 0 0</pose> <geometry> <empty></empty> </geometry> </collision>
# The geometry entity can be set with a dictionary with all the child parameters collision.geometry.box = dict(size=[2, 3, 4]) print(collision)
<collision name="collision"> <max_contacts>40</max_contacts> <pose frame="new_frame">0 0.2 0 0 0 0</pose> <geometry> <box> <size>2 3 4</size> </box> </geometry> </collision>
# 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')} collision.pose = {'value': [0, 0.2, 0, 0, 0, 0], 'attributes': {'frame': 'new_frame'}} print(collision)
<collision name="collision"> <max_contacts>40</max_contacts> <pose frame="new_frame">0 0.2 0 0 0 0</pose> <geometry> <box> <size>2 3 4</size> </box> </geometry> </collision>