feat: add manipulation planning groups#2489
Conversation
❌ 2 Tests Failed:
View the full list of 2 ❄️ flaky test(s)
To view more test analytics, go to the Test Analytics Dashboard |
f157926 to
31731b1
Compare
Co-authored-by: cc <55869557+TomCC7@users.noreply.github.com>
Greptile SummaryThis PR introduces first-class manipulation planning groups — public
Confidence Score: 4/5Safe to merge for single-arm use; the dual-arm preview path has a silent abort that will make the Viser ghost appear unresponsive on the first robot-state miss. The animate_plan early-return in the visualizer means a transient missing joint state for any one arm in a dual-arm plan drops the entire preview animation without any visible indication to the user. The core planning and execution paths (IK, RRT, coordinator dispatch) are unaffected so robot motion is not impacted, but the Viser preview feedback is broken for the primary new use-case. dimos/manipulation/visualization/viser/visualizer.py (animate_plan loop) and dimos/manipulation/manipulation_module.py (_plan_selected_path missing preview dismiss). Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[plan_to_pose / plan_to_pose_targets] --> B[_begin_planning state to PLANNING]
B --> C[_selected_joint_state collect current global joints]
C --> D[inverse_kinematics solve_pose_targets per robot]
D --> E{IK success?}
E -- No --> F[_fail to FAULT]
E -- Yes --> G[_plan_selected_path RRTConnect plan_selected_joint_path]
G --> H{Plan success?}
H -- No --> F
H -- Yes --> I[_store_generated_plan GeneratedPlan with global joints]
I --> J[state to COMPLETED]
J --> K[preview_plan animate_plan]
K --> L[execute_plan project local paths per robot]
L --> M[_invoke_coordinator_task for each affected robot]
M --> N{All dispatches OK?}
N -- No --> F
N -- Yes --> O[state to COMPLETED]
style F fill:#f99,stroke:#900
style O fill:#9f9,stroke:#090
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[plan_to_pose / plan_to_pose_targets] --> B[_begin_planning state to PLANNING]
B --> C[_selected_joint_state collect current global joints]
C --> D[inverse_kinematics solve_pose_targets per robot]
D --> E{IK success?}
E -- No --> F[_fail to FAULT]
E -- Yes --> G[_plan_selected_path RRTConnect plan_selected_joint_path]
G --> H{Plan success?}
H -- No --> F
H -- Yes --> I[_store_generated_plan GeneratedPlan with global joints]
I --> J[state to COMPLETED]
J --> K[preview_plan animate_plan]
K --> L[execute_plan project local paths per robot]
L --> M[_invoke_coordinator_task for each affected robot]
M --> N{All dispatches OK?}
N -- No --> F
N -- Yes --> O[state to COMPLETED]
style F fill:#f99,stroke:#900
style O fill:#9f9,stroke:#090
Reviews (8): Last reviewed commit: "chore: split bulky viser panel changes" | Re-trigger Greptile |
Summary
robot/groupIDs, global joint names, SRDF/fallback discovery, registry construction, and selector-aware world resolution.ManipulationModulecan plan to group-scoped pose and joint targets while preserving local model joint names internally.groups/identifiers.py; joint target/state helpers live ingroups/joints.py.Stack
Verification
uv run pytest dimos/manipulation/planning/test_planning_group_identifiers.py dimos/manipulation/planning/test_planning_group_joints.py dimos/manipulation/planning/kinematics/test_pink_ik.py dimos/manipulation/test_manipulation_unit.py -quv run pytest dimos/manipulation/planning/kinematics -quv run pytest dimos/e2e_tests/test_manipulation_planning_groups.py -m self_hosted_large -quv run pytest dimos/e2e_tests/test_control_coordinator.py -quv run pytest dimos/robot/test_all_blueprints.py dimos/robot/test_all_blueprints_generation.py dimos/control/blueprints/test_dual.py -quv run pytest dimos/manipulation/visualization/test_factory.py dimos/manipulation/visualization/viser/test_viser_visualization.py dimos/manipulation/visualization/viser/test_visualizer_lifecycle.py dimos/manipulation/test_manipulation_unit.py -quv run --group lint mypyuv run ruff check .../uv run ruff format --check ...rtk git diff --checkNotes