Skip to content

feat(manipulation): add grasp proposal pick pipeline - #3276

Draft
TomCC7 wants to merge 2 commits into
manip/grasp-sprint-july-26from
cc/manip/grasp-pipeline
Draft

feat(manipulation): add grasp proposal pick pipeline#3276
TomCC7 wants to merge 2 commits into
manip/grasp-sprint-july-26from
cc/manip/grasp-pipeline

Conversation

@TomCC7

@TomCC7 TomCC7 commented Jul 29, 2026

Copy link
Copy Markdown
Member

Contribution path

  • OpenSpec change: add-grasp-pipeline-skill
  • No tracking issue was provided.

Problem

GraspGenX can propose grasps, but the manipulation stack did not carry a proposal through object resolution, collision-aware feasibility checks, physical execution, and grasp verification.

Solution

  • Route pick through object point-cloud validation, ranked GraspGenX proposals, and pre-grasp/grasp/retreat feasibility checks.
  • Execute an explicit prepare, approach, grasp, close, verify, and retreat transaction with phase-specific failures and a single-active-pick guard.
  • Suppress only the target object's collision geometry during the transaction and restore it on every exit path.
  • Add dedicated xarm-graspgenx and xarm-graspgenx-agent blueprints while preserving explicit heuristic fallback in existing xArm stacks.
  • Add xArm gripper/TCP geometry, agent guidance, capability documentation, and OpenSpec artifacts.

The closure-position verification path is implemented, but it remains disabled in the hardware blueprint until the xArm threshold is calibrated. GPU startup and guarded physical-xArm scenarios also remain open in the OpenSpec checklist.

How to Test

Run the feature on a GPU-equipped xArm host:

uv run dimos run xarm-graspgenx-agent

Validation completed locally:

.venv/bin/pytest -p no:rerunfailures dimos/manipulation/test_pick_and_place_unit.py dimos/manipulation/planning/monitor/test_world_obstacle_suppression.py dimos/robot/manipulators/test_blueprints.py -q
CI=1 .venv/bin/pytest -p no:rerunfailures dimos/robot/test_all_blueprints_generation.py -q
.venv/bin/pytest -p no:rerunfailures dimos/manipulation -q --ignore=dimos/manipulation/planning/examples/test_manipulation_client.py
.venv/bin/mypy dimos/manipulation/pick_and_place_module.py dimos/manipulation/planning/monitor/world_monitor.py dimos/manipulation/planning/monitor/world_obstacle_monitor.py dimos/manipulation/skill_errors.py dimos/robot/manipulators/common/agent_prompts.py dimos/robot/manipulators/xarm/blueprints/agentic.py dimos/robot/manipulators/xarm/blueprints/graspgenx.py dimos/robot/manipulators/xarm/blueprints/perception.py dimos/robot/manipulators/xarm/blueprints/simulation.py dimos/robot/manipulators/xarm/grasp_config.py
openspec validate add-grasp-pipeline-skill --strict

Results: 78 focused tests passed; 415 broader manipulation tests passed with 13 skipped and 12 deselected. Ruff formatting and lint checks passed.

AI assistance

Codex with GPT-5 implemented the change, wrote tests and documentation, and ran validation. The author should review and understand every line before merging.

Checklist

  • I have read and approved the CLA.

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
3276 1 3275 177
View the top 1 failed test(s) by shortest run time
dimos.codebase_checks.test_no_init_files::test_no_init_files
Stack Traces | 0.021s run time
def test_no_init_files():
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        init_files = sorted(dimos_dir.rglob("__init__.py"))
        # The root dimos/__init__.py is allowed for the porcelain lazy import.
        init_files = [f for f in init_files if f != dimos_dir / "__init__.py"]
        if init_files:
            listing = "\n".join(f"  - {f.relative_to(dimos_dir)}" for f in init_files)
>           raise AssertionError(
                f"Found __init__.py files in dimos/:\n{listing}\n\n"
                "__init__.py files are not allowed because they lead to unnecessary "
                "extraneous imports. Everything should be imported straight from the "
                "source module."
            )
E           AssertionError: Found __init__.py files in dimos/:
E             - manipulation/demo_grasp_pipeline/__init__.py
E           
E           __init__.py files are not allowed because they lead to unnecessary extraneous imports. Everything should be imported straight from the source module.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
init_files = [PosixPath('.../dimos/dimos/dimos/manipulation/demo_grasp_pipeline/__init__.py')]
listing    = '  - manipulation/demo_grasp_pipeline/__init__.py'

dimos/codebase_checks/test_no_init_files.py:25: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant