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 beforeexecute() starts:
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 tobase_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
Passblock=False to return as soon as the command is accepted, then join with wait():
wait() 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: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
Thepose property returns the live end-effector pose as a typed Arm value:
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.
Head
Control camera tilt:Methods
Tilt Angles
Example: Wave
A skill that waves the arm, withguidelines() written out explicitly:

