Transporters
A transporter is anything that moves labware between locations — typically a robotic arm. Every topology with multiple devices needs at least one transporter so the runtime can move labware between methods.
Defining a transporter
from orca.resource_models.transporter import Transporter
from cheshire_drivers import AccessConfig, CartesianCoordinates, Teachpoint
c = CartesianCoordinates
vertical = AccessConfig(name="default_vertical", access_type="vertical")
stores.access_configs(seed=[vertical])
teachpoints = [
Teachpoint("stacker", c(0, 200, 300, 0, 90, 180), orientation="right", access=vertical),
Teachpoint("shaker", c(400, 200, 300, 0, 90, 180), orientation="right", access=vertical),
Teachpoint("sealer", c(800, 200, 300, 0, 90, 180), orientation="right", access=vertical),
Teachpoint("waste", c(1200, 200, 200, 0, 90, 180), orientation="right", access=vertical),
]
arm = Transporter(
"robotic_arm",
teachpoint_store=stores.teachpoints("robotic_arm", seed=teachpoints),
)
A transporter needs a name and a teachpoint_store. The store maps location names to physical coordinates.
Teachpoints
A Teachpoint's first argument is position_id (the location name this teachpoint reaches), followed by a coordinate and optional access metadata:
Teachpoint(
"sealer", # position_id (positional)
coordinates=c(1300, 200, 300, 0, 90, 180),
orientation="right",
access=sealer_access_config, # optional
)
Cartesian teachpoints must specify orientation ("left" or "right"); a Cartesian teachpoint with orientation=None raises at construction. Cartesian coordinates carry (x, y, z, yaw, pitch, roll).
Cartesian vs joint coordinates
Pick/place locations use CartesianCoordinates (orientation required, supports access patterns). Waypoints along a path use JointCoordinates (per-joint values; no orientation, no access pattern). Both import from cheshire_drivers.
Capturing teachpoints
In production, you capture teachpoints by physically jogging the arm to each location and recording the coordinates. The values shown in examples are placeholders.
TODO: teachpoint capture workflow — how to jog, save, and seed the store from your real lab.
Access configs
Some devices need a special approach pattern (horizontal slide-in for a plate sealer, vertical drop for a centrifuge bucket, etc.). An AccessConfig tells the transporter how to enter and exit the location:
from cheshire_drivers import AccessConfig
sealer_access = AccessConfig(
name="sealer_horizontal",
access_type="horizontal",
gripper_offset=25.0,
horizontal_clearance=120.0,
vertical_clearance=30.0,
)
AccessConfig fields: name, access_type ("vertical" or "horizontal"), gripper_offset (default 20.0), vertical_clearance (default 20.0), horizontal_clearance (default 100.0). Import it from cheshire_drivers.
Seed access configs into the store once and reference the same one from many teachpoints (access=vertical):
from cheshire_drivers import AccessConfig
vertical = AccessConfig(name="default_vertical", access_type="vertical")
horizontal = AccessConfig(name="default_horizontal", access_type="horizontal")
stores.access_configs(seed=[vertical, horizontal])
Persistence caveat: pass a named
AccessConfigviaaccess=..., not inline access params. A teachpoint built with inline params (access_type=...,gripper_offset=...) hasaccess_config_name=Noneand is rejected by persistent teachpoint stores. Always reference a named config so the teachpoint round-trips through storage.
Waypoint gateways
A Teachpoint also accepts a gateway argument: the name of a waypoint to route through before/after pick and place. Use it to chain a safe approach path (typically JointCoordinates waypoints) ahead of a Cartesian pick/place point.
Multiple transporters
A topology can have multiple transporters — common in larger systems with handoff points between two arms. The runtime picks the right transporter for each move based on which arm can reach both endpoints.
TODO: handoff topology example.