Skip to main content

executing-feature-mating

Executes a supplied feature-mating plan for an already-held rigid object - collision-aware planner legs tracked to millimetre precision, Cartesian servo for short corrections and fixture crossings, contact-controlled seating - then releases and retreats along the fixture axis or straight up. Use when the goal is a constrained mate such as a loop over a shaft, a shaft into an aperture, or a handle seated on a support; use transporting-objects for ordinary container drops.

Source facts

Repository
graph-robots/open-robot-skills
Last source activity
September 11, 2026 at 04:17
Detected SKILL.md language
English
Stars
58
Forks
8

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
3 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
executing-feature-mating
description
Executes a supplied feature-mating plan for an already-held rigid object - collision-aware planner legs tracked to millimetre precision, Cartesian servo for short corrections and fixture crossings, contact-controlled seating - then releases and retreats along the fixture axis or straight up. Use when the goal is a constrained mate such as a loop over a shaft, a shaft into an aperture, or a handle seated on a support; use transporting-objects for ordinary container drops.
license
Apache-2.0
compatibility
requires gap>=0.1
metadata
{"category":"motion","tags":["motion","placement","insertion","fixtures","release"]}
gap
{"requires":{"connector":["motion.plan_to_pose","motion.plan_linear","robot.move_cartesian_until_contact","robot.wait_steps","robot.describe_arm"]},"allowed_tools":["robot.get_ee_pose","robot.execute_trajectory","robot.go_to_pose_cartesian","robot.move_cartesian_until_contact","robot.open_gripper","robot.wait_steps","motion.plan_to_pose","motion.plan_linear"],"produces_outputs":{"final_pose":"Se3Pose","waypoint_count":"int","fallback_count":"int","registration_uncertainty_m":"float","released":"bool","retreat_pose":"Se3Pose"},"exit_conditions":{"seated":"The feature-mating waypoint sequence completed; the object is engaged with the fixture and still held.","released":"The gripper opened at the mate and retreated clear of the released object.","blocked":"A planner refused an engagement waypoint, or a waypoint or release motion failed before completion."},"required_inputs":{"placement_plan":"PoseSequence"},"canonical_scripts":[{"execute_placement_plan":"scripts/execute_placement_plan.py"},{"release_and_retract":"scripts/release_and_retract.py"}],"streaming":false}
Both scripts also return a report -- `waypoint_reports` (one record per waypoint) from `execute_placement_plan`, `release_report` from `release_and_retract` -- stated here rather than under `produces_outputs` because the type registry names no bare list or record. A `contact_profile` (one per object kind) overrides the executor's tolerances one key at a time; `arm_id` names the hand on a bimanual cell; `verify_cartesian` and `measure_errors` turn on the TCP re-reads that fill the reports (they are recorded tool calls and are off unless asked). `robot.describe_arm` is called only under `verify_cartesian`, to learn whether the solver honours roll. # executing-feature-mating Execute a previously computed feature-mating plan for an already-grasped rigid object, then release it. The upstream localization/planning node supplies ordered poses; this skill does not locate a fixture or compute mating poses and does not depend on object names, task names, simulator state, or evaluator predicates. Use this instead of `transporting-objects` when the goal is a constrained mate, not a drop into a volume or onto a broad surface. Examples are putting a loop over a rod, inserting a rod through a loop, or lowering a handle gap onto a support point. ## Recommended subgraphs ```text execute_placement_plan -> seated release_and_retract -> released ``` The two scripts are usually two subgraphs so the graph can settle, verify, or re-observe between engagement and release; a single subgraph running both in order is also valid. ### `execute_placement_plan` Runs `scripts/execute_placement_plan.py` with `placement_plan = Ref("in.placement_plan")`. The plan carries its collision world and attached-object spheres, and every waypoint is a typed record `{pose, mode, allow_start_contact?, allow_goal_contact?, contact_margin?}`: - `planned_joint` — collision-aware transit via `motion.plan_to_pose`. - `planned_linear` — orientation-locked straight leg via `motion.plan_linear`. - `cartesian_cross` — a short local segment across a fixture mouth, driven by the robot's Cartesian servo so an incidental touch does not stop it. - `contact_seat` — the final intended-contact leg via `robot.move_cartesian_until_contact`, which stops when the target is reached or measured TCP progress stalls. Before each planned leg the script reads `robot.get_ee_pose`: a waypoint within 1.5 mm and 2 degrees is skipped (the planner would otherwise be asked for a zero-motion problem its start-contact check can reject), and a `planned_joint` correction of at most 3 cm with matching orientation is served through `robot.go_to_pose_cartesian` rather than a fresh joint-space trajectory that can make a loosely held object slip. Larger legs are planned with up to three attempts (the sampled planner can miss a narrow corridor on one seed) and executed with a 2 mm tracking tolerance and a 60-step-per-waypoint budget. A planner refusal raises; route it through `on_error: blocked`. Output: `final_pose: Se3Pose`, the last waypoint pose. ### `release_and_retract` Runs `scripts/release_and_retract.py` with `final_pose` (the mate pose the object was released at) and, for a fixture mate, `retreat_axis: Vec3` (the fixture axis), `attached_object: AttachedObject` and `relation: string`. It opens the gripper (`open_settle_steps`, default 80), retreats and then waits `settle_steps` (default 120) so a freshly released object stops swinging before the graph reports success. - With `retreat_axis`: the retreat runs along the axis (reversed for `shaft_into_aperture`, `tip_through_aperture` and `insert_through`, where the feature went into the fixture) by `max(retract_m or 0.08, farthest attached sphere + 1 cm)` and lifts by half that distance so the open fingers clear the released object. - Without `retreat_axis`: a plain vertical retreat of `retract_m` (or 0.08 m when unset), still never less than the attached extent plus 1 cm. ## Boundaries - This skill does not infer fixture geometry or choose feature landmarks. - Do not query `sim.*`, cameras, rewards, or goal predicates inside this skill. - Preserve the waypoint order. Insertion plans encode clearance first, mating second, seating third; shortcutting between them can cross solid geometry. - Never fall back to unchecked robot motion after a collision-aware planner rejects a waypoint. - Use `transporting-objects` for bins, baskets, and unconstrained surface drops.
View on GitHub