feat(manipulation): add linear Cartesian planning - #3240
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #3240 +/- ##
==========================================
+ Coverage 74.96% 75.10% +0.13%
==========================================
Files 1117 1120 +3
Lines 106875 107513 +638
Branches 9699 9754 +55
==========================================
+ Hits 80123 80746 +623
+ Misses 23945 23935 -10
- Partials 2807 2832 +25
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 7 files with indirect coverage changes 🚀 New features to boost your workflow:
|
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
…lanning # Conflicts: # dimos/manipulation/manipulation_module.py
| """Plan a collision-free path for an ordered planning-group selection.""" | ||
| ... | ||
|
|
||
| def plan_linear_cartesian_path( |
There was a problem hiding this comment.
This method should plan to CartesianTarget
Whether the path is Linear or otherwise the planner config can decide.
The planning API remains simpler and we can have a Spline Cartesian path planner.
| """List of joint states forming a path (each waypoint has names + positions)""" | ||
|
|
||
|
|
||
| CartesianTarget: TypeAlias = "PoseStamped | Transform" |
There was a problem hiding this comment.
I looked into RoboPlan cartesian planner, and it appears it can do cartesian planning for a sequence of poses.
We should let CartesianTarget accept a list of PoseStamped or Transform. And for linear cartesian planning we can assert list should be only size 2.
And if we wanted to do a zigzag pattern, we can break the CartesianTarget list into lists of 2points that we feed to the planner.
| FREE_SPACE = "free_space" | ||
| LINEAR_CARTESIAN = "linear_cartesian" |
There was a problem hiding this comment.
This should be
JOINT_SPACE
CARTESIAN_SPACE
|
Only halfway through. |
Contribution path
Problem
The manipulation planner contract can only request collision-free joint-space
paths. It cannot express a straight tool-center-point motion for approaches,
retreats, or interactive Cartesian moves, even though RoboPlan provides an
official Cartesian path planner.
The Viser manipulation panel also resolves its Cartesian gizmos to joint goals
and invokes free-space planning, so there is no convenient way to exercise or
preview a linear TCP path.
Solution
plan_linear_cartesian_pathplanner operationwith absolute world-frame poses, relative Cartesian deltas, and the existing
target-plus-auxiliary-group convention.
planner, including synchronized multi-group timing and full-model start-state
handling.
velocities, and atomically post-validate waypoints and interpolated edges
against the DimOS collision world.
UNSUPPORTEDfrom planner backends without linear Cartesian support;never substitute a free-space path for a failed linear request.
planner-name compatibility path.
Linear Cartesian for absolute transform-control targets. Existing preview
and synchronized execution reuse the planner-supplied trajectory directly.
The public RPC, skill, MCP, and CLI motion APIs remain unchanged.
How to Test
Run the interactive feature:
Move the TCP gizmo, choose Linear Cartesian, click Plan, and then
Preview.
Automated validation performed:
uv run pytest dimos/manipulation -m 'not (self_hosted or mujoco or self_hosted_large)' uv run pytest -m self_hosted dimos/manipulation/test_roboplan_world_integration.py uv run mypy dimos/manipulationResults: 360 manipulation tests passed, 2 real-RoboPlan integration tests
passed, and mypy passed across all manipulation source files.
AI assistance
OpenAI Codex with GPT-5 was extensively involved in API exploration,
implementation, tests, documentation, and validation. The design decisions and
scope were reviewed collaboratively with the author.
Checklist