Grasping by the concavities in a silhouette
A parallel jaw wants two opposing surfaces. For a handle or a rod, the pair is
implied by the long axis and grasping-linear-feature finds it. For a part with
no long axis — a pair of pliers, a spur gear, a wire spool, a bulb socket — the
opposing surfaces are the waists: the places where the outline turns inward.
This skill finds them directly.
What the script does
- Projects the segmented cloud to the (x, y) plane the part is seen from.
- Builds the alpha shape of that projection — a Delaunay triangulation
filtered to triangles whose circumradius is under
alpha_radius, whose boundary is the part's real outline rather than its hull. - Walks that boundary and keeps the reflex vertices, where it turns inward. Consecutive reflex vertices are one run; each run's centroid is one candidate pad site.
- Pairs the candidates, keeps the pairs whose secant fits the gripper's span, and builds a straight-down pose centred on each pair's midpoint with the jaws closing along the secant.
- Ranks by confidence and returns the best, with the rest in
candidatesso a caller that fails one can try the next without recomputing.
Where it fits
It is a proposer that also poses: it returns grasp_pose and pregrasp_pose
directly rather than handing a list to a selector. Put verifying-grasps after
it — this skill exits posed with the hand open and does not close it — and
route failed to whatever recovery the graph has, because a part whose
silhouette has no fitting pair of waists is one this skill genuinely cannot take.
A sensible arrangement is to try grasping-linear-feature first and fall through
to this on failed: most parts have an axis, and the ones that do not are
exactly the ones this skill is for.


