Skip to main content
The Manipulation and Head interfaces give you direct control over the robot’s arm and head. Use these for manipulation tasks, gestures, and camera positioning.

Manipulation

Declare the interface with a class-level type annotation — it’s injected and guaranteed before execute() starts:
Every motion method blocks until the arm settles and raises on failure — no return codes to check: Import them from innate (or innate.exceptions, which groups every exception a skill raises or catches) when you want to handle them. If you don’t, the run reports FAILURE with the message, which is usually what you want:

Methods

Cartesian Control

Move the end-effector to a position and orientation (meters and radians, relative to base_link):
move_to verifies by forward kinematics that the arm actually tracked the target, recovers (servo reboot + torque on) and retries once if it didn’t, and returns the settled pose. A z shortfall usually means the fingers met the object or floor early — loosen or skip that axis with tolerance_z=None on expected-contact descents, or pass tolerance_xy=None, tolerance_z=None for a fully unverified move. move_by nudges from the arm’s measured pose rather than its last commanded one, which is what a visual-servoing loop wants:

Doing something else while the arm moves

Pass block=False to return as soon as the command is accepted, then join with wait():
A non-blocking motion is unverified until you join itwait() is what surfaces a failure. Issuing a new command supersedes a motion you never joined.

Trajectories

Sweep through several poses as one smooth motion — the arm interpolates between waypoints without decelerating at each one:
Each waypoint’s duration paces the segment that reaches it, and the trajectory starts from wherever the arm currently is.

Joint Control

Move directly to joint angles (radians):

Gripper

The claw is joint 6, driven under current-based position control: grip force is enforced in hardware, so a deep close squeezes any object at a constant, safe force.
strength is radians of preload past the closed stop, capped at GRIPPER_MAX_STRENGTH (0.6) — beyond that the servo overcurrent-trips on a real object. The strength you close with becomes the standing grip target: every following move_to / follow / 5-joint move_joints carries it automatically, so a gripped object stays gripped with no extra bookkeeping. Grip once, then move freely — you never thread a gripper= argument through a trajectory.

Reading State

The pose property returns the live end-effector pose as a typed Arm value:
For ambient arm state on a 50 Hz feed, declare arm: Arm instead — same type, pushed to you — see Robot State.

Reachability

clamp_reach(x, y) pulls a floor target into the arm’s graspable reach box; a pose IK can’t solve raises ArmFailed from move_to, so an explicit pre-check is rarely needed:

Deprecated methods

Skills written against the 0.6.0 API keep working — the old methods delegate to the new core and log a one-time deprecation warning per process: Migration is mechanical: move_to_cartesian_pose(...) → move_to(...), move_to_joint_positions(...) → move_joints(...), move_cartesian_trajectory(...) → follow([...]), open_gripper/close_gripper → gripper_open/gripper_close, get_current_end_effector_pose()/get_current_orientation_rpy() → pose. Note the new methods raise instead of returning False, and block by default. Control camera tilt:

Methods

Tilt Angles

Example: Wave

A skill that waves the arm, with guidelines() written out explicitly:

Example: LookAtObject

A skill that adjusts head to look at objects: