make_robot("<name>") returns a RemoteRobot. Its attributes are the methods and subcomponents below, and every call runs on the robot; the driver behind it is UR3e. Connecting neither starts nor moves the robot — it attaches to one that is already up. A method that fails on the robot arrives as RuntimeError naming the original error in its message. The client packages this page uses are preinstalled in every GRID session workspace and in the Python environment the GRID CLI prepares when you run a program with skill run; there is nothing to install.
Methods on the robot
Called asrobot.<method>(...).
addNamedPose()
Signature
required
Name of the pose to define
required
List of joint angles in radians
endFreeDrive()
Signature
moveToPose and
setJointAngles.
Raises:
RuntimeError: If the robot is in read only mode or the
controller rejects the end-teach-mode request.
followJointTrajectory()
Signature
angles is visited in order. The arm briefly
stops at every intermediate waypoint — this implementation is a
per-segment loop over setJointAngles, not a blended
trajectory.
required
Sequence of joint configurations (radians) to visit in order. Each inner list must have 6 elements (one per UR joint).
required
Either a single positive float giving the total trajectory time in seconds (split evenly across segments), or a list of positive floats with the same length as
angles giving the duration of each segment from the previous pose to angles[i].default:"True"
Wait for the final segment to complete before returning. Intermediate segments are always blocking. Defaults to True.
angles is empty, duration is not
positive, or list-form duration length does not match
angles.
RuntimeError: If the robot is in read only mode or any
segment command is rejected.
getEndEffectorForce()
Signature
getEndEffectorPose()
Signature
getEndEffectorPosition()
Signature
default:"True"
If True, return the position normalized against the auto-calibrated travel range. If False, return the raw Robotiq encoder value on its fixed 0-255 scale. Defaults to True.
getImage()
Signature
getImage() returns.
str
default:"''"
Name of the camera to get image from — either a directly attached camera’s name or a
/-separated path through subcomponents to a nested one (left_arm/wrist). May be omitted when the robot has exactly one camera.Forwarded to the underlying sensor’s
getImage. Lets callers pass camera-specific options (e.g. image_type="depth", compressed=False) without the base class having to enumerate them.getInverseKinematics()
Signature
moveToPose(high_frequency=True) stream (e.g. labelling a VR teleop
takeover for DAgger).
required
Target tool position in meters, in the robot base frame.
required
Target tool orientation, in the robot base frame.
Joint positions (radians) used to disambiguate the solution; the IK closest to
qnear is returned (pass the current joints to avoid elbow/wrist flips). When None, the controller uses the current joint positions.getJointAngles()
Signature
getJointTorques()
Signature
getJointVelocities()
Signature
getLidarPointCloud()
Signature
str
default:"''"
Name of the lidar. If empty, uses the first available lidar.
getNamedPose()
Signature
required
Name of the pose to get (case-insensitive)
getObs()
Signature
bool
default:"True"
If True, include robot state (joint positions, velocities, end-effector pose, force, torques, gripper). Defaults to True.
bool
default:"True"
If True, include RGB images from all attached cameras. Defaults to True.
Optional[List[str]]
List of proprioception field names to include. If None, all available fields are returned.
bool
default:"True"
If True, normalize gripper position to [0, 1]. Defaults to True.
getOrientation()
Signature
getPose()
Signature
getPosition()
Signature
getState()
Signature
_local_state, and the walk composes the per-component
results into one nested mapping. Subclasses must not replace
this method — per-component state belongs in _local_state.
With no keys, returns this component’s local state merged
with one nested node per subcomponent name — the tree structure
is the nesting itself, and the names mirror subcomponents
(and therefore serialize() and edge introspection): a
two-arm rig returns {"left_arm": {"joint_positions": ...}, "right_arm": {...}}, and a leaf component returns its local
state alone. A component whose state could not be read (dead
telemetry, not yet started, already shut down) carries an
"error" entry — {"error": "<ExceptionType>: <message>"},
with its children still nested alongside — instead of its state
keys. Errors are contained per node: one failing component never
loses the rest of the snapshot, and the walk still descends into
the failing component’s children. "error" is reserved for
that purpose, and local state keys must not collide with
subcomponent names; a hook violating either is reported as that
node’s error.
With keys, returns a flat mapping with one entry per match.
Each key is a /-separated path through the component tree:
every segment names a subcomponent, and the final segment may
instead name an entry in that component’s local state. Because
structure is the nesting, a literal path is the same as plain
indexing — getState(["left_arm/joint_positions"]) returns
the value of getState()["left_arm"]["joint_positions"] — and
a path ending on a subcomponent yields that component’s full
nested node. Segments may use shell-style wildcards over
subcomponent names — * matches within one chunk and **
matches any chain of chunks — so "*_arm/joint_positions"
fans out to one entry per arm, keyed by the concrete matched
path. Wildcards never match state entries; only a literal final
segment does. A key that matches nothing raises, so a typo is
loud rather than silently absent. A matched component whose
state read failed yields {"error": "..."} at its path.
Keyed reads are lazy: a hook runs only where a key lands — a
literal path executes the final component’s hook alone (not the
nodes traversed on the way), a glob executes only the matched
nodes, and each component’s hook runs at most once per call
however many keys reach it. Components with a selective-read
hook (_local_state_entries — every Robot with
registered state getters) go further and execute only the getters a key names, so
a ** glob probes their registries without touching
hardware. The caller pays only for the state actually
requested; ** and the no-keys form visit the whole tree
because that is the request.
State is cheap by convention: local state carries kinematics,
status, and health — never bulk sensor payloads (camera frames,
point clouds, scans), which stay in their dedicated methods
(getImage, getPointCloud, …). Callable on a stopped
tree — reading state after a soft e-stop is when it matters most
— and on a partially started one, where unstarted components
report a per-node error instead of failing the call.
State paths to read, or None for the full nested snapshot. A single string is shorthand for a one-element list.
keys is None, otherwise a
flat mapping of matched path to state value or nested node.
Raises:
TypeError: If keys is neither None, a string, nor a
list/tuple of strings.
ValueError: If a key is empty, has an empty path segment, or
matches no subcomponent path or state entry.
get_payload()
Signature
(mass, cog) tuple — mass in kilograms and center of gravity
[x, y, z] in meters, displaced from the tool mount in the flange
frame. Reflects whatever was last set, whether from the pendant
installation screen or set_payload.
grasp()
Signature
suction=False (the default) the end effector is closed in
place. With suction=True the arm advances approach_distance
meters along the gripper’s z-axis (the direction the gripper points),
engages the end effector, then retracts to the joint configuration it
was in before the call. Use suction=True for end effectors that
need light contact with a target before sealing.
Sets ee_state to CLOSED on success.
default:"False"
If True, perform a short approach-then-engage-then-retract motion instead of engaging in place. Defaults to False.
default:"0.03"
Distance to advance along the gripper z-axis when
suction=True (meters). Defaults to 0.03.default:"2.0"
Total duration of the approach move when
suction=True (seconds). Defaults to 2.0.moveToDeltaPose()
Signature
required
Pose offset to compose with the current pose. The position is added to the current position and the orientation is composed with the current orientation.
default:"True"
Wait for movement to complete. Defaults to True.
moveToHome()
Signature
default:"True"
Wait for movement to complete. Defaults to True.
default:"2.0"
Total duration of the move (seconds). Defaults to 2.0.
default:"0.75"
Time spent accelerating and decelerating (seconds). Clamped to at most
moving_time / 2. Defaults to 0.75.moveToNamedPose()
Signature
required
Name of the pose to move to (case-insensitive).
default:"True"
Wait for movement to complete. Defaults to True.
default:"2.0"
Total duration of the move (seconds). Defaults to 2.0.
default:"0.75"
Time spent accelerating and decelerating (seconds). Clamped to at most
moving_time / 2. Defaults to 0.75.named_poses.
moveToPose()
Signature
high_frequency=False (the default) for a normal point-to-point
move that takes moving_time seconds end-to-end. Set
high_frequency=True to stream a single setpoint from a real-time
control loop (e.g. ~500 Hz) — each call commands one short step of
duration step_time and returns immediately, letting the arm follow
a stream of closely-spaced setpoints. Parameters that apply only to the
other mode are silently ignored (each is annotated below).
When avoid_force=True the arm stops and raises
grid_types.ForceThresholdExceeded if the end-effector force or
torque rises above the configured thresholds.
required
Target pose (position in meters, orientation as a unit quaternion) in the robot’s base frame.
default:"True"
Wait for the move to complete. Ignored when
high_frequency=True (those calls always return immediately). Defaults to True.default:"False"
Select between a normal point-to-point move (False) and a single streaming control step (True). Defaults to False.
default:"2.0"
Total duration of the move (seconds). Used only when
high_frequency=False. Defaults to 2.0.default:"0.5"
Time spent accelerating and decelerating (seconds). Clamped to at most
moving_time / 2. Used only when high_frequency=False. Defaults to 0.5.default:"False"
If True, stop and raise
RuntimeError when the end-effector force or torque rises above the configured thresholds. Requires blocking=False: force monitoring runs the move asynchronously, so it cannot also block. Defaults to False.default:"5"
Deceleration (m/s^2) used when stopping on a force/torque trigger. Used only when
high_frequency=False. Defaults to 5.0.default:"10"
Force (N) above the pre-move baseline that triggers a stop. Used only when
high_frequency=False. Defaults to 10.0.default:"0.1"
Duration of one high-frequency step (seconds). Used only when
high_frequency=True. Defaults to 0.1.default:"0.03"
Smoothing horizon for the high-frequency tracking controller (seconds). Larger values smooth the trajectory at the cost of responsiveness. Clamped to [0.03, 0.2]. Used only when
high_frequency=True. Defaults to 0.03.default:"300.0"
Proportional gain of the high-frequency tracking controller. Lower values give faster reaction; higher values reduce overshoot but may cause jerkiness or oscillation. Clamped to [100, 2000]. Used only when
high_frequency=True. Defaults to 300.0.moving_time, accel_time, or step_time are
not positive numbers, or if avoid_force=True is combined
with blocking=True.
RuntimeError: If the robot is in read only mode, the move command
is rejected, avoid_force=True and the end-effector
force/torque exceeds the configured thresholds, or a compliant
servo overlay is active — pose targets cannot be routed into
it (stop it with stopCompliantServo() first).
network_addresses()
Signature
required
Config
args for this robot, as the wizard collected them.release()
Signature
removeNamedPose()
Signature
required
Name of the pose to remove (case-insensitive)
retract()
Signature
RuntimeError from a force-aware
motion command. With both distances at 0.0 (default), retracts until
the contact wrench settles. With a positive distance, retracts that
far along the contact direction.
default:"0.0"
Cartesian back-off distance in meters. 0.0 retracts until force settles.
default:"0.0"
Wrist back-off rotation in radians. 0.0 retracts until torque settles.
setEndEffectorPosition()
Signature
ee_state is updated immediately to the binary target
implied by position. For a nonblocking call this is optimistic
command state, not observed jaw feedback; use
getEndEffectorPosition to read the current hardware position.
required
Normalized target in the inclusive range [0.0, 1.0], where 0.0 is fully open and 1.0 is fully closed.
default:"False"
If True, wait until the gripper stops moving because it reached the target or stalled against an object. If False, return after the command is accepted. Defaults to False.
position is not a finite number in [0.0, 1.0].
setJointAngles()
Signature
high_frequency=False (the default) for a normal point-to-point
move that takes moving_time seconds end-to-end. Set
high_frequency=True to stream a single setpoint from a real-time
control loop (e.g. ~500 Hz) — each call commands one short step of
duration step_time and returns immediately, letting the arm follow
a stream of closely-spaced setpoints. Parameters that apply only to the
other mode are silently ignored (each is annotated below).
When avoid_force=True the arm stops and raises
grid_types.ForceThresholdExceeded if the end-effector force rises
above the configured threshold.
required
List of 6 target joint angles in radians (one per joint, base to wrist).
default:"True"
Wait for the move to complete. Ignored when
high_frequency=True (those calls always return immediately). Defaults to True.default:"False"
Select between a normal point-to-point move (False) and a single streaming control step (True). Defaults to False.
default:"2.0"
Total duration of the move (seconds). Used only when
high_frequency=False. Defaults to 2.0.default:"0.5"
Time spent accelerating and decelerating (seconds). Clamped to at most
moving_time / 2. Used only when high_frequency=False. Defaults to 0.5.default:"False"
If True, stop and raise
RuntimeError when the end-effector force rises above the configured threshold. Requires blocking=False: force monitoring runs the move asynchronously, so it cannot also block. Defaults to False.default:"5"
Deceleration (rad/s^2) used when stopping on a force trigger. Used only when
high_frequency=False. Defaults to 5.0.default:"10"
Force (N) above the pre-move baseline that triggers a stop. Used only when
high_frequency=False. Defaults to 10.0.default:"0.1"
Duration of one high-frequency step (seconds). Used only when
high_frequency=True. Defaults to 0.1.default:"0.03"
Smoothing horizon for the high-frequency tracking controller (seconds). Larger values smooth the trajectory at the cost of responsiveness. Clamped to [0.03, 0.2]. Used only when
high_frequency=True. Defaults to 0.03.default:"300.0"
Proportional gain of the high-frequency tracking controller. Lower values give faster reaction; higher values reduce overshoot but may cause jerkiness or oscillation. Clamped to [100, 2000]. Used only when
high_frequency=True. Defaults to 300.0.moving_time, accel_time, or step_time
are not positive numbers, or if avoid_force=True is
combined with blocking=True.
RuntimeError: If the robot is in read only mode, the move
command is rejected, avoid_force=True and the
end-effector force exceeds the configured threshold, or a
blocking move is attempted while the compliant servo overlay
is active (stop it with stopCompliantServo() first).
set_payload()
Signature
getEndEffectorForce
— so a static payload’s weight stops reading as an external push. One call
after grasping remains valid as the wrist rotates, as long as the payload
does not shift in the gripper.
required
Payload mass in kilograms.
Center of gravity
[x, y, z] in meters, displaced from the tool mount in the flange frame. None sets [0.0, 0.0, 0.0].startCompliantServo()
Signature
stopCompliantServo. The gripper is never commanded by the
overlay.
Call with the arm stationary, contact-free, and at a repeatable pose
(e.g. after moveToHome()): the call blocks for
baseline_duration seconds measuring the resting force-sensor bias
that contact detection is referenced against.
Idempotent: if an overlay is already running, returns its status
without re-measuring the baseline.
default:"100.0"
Rate (Hz) at which the client streams waypoints; the overlay interpolates between them at the arm’s servo rate.
default:"1.0"
Multiplier in [0, 1] on the sensed contact force. 1.0 = full tuned compliance; 0.0 = rigid waypoint tracking (contact has no effect, safety limits stay armed).
default:"3.0"
Resting-force sampling window in seconds.
started (bool), already_running (bool),
baseline (list of 6 floats, N / N·m) and waypoint_hz.
Raises:
RuntimeError: If the arm is read-only.
ValueError: If waypoint_hz or baseline_duration is not
positive, or force_scale is outside [0, 1].
startFreeDrive()
Signature
moveToPose and setJointAngles are not active in
this mode — call endFreeDrive to return to position
control.
Raises:
RuntimeError: If the robot is in read only mode, the controller
rejects the teach-mode request, or a compliant servo overlay
is active (stop it with stopCompliantServo() first —
teach mode and the overlay would be two competing writers).
stop()
Signature
immediate escape hatch; it never re-implements the recursion.
With immediate=False it delegates to super().stop() — the
standard recursive walk, which covers the attached end effector
and any other subcomponents, then performs a controlled stop of
the arm. immediate=True is a UR-specific hard stop that
halts the arm instantly without walking the tree (an attached
gripper holds its state on its own).
default:"False"
If True, stop motion instantly by killing the control script (no controlled deceleration), then reupload it so the arm stays usable for subsequent commands. Use this for an emergency stop. If False, perform a controlled stop and leave the script running. Defaults to False.
immediate=True on an arm that was never
started, so there is no control script to kill; or if
immediate=True stopped motion but the control script
could not be restarted (the controller is still in an
emergency or protective stop) — clear the stop on the
robot, then call start() to restore control.
ComponentStopError: If immediate=False and a stop hook in
the component tree raised; the walk still visits every
component.
stopCompliantServo()
Signature
startCompliantServo()) is called.
Returns:
Dict with stopped (bool) and was_running (bool) — whether an
overlay existed and whether its loop was still alive.
Raises:
RuntimeError: If the overlay thread does not exit within 2 seconds.
validateGrasp()
Signature
EndEffector.getGripDetected. Subclasses generally do not
need to override this.
Returns:
True if the end effector reports an object in its grip, False
otherwise.
Raises:
RuntimeError: If no end effector is configured on this arm.
NotImplementedError: If the configured end effector does not
support grip detection.
waitPeriod()
Signature
initPeriod to pace a streaming control loop (see
initPeriod for example usage).
required
Loop-iteration start time returned by
initPeriod.Properties on the robot
Read asrobot.<property>; each read runs the getter on the robot.
ControlMode
The controller mode this driver last commanded.Driver-owned: it changes only through the motion API
(
startFreeDrive, endFreeDrive, the servo/speed/force
paths and stop), never by assignment.int
Optimistic binary end-effector command state,
OPEN (0) or CLOSED (1).Updated immediately after an accepted gripper command, so it reflects
the last command issued rather than observed hardware feedback — read
getEndEffectorPosition for the current jaw position.float
Force/torque baseline EMA smoothing factor, in [0, 1]. Writable.Higher values make the baseline track more slowly, increasing
sensitivity to sudden contacts.
float
Linear force delta above the EMA baseline that trips retraction, in N.Writable; must be finite and > 0.
List[float]
Joint angles (radians) with the arm over the workspace, joints at 90 degrees.
float
Cap applied to commanded joint acceleration, in rad/s^2.Writable; must be finite and > 0.
float
Cap applied to commanded joint speed, in rad/s. Writable; must be finite and > 0.
float
Cap applied to commanded tool acceleration, in m/s^2.Writable; must be finite and > 0.
float
Cap applied to commanded tool speed, in m/s. Writable; must be finite and > 0.
Dict[str, List[float]]
Registered poses as
{name: joint angles in radians} (a copy).Mutating the returned mapping does not change what the arm knows:
register and remove entries with addNamedPose and
removeNamedPose, or assign a whole mapping to replace them all.bool
Whether this arm was provisioned without a control interface (telemetry only).
float
End-effector torque delta above the EMA baseline that trips retraction, in N·m.Writable; must be finite and > 0.
Configured children
robot.end_effector— the gripper, chosen in the robot’s configuration; when one is fitted, its methods are theEndEffectorinterface’s.
Lifecycle and configuration
The driver’s own bring-up and configuration hooks. The edge runs them when the robot comes up; do not call them from a program. Note thatrobot.shutdown() on the proxy is not the method below — it is RemoteRobot.shutdown(), which closes your connection and leaves the robot as it was.
addSensor()— Add an external sensor to the robot.addSubcomponent()— Attach a child component under a name.builtin_subcomponents()— Declare the children this class always ships with (customization point).configHash()— Hash this component’s serialized config subtree.config_schema()from_config()— Construct this component and its config-declared subtree.getIdentity()— Get this component’s own hardware identity (serial, model, version, MAC).getRobotId()— Stable, readable identifier for a robot or rig, for a database key.initPeriod()— Mark the start of a real-time control-loop iteration.serialize()— Serialize this component tree back to its config envelope.setup_shutdown_handlers()— Register the process-wide atexit and signal handlers for safe teardown.shutdown()— Shut down this component’s tree, halting motion and releasing resources.start()— Bring this component’s tree online (connect, enable, arm).
Image — call decode() for an ndarray). You reach the robot through make_robot.