$npx -y skills add graph-robots/open-robot-skills --skill transporting-objectsMove the currently-held object to a destination and release. The
| 1 | # transporting-objects |
| 2 | |
| 3 | The pick has happened; the gripper is holding the target. This subgraph |
| 4 | moves the held object above the destination container and releases it. |
| 5 | |
| 6 | ## When to use |
| 7 | |
| 8 | - After a successful grasp (`grasped` end state of any `grasping-*` skill). |
| 9 | - When the destination is a container with a known OBB (cup, bin, basket). |
| 10 | |
| 11 | ## When NOT to use |
| 12 | |
| 13 | - Cluttered transport paths where the lifted object risks colliding with |
| 14 | other scene objects in transit — but see the `waypoint_move_carve` |
| 15 | variant below, which routes the lift/translate through |
| 16 | `curobo.plan_with_grasped_object` against a rebuilt collision world. |
| 17 | |
| 18 | ## Recommended subgraph state flow |
| 19 | |
| 20 | Choose the flow by WHERE the object must land. |
| 21 | |
| 22 | ### Default — a walled container (basket / bin / box / tote): 2 states |
| 23 | |
| 24 | **HARD RULE — pick this path whenever the destination is a container with walls** |
| 25 | (a basket, bin, tote, box, or cup) — i.e. essentially every "put/place X **in** |
| 26 | the <container>" task. Use the 2-state `transport_move → release` flow below and |
| 27 | do **NOT** use the `compute_drop → move_above → release` drop-pose path (that |
| 28 | path releases at/above the rim for a walled container and the object misses). |
| 29 | The drop-pose path in the next section is ONLY for placing **onto** a surface or |
| 30 | into a **named sub-region**. |
| 31 | |
| 32 | The object must end up INSIDE the walls, so descend straight down into it. This |
| 33 | is the reference VAB packing recipe and needs only `container_obb`: |
| 34 | |
| 35 | ```text |
| 36 | transport_move → release |
| 37 | ``` |
| 38 | |
| 39 | - **`transport_move`** — `type: script`, |
| 40 | `scripts/<sg>/transport_descend_linear.py`. Use the canonical script as-is |
| 41 | (materialized automatically; do **not** re-emit it). Inputs: |
| 42 | `container_obb = Ref("in.container_obb")`, `place_offset = -0.06` (the TCP |
| 43 | descends to just above the rim so the held object clears the walls and drops |
| 44 | in). It lifts, moves over the container, and does an axis-locked straight-Z |
| 45 | descend (`curobo.plan_directed_linear`, fingertip-frame). Returns |
| 46 | `place_position`. |
| 47 | - **`release`** — `type: script`, `scripts/<sg>/place_release.py`. |
| 48 | Input `place_position = Ref("transport_move.place_position")`. Opens the |
| 49 | gripper with a settle so the |