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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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))