Skip to content

feat(manipulation): unify xArm pick and place - #3405

Draft
TomCC7 wants to merge 6 commits into
mainfrom
feat/unify-xarm-pick-place
Draft

feat(manipulation): unify xArm pick and place#3405
TomCC7 wants to merge 6 commits into
mainfrom
feat/unify-xarm-pick-place

Conversation

@TomCC7

@TomCC7 TomCC7 commented Aug 8, 2026

Copy link
Copy Markdown
Member

Summary

  • unify simulated and real xArm pick/place around one generic manipulation workflow
  • expose two runnable blueprints: xarm-box-filling for the real demo and xarm-grasp-sim-agent for MuJoCo
  • keep box-filling policy in the derived module while the base module exposes clean scan, select, pick, and place operations
  • use provider-supplied grasp candidates, revalidate prepared picks, verify holding, and place by held-object reference
  • keep collision checking on free-space motion and use explicit unchecked linear motion only for contact legs
  • integrate the current origin/main trajectory parametrization design

Validation

  • CI=1 uv run pytest dimos/robot/test_all_blueprints_generation.py dimos/robot/test_all_blueprints.py dimos/manipulation/test_manipulation_unit.py dimos/manipulation/test_pick_and_place_unit.py dimos/manipulation/test_generated_plan_materialization.py dimos/manipulation/test_plan_execution.py dimos/manipulation/planning/monitor/test_world_obstacle_suppression.py dimos/manipulation/planning/planners/test_roboplan_config.py -q
    • 235 passed, 3 skipped
  • uv run mypy dimos/manipulation/manipulation_module.py dimos/manipulation/pick_and_place_module.py
  • uv run ruff check on the merged manipulation and blueprint files

ruthwikdasyam and others added 5 commits August 7, 2026 11:26
…place

# Conflicts:
#	CONTEXT.md
#	dimos/manipulation/manipulation_module.py
#	dimos/manipulation/pick_and_place_module.py
#	dimos/manipulation/test_manipulation_unit.py
#	dimos/robot/all_blueprints.py
@mintlify

mintlify Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
dimensional 🟢 Ready View Preview Aug 8, 2026, 5:26 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@codecov

codecov Bot commented Aug 8, 2026

Copy link
Copy Markdown

❌ 2 Tests Failed:

Tests completed Failed Passed Skipped
3844 2 3842 176
View the top 2 failed test(s) by shortest run time
dimos.codebase_checks.test_inline_heavy_imports::test_heavy_imports_are_inline
Stack Traces | 1.89s run time
def test_heavy_imports_are_inline() -> None:
        """Fail if any file imports cv2/open3d/rerun at module level."""
        hits = find_eager_heavy_imports()
        if hits:
            listing = "\n".join(
                f"  - dimos/{f}:{line}: `{module}`"
                for f, lines in sorted(hits.items())
                for line, module in lines
            )
>           raise AssertionError(
                f"Found module-level import(s) of {'/'.join(HEAVY_MODULES)}:\n{listing}\n\n"
                "These libraries load large native extensions into every process that "
                "transitively imports the module. Import them inside the function or "
                "method that uses them; imports needed only for type annotations go "
                "under `if TYPE_CHECKING:`."
            )
E           AssertionError: Found module-level import(s) of cv2/open3d/rerun:
E             - .../manipulation/visualization/pose_overlay.py:17: `cv2`
E             - .../manipulation/visualization/rerun.py:20: `rerun.blueprint`
E             - dimos/perception/sim_object_scene.py:30: `open3d`
E           
E           These libraries load large native extensions into every process that transitively imports the module. Import them inside the function or method that uses them; imports needed only for type annotations go under `if TYPE_CHECKING:`.

hits       = {'manipulation/visualization/pose_overlay.py': [(17, 'cv2')], 'manipulation/visualization/rerun.py': [(20, 'rerun.blueprint')], 'perception/sim_object_scene.py': [(30, 'open3d')]}
listing    = '  - .../manipulation/visualization/pose_overlay.py:17: `cv2`\n  - .../manipulation/visualization/rerun.py:20: `rerun.blueprint`\n  - dimos/perception/sim_object_scene.py:30: `open3d`'

dimos/codebase_checks/test_inline_heavy_imports.py:92: AssertionError
dimos.codebase_checks.test_no_dunder_new::test_no_dunder_new
Stack Traces | 2.05s run time
def test_no_dunder_new() -> None:
        """Fail if any test file calls `__new__` to bypass `__init__`."""
        dimos_dir = DIMOS_PROJECT_ROOT / "dimos"
        hits = find_dunder_new_calls()
        if hits:
            listing = "\n".join(
                f"  - {p.relative_to(dimos_dir)}:{lineno}: {line.strip()}" for p, lineno, line in hits
            )
>           raise AssertionError(
                f"Found __new__ call(s) in test files:\n{listing}\n\n"
                "Tests must construct objects with the real constructor: __init__ is "
                "code under test too, and an object assembled by hand silently rots "
                "when the constructor changes. If __init__ does heavy work, mock the "
                "collaborators it needs instead of skipping it. Only if that is truly "
                "impossible, add the call to the WHITELIST in "
                "dimos/codebase_checks/test_no_dunder_new.py."
            )
E           AssertionError: Found __new__ call(s) in test files:
E             - manipulation/test_table_collision.py:23: module = object.__new__(ManipulationModule)
E           
E           Tests must construct objects with the real constructor: __init__ is code under test too, and an object assembled by hand silently rots when the constructor changes. If __init__ does heavy work, mock the collaborators it needs instead of skipping it. Only if that is truly impossible, add the call to the WHITELIST in dimos/codebase_checks/test_no_dunder_new.py.

dimos_dir  = PosixPath('.../dimos/dimos/dimos')
hits       = [(PosixPath('.../dimos/dimos/dimos/manipulation/test_table_collision.py'), 23, '    module = object.__new__(ManipulationModule)')]
listing    = '  - manipulation/test_table_collision.py:23: module = object.__new__(ManipulationModule)'

dimos/codebase_checks/test_no_dunder_new.py:67: 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.

2 participants