placing-held-feature
SkillDev toolsMove a held object so one of its declared features lands on a
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the placing-held-feature skill
What this skill tells your AI
The instructions your AI receives, as published by graph-robots/open-robot-skills in skills/placing-held-feature/SKILL.md and read by ahel’s review.
The place stage's geometry: where must the hand be so that the thing it is holding arrives where the goal wants it.
Why this is its own skill
Grasping has a whole ladder of strategies and placing had none, which is backwards for any goal phrased as a relation between a held object's feature and a fixture. The composition is small and the mistake is not:
feature_now = object_position + R(object_rotation) · feature_local
move = target − feature_now
hand_goal = hand_now + move
Without it the obvious move is to drive the hand at the target, and that is wrong by the length of the tool. It fails as a refusal rather than as a miss, so it reads like an unreachable workspace rather than a mis-specified goal — a diagnosis that costs iterations, because the fix it suggests (try the other arm, give up on the target) is not the fix.
When to use
- A goal written as object.feature at fixture.feature or in a region: a loop over a rod, a shaft into a hole, a plug at a bore.
- Any time the held object is large relative to the hand.
When NOT to use
- To orient. This translates only; turn first, then mate.
- Before the object is held. It reads the object's live pose, which before a grasp is wherever it is lying.
Recommended subgraph state flow
locate → orient → mate → plan → execute → verify
locate— the target point. For a welded fixture with no body and no OBB, that issim.queryon the goal's own atom and refs; itsatis the feature's world position.orient— turn the held object so the mating axis lines up, as a lockedmotion.plan_jointat the current position. Transit first, then turn.mate—script: scripts/<sg>/mate_feature.py. Route onroute.plan/execute—motion.plan_linear(end=Ref("mate.hand_goal"), orientation="lock")thenrobot.execute_trajectory. Locked, because the orientation you turned to is the one that must survive the move.verify— re-runmateand readdistance_m. Shrinking means the round worked; flat means the move is not being executed as planned.
Use stop_short_axis/stop_short_m when the fixture is mounted flush to a
board: close the two free axes fully and stop short on the board's normal, so
the approach does not drive the load into the mounting.
Required end states
| End state | Meaning |
|---|---|
ready | hand_goal, move_m, feature_now, distance_m. |
unknown | A pose or point could not be read. Nothing moved; fix the inputs. |
Signals
- GitHub stars
- 41
- Forks
- 7
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
placing-held-feature- Source
- github.com/graph-robots/open-robot-skills