Manipulation Planning Groups
Planning groups are named, selectable kinematic chains used by manipulation planning. They let APIs target a specific part of a robot, such as an arm or torso, without confusing that group with the robot’s hardware identity.Concepts
Local URDF/SRDF joint names stay inside robot-scoped configuration, model
parsing, and backend internals. Flat planning states and generated plan paths
use global joint names so multiple robots can safely share local names such as
joint1.
Discovering planning groups
Robot configs can provide planning groups explicitly withRobotModelConfig.planning_groups. Direct RobotModelConfig(...) construction
does not run discovery or synthesize groups in model_post_init; callers must
pass explicit planning_groups there.
When code uses the discovery helper instead of explicit config, DimOS discovers
groups in this order:
- Explicit
srdf_pathprovided to the helper. - Conservative SRDF auto-discovery near the model path, with a warning.
- Fallback generation of one
{robot_name}/manipulatorgroup when the configured controllable joints form exactly one unambiguous serial chain. - Error if no SRDF or fallback chain can provide a single valid group.
<end_effector> metadata. A chain group’s tip_link is its pose target frame.
An ordered joint-list group can be pose-targeted only when DimOS can validate a
unique serial target frame.
Fallback behavior
When discovery runs without an SRDF, fallback usesRobotModelConfig.joint_names as the candidate controllable set.
This field is the robot’s ordered local model joint set, not an implicit
planning group.
Fallback removes terminal prismatic leaves first, including branched finger
joints, and then requires the remaining joints to form one unambiguous serial
chain. Internal prismatic axes remain part of the arm. The generated group name
is always manipulator.
Current APIs
Uselist_planning_groups() to discover group IDs and capabilities before
planning:
skip
JointState may be
unnamed in the group’s joint order, named with all local model joint names, or
named with all global joint names. Do not mix local and global names in one
target.
skip
Pose values keyed by planning group ID:
skip
skip
GeneratedPlan may pass it explicitly:
skip
execute_plan(robot_name=...) may validate a matching
single-robot plan, but it cannot filter a multi-robot plan.
For robot-scoped compatibility APIs, unnamed joint vectors are interpreted in
the selected default planning group’s joint order. If names are provided, they
may be all local model joint names or all global joint names. Missing joints,
extra joints, partial joint sets, and mixed local/global namespaces are rejected.
Generated plans and execution
AGeneratedPlan stores:
- selected planning group IDs;
- a geometric path of
JointStatewaypoints keyed by global joint names; - one materialized synchronized
JointTrajectoryover the same selected global joint names; - status, timing, path length, iteration count, and message metadata.
Robot placement config
RobotModelConfig.base_pose and RobotModelConfig.base_link describe robot
placement: base_pose places base_link in the world and current backends
use that link for weld/placement and optional model-authored world-joint
stripping. This is robot placement metadata, not planning-chain metadata.
Planning-group base_link and tip_link values are the only source for chain
bases and pose target frames. Robot-scoped end-effector config is no longer
supported; robot-level EE helper APIs are wrappers over a unique pose-targetable
planning group and should use explicit group APIs when multiple pose groups
exist.
Robot placement can be encoded either in model assets or in base_pose,
depending on the blueprint. joint_names remains supported and should describe
the ordered controllable local model joint set.