Skip to main content
The Flexiv Rizon Arm as GRID drives it — what this robot actually implements, with the signatures it actually accepts. 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 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 as robot.<method>(...).

addNamedPose()

Signature
Define a pose_name:joint_angles pair in the dictionary of named poses (overriding any existing pair).
required
Name of the pose to define
required
List of joint angles in radians
Raises: ValueError: If the length of joint_angles list does match the length of other named poses

endFreeDrive()

Signature
Exit free-drive mode and return to position control. The arm is no longer movable by hand and again responds to position-control commands such as moveToPose and setJointAngles.

followJointTrajectory()

Signature
Move the arm through a sequence of joint configurations. Each waypoint in 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 7 elements.
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.
Raises: ValueError: If angles is empty, duration is not positive, list-form duration length does not match angles, or a waypoint is invalid. RobotFault: If the controller reports a fault during a segment. RuntimeError: If a segment stops short of its waypoint or does not arrive before its deadline.

getEndEffectorForce()

Signature
Get the measured finger force in Newtons. Returns: Finger force in Newtons; positive is an opening force, negative a closing force. Reads 0 if the gripper has no force sensing. Raises: RuntimeError: If no gripper is configured.

getEndEffectorGraspDetected()

Signature
Report whether the gripper is holding an object. Returns: True when the fingers push with more than 1.2 N while wider than 2 mm. Raises: RuntimeError: If no gripper is configured.

getEndEffectorIsMoving()

Signature
Report whether the gripper fingers are moving. Returns: True while the fingers are moving. Raises: RuntimeError: If no gripper is configured.

getEndEffectorPose()

Signature

getEndEffectorWidth()

Signature
Get the current gripper width in meters. Returns: Distance between the fingers in meters. Raises: RuntimeError: If no gripper is configured.

getImage()

Signature
Return the image of camera. Which camera a no-argument call reads is decided by cardinality alone — no robot, config, or class declares a default. A robot with exactly one camera needs no name; a robot with several requires one, so adding a second camera never silently changes which one a bare 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.
Returns: Image: The captured image. Raises: RuntimeError: If no cameras are configured, or the name is omitted on a robot with more than one camera; the message lists every configured camera path. KeyError: If camera_name is given but names no camera on this robot.

getJointAngles()

Signature
Get current seven joint angles in radians. Returns: Current seven joint angles in radians, with base joint first

getJointVelocities()

Signature
Get current seven joint velocities in radians/second. Returns: Current seven joint velocities in radians/second, with base joint first

getLidarPointCloud()

Signature
Get a point cloud from the named LiDAR sensor.
str
default:"''"
Name of the lidar. If empty, uses the first available lidar.
Returns: Optional[PointCloud]: The point cloud, or None if lidar not found

getNamedPose()

Signature
Get the list of joint angles corresponding to a named pose.
required
Name of the pose to get (case-insensitive)
Returns: list: Joint angles (radians) of the named pose, or None if the named pose does not exist

getOrientation()

Signature
Get the current end effector orientation with respect to the robot base. Returns: Current TCP orientation in the robot base frame.

getPose()

Signature
Get the current end effector pose (position and orientation) in the robot base frame. Returns: Current Tool-Center-Point (TCP) pose.

getPosition()

Signature
Get the current end effector position with respect to the robot base (meters). Returns: Current TCP position in the robot base frame.

getState()

Signature
Get a live state snapshot of this component’s tree. Recursive walk owned by the base class, following the lifecycle template: each class contributes only the protected local hook _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 &#123;"left_arm": &#123;"joint_positions": ...&#125;, "right_arm": &#123;...&#125;&#125;, 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 — &#123;"error": "&lt;ExceptionType>: &lt;message>"&#125;, 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 &#123;"error": "..."&#125; 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.
Returns: The nested state snapshot when 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
Close the gripper to grasp an object. Closes at the gripper’s maximum force and speed (gripper.params()) and blocks until the fingers stop, either fully closed or on an object. Check getEndEffectorGraspDetected to tell the two apart. Raises: RuntimeError: If no gripper is configured, or the fingers do not stop before the deadline.

moveToDeltaPose()

Signature
Offset the robot end effector by the specified delta pose from its current pose (with respect to the base frame).
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
Move the arm to its predefined home pose.
default:"True"
Wait for movement to complete.
default:"2.0"
Total duration of the move (seconds).
default:"0.75"
Time spent accelerating and decelerating (seconds). Clamped to at most moving_time / 2.
Raises: RobotFault: If the controller reports a fault before or during the move. RuntimeError: If a blocking move stops short of the target or does not arrive before its deadline.

moveToNamedPose()

Signature
Move the arm to the joint angles of a named pose.
required
Name of the pose to move to (case-insensitive).
default:"True"
Wait for movement to complete.
default:"2.0"
Total duration of the move (seconds).
default:"0.75"
Time spent accelerating and decelerating (seconds). Clamped to at most moving_time / 2.
Raises: ValueError: If pose_name is not in named_poses. RobotFault: If the controller reports a fault before or during the move. RuntimeError: If a blocking move stops short of the target or does not arrive before its deadline.

moveToPose()

Signature
Move the robot end-effector to a specified pose. If high_frequency is False, a trapezoidal profile is planned from moving_time and accel_time, capped by the linear and angular speed and acceleration limits. A blocking move waits until the TCP is within 1 mm and 5 mrad of the target and at rest. If high_frequency is True, the target is sent at the speed caps without waiting, for a caller streaming targets from a control loop.
required
Target pose (position in meters, orientation as a unit quaternion) in the robot’s base frame.
default:"True"
Wait for movement to complete. Ignored when high_frequency is True; always waits when avoid_force is True.
default:"False"
If False, send one discrete move with a planned profile. Otherwise, send the target for streaming and return immediately.
default:"2.0"
Seconds to complete the movement. Speed caps can make the move take longer; the move is then logged as clamped.
default:"0.5"
Seconds to spend accelerating in a trapezoidal motion profile. Clamped to at most moving_time / 2.
default:"False"
Monitor the TCP contact force during the move and stop the arm when it exceeds its pre-move baseline by more than force_threshold. The arm holds where it stopped, which can leave it pressing on the contact; back off in the caller if that matters.
default:"10.0"
Contact force increase, in Newtons, that stops an avoid_force move.
Raises: ValueError: If moving_time, accel_time or force_threshold are not positive, or if avoid_force is combined with high_frequency. TypeError: If moving_time, accel_time or force_threshold are not numbers. ForceThresholdExceeded: If an avoid_force move stopped on contact. RobotFault: If the controller reports a fault before or during the move; start() clears it. RuntimeError: If a blocking move stops short of the target (e.g. an unreachable pose) or does not arrive before its deadline.

release()

Signature
Open the gripper to release an object. Opens to the maximum width at the gripper’s maximum force and speed and blocks until the fingers stop. Raises: RuntimeError: If no gripper is configured, or the fingers stop short of fully open or do not stop before the deadline.

removeNamedPose()

Signature
Remove a named pose from the dictionary of pose_name:joint_angles pairs.
required
Name of the pose to remove (case-insensitive)
Returns: list: Joint angles (radians) of the named pose that was removed, or None if the named pose did not exist

setJointAngles()

Signature
Set joint angles in radians. Commands the arm to move its joints to the specified angles. If high_frequency is False: a trapezoidal motion profile is generated (ending with zero velocity) with the given moving_time and accel_time, capped by max_joint_speed and max_joint_acceleration, and the robot’s internal motion generator smoothens and executes the motion. A blocking move waits until the joints are within 2 mrad of the target and at rest. If high_frequency is True: the target is sent without waiting, for a caller streaming targets from a ~1-100 Hz control loop (e.g. a Vision-Language-Action model). The robot’s motion generator interpolates between targets at the configured speed caps, so large jumps between consecutive targets move at those caps.
required
List of target joint angles in radians, starting with the base joint.
default:"True"
Wait for movement to complete. Ignored when high_frequency is True; always waits when avoid_force is True.
default:"False"
If False, send one discrete move with a planned profile. Otherwise, send the target for streaming and return immediately.
default:"2.0"
Seconds to complete the movement. Speed caps can make the move take longer; the move is then logged as clamped.
default:"0.5"
Seconds to accelerate from zero to full velocity (another accel_time is needed to decelerate to zero). Clamped to at most moving_time / 2.
default:"False"
Monitor the TCP contact force during the move and stop the arm when it exceeds its pre-move baseline by more than force_threshold. The arm holds where it stopped, which can leave it pressing on the contact; back off in the caller if that matters.
default:"10.0"
Contact force increase, in Newtons, that stops an avoid_force move.
Raises: ValueError: If the angles do not match the joint count or the joint limits, if moving_time, accel_time or force_threshold are not positive, or if avoid_force is combined with high_frequency. TypeError: If moving_time, accel_time or force_threshold are not numbers. ForceThresholdExceeded: If an avoid_force move stopped on contact. RobotFault: If the controller reports a fault before or during the move; start() clears it. RuntimeError: If a blocking move stops short of the target or does not arrive before its deadline.

startFreeDrive()

Signature
Enable free-drive (hand-guided) mode. The arm becomes compliant and can be moved by hand while supporting its own weight. Position-control commands such as 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
Halt all motion across this component’s tree (soft e-stop). Recursive walk owned by the base class: every subcomponent is stopped first (children before their parent, leaf-to-root; siblings in 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
Check whether the end effector is currently holding an object. Thin wrapper that delegates to the configured end effector’s 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 as robot.<property>; each read runs the getter on the robot.
Optional[str]
The controller’s current control mode, e.g. "NRT_JOINT_POSITION" or "IDLE".Read live from the controller, so a stop or fault shows as "IDLE". Driver-owned: it changes only through the motion API. None before start().
Optional[str]
Flexiv Elements name of the configured gripper, or None when there is none.
list[float]
Joint angles (radians) with the arm over the workspace, joints at 90 degrees.
float
Cap applied to commanded TCP angular acceleration, in rad/s^2.Writable; must be finite and > 0.
float
Cap applied to commanded TCP angular speed, in rad/s.Writable; must be finite and > 0.
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 TCP linear acceleration, in m/s^2.Writable; must be finite and > 0.
float
Cap applied to commanded TCP linear speed, in m/s. Writable; must be finite and > 0.
Dict[str, List[float]]
Registered poses as &#123;name: joint angles in radians&#125; (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 the EndEffector interface’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 that robot.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).
The contract these methods implement is Robot interface; values returned are grid-types (camera reads return Image — call decode() for an ndarray). You reach the robot through make_robot.