Collision Configurations

Kinematics (IK) and point-to-point planning take the name of a collision configuration. A collision configuration says which pairs of scene items may touch and how much clearance to keep everywhere else.

message CollisionConfig {
  string name = 1;                     // required
  repeated CollisionPair pairs = 2;    // allowed pairs, not checked
  double collision_margin = 3;         // minimum clearance (m), required
}
message CollisionPair { string name1 = 1; string name2 = 2; }

The server checks every pair of objects and system components except the ones listed in pairs. An empty pairs list checks every pair. Add a pair when the two items are meant to touch, for example a gripper and the part it holds.

Pair names are objects or system components, for example box_1 or system_1.arm. Get the valid names from CollisionService.ListComponents.

CollisionService

client.collision stores collision configurations in the active workcell:

RPC

Description

Save

SaveRequest(collision_config=...): create or overwrite.

Get / Exists / Remove

NameRequest(name).

Rename

RenameRequest(old_name, new_name).

List

Empty → names.

AddPair / RemovePair

AddPairRequest(name, pair) / RemovePairRequest(name, pair): allow one more pair, or check it again, in an existing config.

ListComponents

Empty → every name valid in a pair.

Example

The minimum, used by the kinematics example, is an empty configuration, which checks every pair:

from flexiv.pdk.scene.collision.collision_config_pb2 import CollisionConfig, CollisionPair
from flexiv.pdk.scene.collision.collision_service_pb2 import SaveRequest as CollisionSaveRequest

client.collision.stub.Save(CollisionSaveRequest(
    collision_config=CollisionConfig(name="default_collision_config", collision_margin=0.0)))

With allowed pairs (box_1 is not checked against system_1.arm):

print("Creating collision configurations...")
def save_collision_config(name, pairs, collision_margin):
    config = CollisionConfig(name=name, collision_margin=collision_margin)
    for n1, n2 in pairs:
        pair = CollisionPair(name1=n1, name2=n2)
        config.pairs.append(pair)
    try:
        client.collision.stub.Save(CollisionSaveRequest(collision_config=config))
    except grpc.RpcError as e:
        print(f"Save collision config failed: {e}")

# Default collision configuration - no pairs are excluded
save_collision_config("default_collision_config", [
], 0.0)

# Collision configuration that excludes collisions between system_1.arm and box_1
save_collision_config("collision_config_without_box_1", [
    ("system_1.arm", "box_1"),
], 0.0)

# Collision configuration that excludes collisions between system_1.arm and box_1 and box 4 and box 1
save_collision_config("collision_config_without_box_1_and_box_4", [
    ("system_1.arm", "box_1"),
    ("box_4", "box_1"),
], 0.0)

Discover valid names:

from google.protobuf.empty_pb2 import Empty
print(list(client.collision.stub.ListComponents(Empty()).names))