Skip to main content
se3labs.interface.eval.station

Stations

Station specs (hardware capability) and the station-level observation / action containers.

A station is a named collection of arms and cameras. Observations and actions are keyed by those names so that a bimanual and a single-arm station share one container type.

The policy side of the contract is policy.Policy: it consumes Station_Observation ticks and produces Station_ActionChunks. Anything about how the policy runs (its rate, chunk length, replanning, image preprocessing) is decided inside the policy, not declared to the SDK.

Station_BaseSpec​

class Station_BaseSpec(Enum)

Attributes​

Static = 'static'​#

Static manipulation base (the arm is mounted on a fixed, non-mobile base).

Station_Spec​

class Station_Spec(ABC)

Attributes​

base: Station_BaseSpec​#
arms: dict[str, arm_types.MotorizedArmSpec]​#

Read-only property. Arm name -> spec. Names are the keys of Station_Observation.arms and Station_ActionChunk.arms.

cameras: dict[str, camera.Camera_DeviceSpec]​#

Read-only property. Camera name -> spec. Names are the keys of Station_Observation.cameras.

Bimanual_Station_Spec​

Bimanual_Station_Spec(
wrist_camera: camera.Camera_DeviceSpec,
topdown_camera: camera.Camera_DeviceSpec,
)

Attributes​

base: Station_BaseSpec​#
arm: arm_types.MotorizedArmSpec​#

Spec shared by the left and right arms.

wrist_camera: camera.Camera_DeviceSpec​#

Spec shared by the wrist_left and wrist_right cameras.

topdown_camera: camera.Camera_DeviceSpec​#
arms: dict[str, arm_types.MotorizedArmSpec]​#

Read-only property.

cameras: dict[str, camera.Camera_DeviceSpec]​#

Read-only property.

Teleop_Bimanual_Station_Spec​

Teleop_Bimanual_Station_Spec(
wrist_camera: camera.Camera_DeviceSpec,
topdown_camera: camera.Camera_DeviceSpec,
)

A bimanual station with a second pair of arms, leader_left and leader_right, beside left and right.

Attributes​

leader_arm: arm_types.MotorizedArmSpec​#
arms: dict[str, arm_types.MotorizedArmSpec]​#

Read-only property.

Single_Arm_Station_Spec​

Single_Arm_Station_Spec(
wrist_camera: camera.Camera_DeviceSpec,
)

Attributes​

base: Station_BaseSpec​#
arm: arm_types.MotorizedArmSpec​#
wrist_camera: camera.Camera_DeviceSpec​#
arms: dict[str, arm_types.MotorizedArmSpec]​#

Read-only property.

cameras: dict[str, camera.Camera_DeviceSpec]​#

Read-only property.

Station_Observation​

Station_Observation(
cameras: dict[str, camera.Camera_Observation],
)

One policy-side observation: the latest tick of every arm and camera.

Arms and cameras run at different rates, so each entry carries its own timestamp; consumers that need temporal alignment (world models, chunked policies) should use those rather than assume sync.

Attributes​

arms: dict[str, arm_types.MotorizedArm_Observation]​#
cameras: dict[str, camera.Camera_Observation]​#

Methods​

validate(station: Station_Spec) -> None​#

Check every arm / camera of station is present with the shapes its spec promises.

Station_JointPose​

Station_JointPose(arms: dict[str, arm_types.MotorizedArm_JointPose])

One absolute joint configuration for every arm of a station.

Attributes​

arms: dict[str, arm_types.MotorizedArm_JointPose]​#

Methods​

validate(station: Station_Spec) -> None​#

Check the pose names exactly the station's arms with the right shapes.

Station_ActionChunk​

Station_ActionChunk(
timestamp: float,
rate: float,
)

A chunk of horizon absolute joint-position targets for every arm of a station.

Row i of every arm is the target at timestamp + i / rate. The station interpolates rows up to each arm's control_rate and executes them until the policy returns a new chunk, which replaces the remainder of the current one.

Attributes​

timestamp: float​#

Station-clock time of the observation this chunk was predicted from, unit: [s].

rate: float​#

Spacing between consecutive rows, unit: [Hz]. Chosen by the policy per chunk.

arms: dict[str, arm_types.MotorizedArm_ActionChunk]​#
horizon: int​#

Read-only property.

Methods​

__len__() -> int​#
__getitem__(index: int) -> Station_JointPose​#

Row index of the chunk, for every arm, as one station pose. Negative indices count from the end.

validate(station: Station_Spec) -> None​#

Check the chunk names exactly the station's arms, with the right shapes and a feasible rate.