Skip to main content
The Galaxea R1 Pro Mobile Manipulator as GRID drives it — what this robot actually implements, with the signatures it actually accepts. 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 GalaxeaR1Pro. 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
Register a named pose, replacing any entry of the same name.
required
Case-insensitive name to register the pose under.
required
Joint angles in radians per joint group ("left_arm", "right_arm", "base"); a group may be omitted to leave that group where it is.
Raises: ValueError: If joint_angles names a group this robot does not have.

getBatteryState()

Signature
Get battery state (voltage, current, capacity). Delegates to GalaxeaR1ProBase.

getIMU()

Signature
Get IMU data for "chassis" or "torso". Delegates to GalaxeaR1ProBase.

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 joint angles.
If provided, return joint angles for that subcomponent only (as a flat list[float]). If None (default), return a dict mapping every subcomponent name to its joint angles.
Returns: list[float] when group is given, otherwise dict[str, list[float]]. Raises: KeyError: If group is not a known subcomponent.
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

getOrientation()

Signature
Get the chassis orientation in world frame. Chassis orientation is calculated from accumulated LiDAR-IMU odometry, with the origin at the robot’s initial orientation on startup. Delegates to GalaxeaR1ProBase. Raises: RuntimeError: If no odometry data has been received yet.

getPosition()

Signature
Get the chassis position in world frame. Chassis position is calculated from accumulated LiDAR-IMU odometry, with the origin at the robot’s initial position on startup. Delegates to GalaxeaR1ProBase. Raises: RuntimeError: If no odometry data has been received yet.

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.

moveByVelocity()

Signature
Command chassis velocity. Delegates to GalaxeaR1ProBase.moveByVelocity. The velocity is republished at 50 Hz until stop is called, or until duration seconds have elapsed.
required
Linear velocity in m/s (body frame).
required
Angular velocity in rad/s.
default:"'body'"
Reference frame for the velocity. Only "body" is supported; any other value (including "world") raises.
default:"1.0"
Maximum time in seconds to hold the velocity command. Pass None to republish indefinitely until stop().
Raises: ValueError: If frame is not "body".

moveToNamedPose()

Signature
Move arms and torso to a named pose. Available poses are stored in named_poses. Built-in poses:
  • "home" — upright with elbows bent 90°.
  • "rest" — upright with arms straight (all joints zero).
  • "sleep" — torso folded down, elbows bent.
required
Case-insensitive pose name (e.g. "home", "sleep").
Raises: ValueError: If the pose name is not recognised.

moveToPose()

Signature
Drive the chassis to a target pose. Delegates to GalaxeaR1ProBase.moveToPose. See that method for full documentation of the PI controller and its parameters. !!! note The world frame origin is the robot’s position and heading at startup. When frame is "world", coordinates are absolute in that odometry frame. When frame is "body", the target pose is interpreted as a delta relative to the current pose at the time of the call.
required
Target pose. Only position.x, position.y, and the yaw component (rotation about Z) of orientation are used; z, roll, and pitch are ignored. Interpretation depends on frame: absolute world-frame coordinates when "world", or a body-frame delta (dx forward, dy left, dyaw) when "body".
default:"True"
This move always blocks until convergence or timeout; passing blocking=False logs a warning. Defaults to True.
default:"'world'"
Reference frame for the target — "world" (default) for an absolute pose, or "body" for a delta relative to the current pose.
default:"0.05"
Position convergence threshold in meters.
default:"0.05"
Yaw convergence threshold in radians.
default:"0.5"
Maximum linear velocity magnitude in m/s.
default:"1.0"
Maximum angular velocity magnitude in rad/s.
default:"1.0"
Proportional gain for XY position error.
default:"0.1"
Integral gain for XY position error.
default:"2.0"
Proportional gain for yaw error.
default:"0.2"
Integral gain for yaw error.
default:"0.2"
Maximum fraction of max speed that the integral term can contribute (0.0 to 1.0). Limits windup so the integral handles steady-state error without causing overshoot on longer drives.
default:"30.0"
Maximum time in seconds before the controller gives up.
Raises: ValueError: If frame is not "world" or "body". RuntimeError: If no odometry data is available, or if timeout is exceeded before convergence.

setBrakeMode()

Signature
Engage or disengage the chassis brake. Delegates to GalaxeaR1ProBase.

setJointAngles()

Signature
Set joint angles. Can be called in two ways:
  • Multi-group (default): pass a dict mapping group names to angle lists. velocities may also be a dict.
  • Single-group: pass a flat list of angles together with group="&lt;name>". velocities may also be a flat list. This matches the Arm / Humanoid / Quadruped signature.
required
Target joint angles in radians — a dict for multi-group or a list for single-group.
Optional joint velocities. In single-group mode, a list or scalar. In multi-group mode, a dict mapping group names to velocity lists/scalars (partial dicts OK — omitted groups get no velocity), a single scalar (broadcast to every group being commanded), or None.
Subcomponent name. Required when angles is a list.
Raises: KeyError: If a group name is not a known subcomponent. TypeError: If angles is a list but group is not provided, or if velocities is a list in multi-group mode.
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.

Properties on the robot

Read as robot.<property>; each read runs the getter on the robot.
Dict[str, Dict[str, List[float]]]
Registered poses as &#123;name: &#123;joint group: angles in radians&#125;&#125; (a copy).Mutating the returned mapping does not change what the robot knows: register entries with addNamedPose, or assign a whole mapping to replace them all.

robot.head_camera_left and 10 more — camera

Reached as any of robot.head_camera_left, robot.head_camera_right, robot.wrist_left, robot.wrist_right, robot.chassis_front_left, robot.chassis_front_right, robot.chassis_left, robot.chassis_right, robot.chassis_rear, robot.wrist_left_depth, robot.wrist_right_depth; each is a R1ProCamera and its methods are R1ProCamera’s and run on the robot. Below, <camera> stands for any one of those names. Camera sensor bridging a ROS 2 image topic to the GRID Camera interface. Methods inherited from the component base are shown in brief here; their full descriptions are under Methods on the robot above.

<camera>.getCameraExtrinsics()

Signature
Get the extrinsic parameters for the camera.

<camera>.getCameraIntrinsics()

Signature
Get the intrinsic parameters for the camera.

<camera>.getCameraSettings()

Signature
Get the camera settings.

<camera>.getData()

Signature
Get the image from the camera.

<camera>.getImage()

Signature
Return the latest image, or None if no message has arrived yet. ROS CompressedImage topics already carry JPEG/PNG bytes. By default we pass those through unchanged (~30x bandwidth saving over decoding to an ndarray here); pass compressed=False to get a decoded RGB ndarray instead. Unknown compressed formats always fall back to the OpenCV decode path. Raw depth messages (32FC1, 16UC1) are converted to numpy arrays — the compressed flag has no effect on depth.
bool, optional
default:"True"
when True (default) and the ROS message is a JPEG/PNG CompressedImage, return the bytes via Image(..., encoding_format=...). When False, always decode to an RGB ndarray.

<camera>.getState()

Signature
Get a live state snapshot of this component’s tree.

<camera>.recordCalibration()

Signature
Install a recorded extrinsic calibration on this camera in place.

<camera>.reloadCalibration()

Signature
Re-read this camera’s calibration from the robot’s config and install it.

<camera>.setCameraExtrinsics()

Signature
Set the extrinsic parameters for the camera.

<camera>.setCameraIntrinsics()

Signature
Set the intrinsic parameters for the camera.

<camera>.setCameraSettings()

Signature
Set the camera settings.

<camera>.stop()

Signature
Halt all motion across this component’s tree (soft e-stop).

robot.left_arm — arm

Reached as robot.left_arm; its methods are GalaxeaR1ProArm’s and run on the robot. Control one 7-DOF arm of the Galaxea R1Pro via ROS 2. Methods inherited from the component base are shown in brief here; their full descriptions are under Methods on the robot above.

left_arm.addNamedPose()

Signature
Define a pose_name:joint_angles pair in the dictionary of named poses

left_arm.getEndEffectorPose()

Signature

left_arm.getGripperPosition()

Signature
Get the current gripper position. Returns: Gripper position where 0 is fully closed and 100 is fully open. Raises: RuntimeError: If no gripper feedback has been received yet.

left_arm.getImage()

Signature
Return the image of camera.

left_arm.getJointAngles()

Signature
Get current joint angles for all 7 arm joints. Returns: Joint angles in radians, ordered joint1 through joint7. Raises: RuntimeError: If no arm joint state feedback has been received yet.

left_arm.getLidarPointCloud()

Signature
Get a point cloud from the named LiDAR sensor.

left_arm.getNamedPose()

Signature
Get the list of joint angles corresponding to a named pose.

left_arm.getOrientation()

Signature
Get the end-effector orientation (delegates to getPose).

left_arm.getPose()

Signature
Get the current end-effector pose. Returns: The end-effector pose in the torso_link4 frame (+X forward, +Y left, +Z up). Returns an identity pose (origin, no rotation) if no feedback has been received yet. .. note:: The orientation quaternion represents the rotation of the gripper_link frame relative to torso_link4. The gripper_link axes are fixed to the gripper body:
  • +X — up the wrist (toward the wrist camera)
  • +Y — left across the gripper plane
  • +Z — out through the back of the gripper (opposite the opening)
At identity (0, 0, 0, 1) the two frames are aligned, so gripper +Z (out the back) coincides with torso +Z (up), meaning the gripper opening faces straight down. This corresponds to the arms hanging relaxed at the robot’s sides. At the home pose the orientation is approximately (0, -0.71, 0, 0.71) (-90° pitch about Y), which rotates the gripper opening to face forward (+X in torso_link4). The feedback frame is decided by the vendor stack installed on the unit: legacy stacks report in torso_link4, newer Galaxea (MOCA-generation) stacks report in base_link. Feedback whose frame_id is neither empty nor torso_link4 is re-expressed into torso_link4 through a live tf2 lookup before being returned, so the returned pose is always torso_link4 regardless of the unit’s stack generation. Raises: RuntimeError: If feedback reports a frame other than torso_link4 and no transform into torso_link4 is available on /tf to re-express it — returning the raw numbers would silently mis-place the end effector by the (posture-dependent) offset between the two frames.

left_arm.getPosition()

Signature
Get the end-effector position (delegates to getPose).

left_arm.getState()

Signature
Get a live state snapshot of this component’s tree.

left_arm.grasp()

Signature
Close the gripper to closed_position.

left_arm.moveToDeltaPose()

Signature
Offset the robot end effector by the specified delta pose from its current pose

left_arm.moveToHome()

Signature
Move the arm to its predefined home pose.

left_arm.moveToNamedPose()

Signature
Move the robot to the joint angles of a named pose.

left_arm.moveToPose()

Signature
Command the arm to a Cartesian pose via interpolated steps. Breaks the movement into small steps (linear position interpolation, spherical orientation interpolation) and waits for the IK solver to converge at each step before advancing. This compensates for the relaxed IK solver’s tendency to undershoot on large displacements. The pose is an absolute transform of gripper_link expressed in the torso_link4 frame (the pelvis / top of the torso linkage). The torso_link4 coordinate frame follows the convention:
  • +X = forward (away from the robot’s chest)
  • +Y = left (from the robot’s perspective)
  • +Z = up
The orientation quaternion represents the rotation of the gripper_link frame relative to torso_link4. The gripper_link axes are fixed to the gripper body:
  • +X — up the wrist (toward the wrist camera)
  • +Y — left across the gripper plane
  • +Z — out through the back of the gripper (opposite the opening)
At identity (0, 0, 0, 1) the two frames are aligned, so gripper +Z (out the back) coincides with torso +Z (up), meaning the gripper opening faces straight down. This corresponds to the arms hanging relaxed at the robot’s sides. At the home pose the orientation is approximately (0, -0.71, 0, 0.71) (-90° pitch about Y), which rotates the gripper opening to face forward (+X in torso_link4). At rest the left gripper is at roughly (0.0, +0.25, -0.43) and the right at (0.0, -0.25, -0.43). At home, roughly (0.42, +0.25, -0.01) and (0.42, -0.25, -0.01). !!! note Requires the relaxed IK nodes to be running (r1_pro_left_arm_relaxed_ik_launch.py / r1_pro_right_arm_relaxed_ik_launch.py). Without them the command topic has no subscribers and nothing will happen. See r1pro-ik.service for an auto-start systemd unit.
required
Absolute target pose (position in meters, orientation as a quaternion (x, y, z, w)) in the torso_link4 frame.
default:"True"
This move always blocks until convergence or timeout; passing blocking=False logs a warning. Defaults to True.
default:"2.0"
Unused — accepted for interface compatibility.
default:"0.5"
Unused — accepted for interface compatibility.
default:"0.02"
Maximum position displacement per interpolation step in meters.
default:"5.0"
Maximum orientation displacement per step in degrees.
default:"0.01"
Position convergence threshold in meters. The step is considered reached when the EE is within this distance of the target.
default:"3.0"
Orientation convergence threshold in degrees (geodesic quaternion distance).
default:"0.3"
Maximum seconds to wait for convergence at each interpolation step before advancing. If an intermediate step times out, a warning is logged and the next step is attempted (the IK solver may still converge from the nearby pose).
default:"10.0"
Maximum total seconds for the entire motion.
Raises: RuntimeError: If the overall timeout is exceeded, or if the final interpolation step does not converge within step_timeout — in either case the arm will be somewhere along the interpolated path but not at the requested target. Also raised before any motion if EE feedback reports a frame other than torso_link4 that cannot be re-expressed via tf2 (no /tf transform available): commanding interpolated targets computed from a mis-framed current pose would move the arm to unintended positions.

left_arm.release()

Signature
Open the gripper to open_position.

left_arm.removeNamedPose()

Signature
Remove a named pose from the dictionary of pose_name:joint_angles pairs.

left_arm.setGripperPosition()

Signature
Set the gripper position.
required
Target position in the range [0, 100] where 0 is fully closed and 100 is fully open.

left_arm.setJointAngles()

Signature
Publish target joint angles for the arm.
required
Target joint angles in radians. A scalar is broadcast to all 7 joints; a list or np.ndarray must have length 7.
default:"False"
Not honored. This method publishes the target and returns immediately; passing blocking=True logs a warning. The Galaxea controller handles trajectory timing. Defaults to False.
default:"2.0"
Unused — accepted for interface compatibility.
default:"0.5"
Unused — accepted for interface compatibility.
Optional joint velocities in rad/s. A scalar is broadcast to all 7 joints. !!! note blocking, moving_time, and accel_time are accepted for compatibility with the base Arm interface but have no effect. The Galaxea motion controller handles trajectory timing internally.

left_arm.stop()

Signature
Halt all motion across this component’s tree (soft e-stop).

left_arm.validateGrasp()

Signature
Check whether the end effector is currently holding an object.

robot.right_arm — arm

Reached as robot.right_arm; its methods are GalaxeaR1ProArm’s and run on the robot. Control one 7-DOF arm of the Galaxea R1Pro via ROS 2. Methods inherited from the component base are shown in brief here; their full descriptions are under Methods on the robot above.

right_arm.addNamedPose()

Signature
Define a pose_name:joint_angles pair in the dictionary of named poses

right_arm.getEndEffectorPose()

Signature

right_arm.getGripperPosition()

Signature
Get the current gripper position. Returns: Gripper position where 0 is fully closed and 100 is fully open. Raises: RuntimeError: If no gripper feedback has been received yet.

right_arm.getImage()

Signature
Return the image of camera.

right_arm.getJointAngles()

Signature
Get current joint angles for all 7 arm joints. Returns: Joint angles in radians, ordered joint1 through joint7. Raises: RuntimeError: If no arm joint state feedback has been received yet.

right_arm.getLidarPointCloud()

Signature
Get a point cloud from the named LiDAR sensor.

right_arm.getNamedPose()

Signature
Get the list of joint angles corresponding to a named pose.

right_arm.getOrientation()

Signature
Get the end-effector orientation (delegates to getPose).

right_arm.getPose()

Signature
Get the current end-effector pose. Returns: The end-effector pose in the torso_link4 frame (+X forward, +Y left, +Z up). Returns an identity pose (origin, no rotation) if no feedback has been received yet. .. note:: The orientation quaternion represents the rotation of the gripper_link frame relative to torso_link4. The gripper_link axes are fixed to the gripper body:
  • +X — up the wrist (toward the wrist camera)
  • +Y — left across the gripper plane
  • +Z — out through the back of the gripper (opposite the opening)
At identity (0, 0, 0, 1) the two frames are aligned, so gripper +Z (out the back) coincides with torso +Z (up), meaning the gripper opening faces straight down. This corresponds to the arms hanging relaxed at the robot’s sides. At the home pose the orientation is approximately (0, -0.71, 0, 0.71) (-90° pitch about Y), which rotates the gripper opening to face forward (+X in torso_link4). The feedback frame is decided by the vendor stack installed on the unit: legacy stacks report in torso_link4, newer Galaxea (MOCA-generation) stacks report in base_link. Feedback whose frame_id is neither empty nor torso_link4 is re-expressed into torso_link4 through a live tf2 lookup before being returned, so the returned pose is always torso_link4 regardless of the unit’s stack generation. Raises: RuntimeError: If feedback reports a frame other than torso_link4 and no transform into torso_link4 is available on /tf to re-express it — returning the raw numbers would silently mis-place the end effector by the (posture-dependent) offset between the two frames.

right_arm.getPosition()

Signature
Get the end-effector position (delegates to getPose).

right_arm.getState()

Signature
Get a live state snapshot of this component’s tree.

right_arm.grasp()

Signature
Close the gripper to closed_position.

right_arm.moveToDeltaPose()

Signature
Offset the robot end effector by the specified delta pose from its current pose

right_arm.moveToHome()

Signature
Move the arm to its predefined home pose.

right_arm.moveToNamedPose()

Signature
Move the robot to the joint angles of a named pose.

right_arm.moveToPose()

Signature
Command the arm to a Cartesian pose via interpolated steps. Breaks the movement into small steps (linear position interpolation, spherical orientation interpolation) and waits for the IK solver to converge at each step before advancing. This compensates for the relaxed IK solver’s tendency to undershoot on large displacements. The pose is an absolute transform of gripper_link expressed in the torso_link4 frame (the pelvis / top of the torso linkage). The torso_link4 coordinate frame follows the convention:
  • +X = forward (away from the robot’s chest)
  • +Y = left (from the robot’s perspective)
  • +Z = up
The orientation quaternion represents the rotation of the gripper_link frame relative to torso_link4. The gripper_link axes are fixed to the gripper body:
  • +X — up the wrist (toward the wrist camera)
  • +Y — left across the gripper plane
  • +Z — out through the back of the gripper (opposite the opening)
At identity (0, 0, 0, 1) the two frames are aligned, so gripper +Z (out the back) coincides with torso +Z (up), meaning the gripper opening faces straight down. This corresponds to the arms hanging relaxed at the robot’s sides. At the home pose the orientation is approximately (0, -0.71, 0, 0.71) (-90° pitch about Y), which rotates the gripper opening to face forward (+X in torso_link4). At rest the left gripper is at roughly (0.0, +0.25, -0.43) and the right at (0.0, -0.25, -0.43). At home, roughly (0.42, +0.25, -0.01) and (0.42, -0.25, -0.01). !!! note Requires the relaxed IK nodes to be running (r1_pro_left_arm_relaxed_ik_launch.py / r1_pro_right_arm_relaxed_ik_launch.py). Without them the command topic has no subscribers and nothing will happen. See r1pro-ik.service for an auto-start systemd unit.
required
Absolute target pose (position in meters, orientation as a quaternion (x, y, z, w)) in the torso_link4 frame.
default:"True"
This move always blocks until convergence or timeout; passing blocking=False logs a warning. Defaults to True.
default:"2.0"
Unused — accepted for interface compatibility.
default:"0.5"
Unused — accepted for interface compatibility.
default:"0.02"
Maximum position displacement per interpolation step in meters.
default:"5.0"
Maximum orientation displacement per step in degrees.
default:"0.01"
Position convergence threshold in meters. The step is considered reached when the EE is within this distance of the target.
default:"3.0"
Orientation convergence threshold in degrees (geodesic quaternion distance).
default:"0.3"
Maximum seconds to wait for convergence at each interpolation step before advancing. If an intermediate step times out, a warning is logged and the next step is attempted (the IK solver may still converge from the nearby pose).
default:"10.0"
Maximum total seconds for the entire motion.
Raises: RuntimeError: If the overall timeout is exceeded, or if the final interpolation step does not converge within step_timeout — in either case the arm will be somewhere along the interpolated path but not at the requested target. Also raised before any motion if EE feedback reports a frame other than torso_link4 that cannot be re-expressed via tf2 (no /tf transform available): commanding interpolated targets computed from a mis-framed current pose would move the arm to unintended positions.

right_arm.release()

Signature
Open the gripper to open_position.

right_arm.removeNamedPose()

Signature
Remove a named pose from the dictionary of pose_name:joint_angles pairs.

right_arm.setGripperPosition()

Signature
Set the gripper position.
required
Target position in the range [0, 100] where 0 is fully closed and 100 is fully open.

right_arm.setJointAngles()

Signature
Publish target joint angles for the arm.
required
Target joint angles in radians. A scalar is broadcast to all 7 joints; a list or np.ndarray must have length 7.
default:"False"
Not honored. This method publishes the target and returns immediately; passing blocking=True logs a warning. The Galaxea controller handles trajectory timing. Defaults to False.
default:"2.0"
Unused — accepted for interface compatibility.
default:"0.5"
Unused — accepted for interface compatibility.
Optional joint velocities in rad/s. A scalar is broadcast to all 7 joints. !!! note blocking, moving_time, and accel_time are accepted for compatibility with the base Arm interface but have no effect. The Galaxea motion controller handles trajectory timing internally.

right_arm.stop()

Signature
Halt all motion across this component’s tree (soft e-stop).

right_arm.validateGrasp()

Signature
Check whether the end effector is currently holding an object.

robot.base — mobile base

Reached as robot.base; its methods are GalaxeaR1ProBase’s and run on the robot. Control the Galaxea R1Pro chassis and 4-DOF torso via ROS 2. Methods inherited from the component base are shown in brief here; their full descriptions are under Methods on the robot above.

base.getBatteryState()

Signature
Get battery state from the BMS. Returns: A dict with keys "voltage" (V), "current" (A), and "capacity" (%). Returns zeros if the BMS topic is unavailable or no message has been received yet.

base.getIMU()

Signature
Get IMU data from the chassis or torso IMU.
default:"'chassis'"
"chassis" or "torso".
Returns: A dict with keys "linear_acceleration", "angular_velocity", and "orientation", each containing x, y, z (and w for orientation) float values. Returns zeros / identity if no feedback has been received yet. Raises: ValueError: If sensor is not "chassis" or "torso".

base.getImage()

Signature
Return the image of camera.

base.getJointAngles()

Signature
Get current joint angles for the 4-DOF torso linkage. Returns: Joint angles in radians. Raises: RuntimeError: If no torso joint state feedback has been received yet.

base.getLidarPointCloud()

Signature
Get a point cloud from the named LiDAR sensor.

base.getOrientation()

Signature
Get the chassis orientation in world frame. Orientation is calculated from accumulated LiDAR-IMU odometry, with the origin at the robot’s initial orientation on startup. Returns: Orientation as a quaternion (x, y, z, w). Raises: RuntimeError: If no odometry data has been received yet.

base.getPosition()

Signature
Get the chassis position in world frame. Position is calculated from accumulated LiDAR-IMU odometry, with the origin at the robot’s initial position on startup. Returns: Position in the world frame (meters). Raises: RuntimeError: If no odometry data has been received yet.

base.getState()

Signature
Get a live state snapshot of this component’s tree.

base.moveByVelocity()

Signature
Command chassis velocity. The command is republished at 50 Hz until a new command (including stop) is received, or until duration seconds have elapsed.
required
Body-frame linear velocity in m/s.
required
Body-frame angular velocity in rad/s (only the z component is used for yaw).
default:"'body'"
Reference frame for the velocity. Only "body" is supported; any other value (including "world") raises.
default:"1.0"
Maximum time in seconds to hold the velocity command. Pass None to republish indefinitely until stop().
Raises: ValueError: If frame is not "body".

base.moveToPose()

Signature
Drive the chassis to a target pose using a PI controller. Commands body-frame velocities via moveByVelocity in a closed loop, reading the current pose from the accumulated LiDAR-IMU odometry. The controller runs at _CMD_RATE_HZ Hz and stops when the position and yaw errors are both within their respective thresholds, or when timeout is exceeded. Only the yaw component of the pose’s orientation is used — the chassis cannot control roll or pitch. !!! note The world frame origin is the robot’s position and heading at startup. When frame is "world", coordinates are absolute in that odometry frame. When frame is "body", the target pose is interpreted as a delta relative to the current pose at the time of the call. !!! warning Large yaw targets (more than roughly 10° from the current heading) can exhibit hunting — limit-cycle oscillation around the target yaw — under certain conditions, notably delayed or stale odometry feedback. The move may then converge slowly or hit timeout. A runtime warning is emitted when the initial yaw error exceeds 10°. To mitigate, split the rotation into smaller increments, lower kp_angular, or raise timeout.
required
Target pose. Only position.x, position.y, and the yaw component (rotation about Z) of orientation are used; z, roll, and pitch are ignored. Interpretation depends on frame: absolute world-frame coordinates when "world", or a body-frame delta (dx forward, dy left, dyaw) when "body".
default:"True"
This move always blocks until convergence or timeout; passing blocking=False logs a warning. Defaults to True.
default:"'world'"
Reference frame for the target — "world" (default) for an absolute pose, or "body" for a delta relative to the current pose.
default:"0.05"
Position convergence threshold in meters.
default:"0.05"
Yaw convergence threshold in radians.
default:"0.5"
Maximum linear velocity magnitude in m/s.
default:"1.0"
Maximum angular velocity magnitude in rad/s.
default:"1.0"
Proportional gain for XY position error.
default:"0.1"
Integral gain for XY position error.
default:"2.0"
Proportional gain for yaw error.
default:"0.2"
Integral gain for yaw error.
default:"0.2"
Maximum fraction of max speed that the integral term can contribute (0.0 to 1.0). Limits windup so the integral handles steady-state error without causing overshoot on longer drives.
default:"30.0"
Maximum time in seconds before the controller gives up.
Raises: ValueError: If frame is not "world" or "body". RuntimeError: If no odometry data is available (localization node not running), or if timeout is exceeded before convergence.

base.setBrakeMode()

Signature
Engage or disengage the chassis brake.
required
True to engage the brake, False to release.

base.setJointAngles()

Signature
Set torso joint angles.
required
Target joint angles in radians. A scalar is broadcast to all 4 joints; a list or np.ndarray must have length 4.
default:"False"
Not honored. This method publishes the target and returns immediately; passing blocking=True logs a warning. Defaults to False.
Unused — accepted for interface compatibility.
Unused — accepted for interface compatibility.
Optional joint velocities in rad/s. A scalar is broadcast to all 4 joints. !!! note blocking, moving_time, and accel_time are accepted for compatibility with the base Wheeled interface but have no effect. The Galaxea motion controller handles trajectory timing internally.

base.stop()

Signature
Halt all motion across this component’s tree (soft e-stop).

Not implemented on this robot

Declared by the interface, raises NotImplementedError here: left_arm.endFreeDrive, left_arm.followJointTrajectory, left_arm.startFreeDrive, right_arm.endFreeDrive, right_arm.followJointTrajectory, right_arm.startFreeDrive.

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 eleven on-board cameras the R1Pro always ships with.
  • 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.
  • 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 connect.