connect("<name>") returns a RemoteRobot. Its attributes are the methods and subcomponents below, and every call runs on the robot; the driver behind it is FlexivRizon. 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.
getEndEffectorForce()
Signature
getEndEffectorGraspDetected()
Signature
getEndEffectorIsMoving()
Signature
getEndEffectorPose()
Signature
getEndEffectorWidth()
Signature
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.getJointAngles()
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)
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.
grasp()
Signature
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
moveToNamedPose("home", blocking=blocking). The
"home" entry is registered in named_poses from the abstract
home_pose property during Arm.__init__, so every concrete
arm has it. Subclasses may add hardware-specific tuning parameters as
keyword-only arguments after blocking.
default:"True"
Wait for movement to complete. Defaults to True.
moveToNamedPose()
Signature
blocking.
required
Name of the pose to move to (case-insensitive).
default:"True"
Wait for movement to complete. Defaults to True.
moveToPose()
Signature
required
Target pose (position in meters, orientation as a unit quaternion) in the robot’s base frame.
default:"True"
Wait for movement to complete. Defaults to True.
default:"2.0"
seconds to complete the movement (unless you’re already there)
default:"0.5"
seconds to spend accelerating in a trapezoidal motion profile
default:"False"
If False, send discrete commands that are executed by the robot’s motion generator. Otherwise, continuously stream commands to be executed by the robot’s low-level joint position controller.
default:"False"
Currently unused. Not implemented yet
release()
Signature
removeNamedPose()
Signature
required
Name of the pose to remove (case-insensitive)
setJointAngles()
Signature
required
List of target joint angles in radians, starting with the base joint.
default:"True"
Wait for movement to complete (default True)
default:"2.0"
seconds to complete the movement
default:"0.5"
seconds to accelerate from zero to full velocity (another accel_time is needed to decelerate to zero)
default:"False"
If False, send discrete commands that are executed by the robot’s motion generator. Otherwise, continuously stream commands to be executed by the robot’s low-level joint position controller.
startFreeDrive()
Signature
moveToPose and setJointAngles are not active in
this mode — call endFreeDrive to return to position
control.
All six Cartesian axes are unlocked, elbow motion is enabled, and
damping is set to a moderate level on every axis.
stop()
Signature
subcomponents insertion order), then this
component’s own _stop_self hook runs. The walk is
best-effort — a failing component never prevents the rest of the
tree from being stopped; failures are collected and raised
together after the walk completes. Components (and their
subtrees) that have already been shut down are skipped. Safe to
call repeatedly: stopping an already-stopped tree re-runs the
hooks, which must tolerate that. Blocks until every hook has
returned.
Stops motion only; resources stay live and the component remains
usable — telemetry and every other public method keep working on a
stopped tree. Use shutdown to release resources. Stopping
re-arms each visited component, so a later start re-runs
the bring-up hooks — that is the stop-then-start restart path —
but it does not revoke callability: only shutdown does
that.
Subclasses must not replace this method — per-component stop
behavior belongs in _stop_self. An override may only
extend the walk (adding a driver-specific mode, as UR5e does
with its immediate escape hatch) and must delegate to
super().stop() for the normal path; it must never
re-implement the recursion.
Raises:
ComponentStopError: If one or more stop hooks raised. The
walk still visited every component; the exception carries
every (component_path, exception) pair.
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.
Properties on the robot
Read asrobot.<property>; each read runs the getter on the robot.
list[float]
Joint angles (radians) with the arm over the workspace, joints at 90 degrees.
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.Configured children
robot.end_effector— the gripper, chosen in the robot’s configuration; when one is fitted, its methods are theEndEffectorinterface’s.
Not implemented on this robot
Declared by the interface, raisesNotImplementedError here: followJointTrajectory.
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()— Config-args schema for this robot, derived from the constructor.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.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 connect.