You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
CBiRRT is naturally a planner between sets. Let $\mathcal{Q}$ be the configuration space, $\mathcal{S} \subseteq \mathcal{Q}$ the start set, $\mathcal{G} \subseteq \mathcal{Q}$ the goal set, and $\mathcal{C} \subseteq \mathcal{Q}$ the path-admissible set. The planning problem is to find a continuous path $\tau : [0,1] \to \mathcal{Q}$ such that
The current API represents these sets through separate arguments such as fixed configurations, start_tsrs, goal_tsrs, and constraint_tsrs. Their composition semantics are implicit and depend on the argument:
multiple start or goal TSRs are treated as a union;
multiple path-constraint TSRs are treated as an intersection;
projection onto an intersection greedily chooses the most violated TSR.
This makes a Python list carry different mathematical meanings in different places. It also conflates the definition of a set with one particular way of sampling or projecting onto it. In particular, projecting onto the most violated TSR is a heuristic for an intersection, not an operation proposed by CBiRRT or implied by the definition of an intersection.
The original CBiRRT paper separates the bidirectional search from a problem-specific ConstrainConfig operation. The later CBiRRT2 formulation further distinguishes direct sampling, projection, and rejection as different constraint-satisfaction strategies. We should make this latent structure explicit before adding TSR chains or more general constraint representations.
Fixed configurations, finite collections of configurations, predicates, and TSR-induced configuration sets should all be representable through this abstraction.
A TSR is a set in task space. It induces a configuration-space set through forward kinematics:
$$q \in \mathrm{AnyOf}(C_i) \iff \exists i : q \in C_i,$$$$q \in \mathrm{AllOf}(C_i) \iff \forall i : q \in C_i.$$
Nesting must preserve grouping. For example,
$$(L_1 \land R_1) \lor (L_2 \land R_2)$$
describes two matched bimanual grasps, whereas
$$(L_1 \lor L_2) \land (R_1 \lor R_2)$$
allows all four pairings.
We should not add complement/Not initially. Exclusion constraints such as collision are better handled by state and motion validators, and complements generally do not provide useful sampling or projection operations.
3. Separate set semantics from planner capabilities
Sampling, distance or violation evaluation, projection, and motion validation are operations associated with a set, not part of the definition of a set. They should be represented as separate optional capabilities, for example:
CBiRRT can then declare the capabilities it requires from each role:
roots or a sampler for the start and goal sets;
projection or rejection for the path-admissible set;
state and full-edge validation for every local extension;
distance and interpolation supplied by the state space.
The existing plan(...) API should initially remain available and lower its arguments into this representation. This issue should not require a public breaking change.
Representative compositions
A bimanual goal with two matched grasp strategies:
These examples show why both composition operators and their nesting are part of the core problem representation rather than planner-specific conveniences.
Acceptance criteria
Add a short design document defining the state space, start set, goal set, path-admissible set, membership, and composition semantics.
Define a minimal configuration-set abstraction whose core semantic operation is membership.
Implement explicit AnyOf and AllOf composition with arbitrary nesting.
Keep sampling, projection, violation/distance evaluation, and motion validation as distinct capabilities or strategies.
Add adapters for finite configuration sets and TSR-induced configuration sets.
Preserve the existing plan(...) entry point by lowering legacy inputs into the new representation.
Do not silently provide a generic AllOf projector for two or more children. A single-child AllOf delegates projection to that child. Multi-child intersections require an explicit joint or named heuristic projection strategy.
Give membership tolerance, projection progress tolerance, tree-connection tolerance, and edge-checking resolution distinct meanings.
Add tests for union, intersection, nested grouping, unsupported capabilities, and TSRs with non-identity T0_w and Tw_e frames.
Add at least one planning test whose goal is an AnyOf of alternatives and one whose path constraint is an AllOf composition.
Document the relationship between this abstraction and TSR chains in Support TSR chains for multi-link pose constraints #7. A TSR chain defines one pose set through kinematic composition; it is not an AllOf of its constituent TSRs.
Non-goals
Extracting a general ssplanning package.
Rewriting CBiRRT in C++.
Integrating OMPL or RoboPlan.
Implementing TSR chains as part of this issue.
Supporting arbitrary Boolean negation.
Claiming that every composed set is sampleable or projectable.
The purpose of this issue is to establish a precise and testable problem representation inside pycbirrt. Broader extraction should be considered only after this interface has been exercised by the existing planner.
Motivation
CBiRRT is naturally a planner between sets. Let$\mathcal{Q}$ be the configuration space, $\mathcal{S} \subseteq \mathcal{Q}$ the start set, $\mathcal{G} \subseteq \mathcal{Q}$ the goal set, and $\mathcal{C} \subseteq \mathcal{Q}$ the path-admissible set. The planning problem is to find a continuous path $\tau : [0,1] \to \mathcal{Q}$ such that
The current API represents these sets through separate arguments such as fixed configurations,
start_tsrs,goal_tsrs, andconstraint_tsrs. Their composition semantics are implicit and depend on the argument:This makes a Python list carry different mathematical meanings in different places. It also conflates the definition of a set with one particular way of sampling or projecting onto it. In particular, projecting onto the most violated TSR is a heuristic for an intersection, not an operation proposed by CBiRRT or implied by the definition of an intersection.
The original CBiRRT paper separates the bidirectional search from a problem-specific
ConstrainConfigoperation. The later CBiRRT2 formulation further distinguishes direct sampling, projection, and rejection as different constraint-satisfaction strategies. We should make this latent structure explicit before adding TSR chains or more general constraint representations.References:
Proposal
1. Give sets a minimal semantic interface
A state set should first define only membership:
Fixed configurations, finite collections of configurations, predicates, and TSR-induced configuration sets should all be representable through this abstraction.
A TSR is a set in task space. It induces a configuration-space set through forward kinematics:
The planner should consume an adapter for this induced set rather than branch on the concrete
TSRtype.2. Make Boolean composition explicit
Introduce explicit set constructors with arbitrary nesting:
Their membership semantics are:
Nesting must preserve grouping. For example,
describes two matched bimanual grasps, whereas
allows all four pairings.
We should not add complement/
Notinitially. Exclusion constraints such as collision are better handled by state and motion validators, and complements generally do not provide useful sampling or projection operations.3. Separate set semantics from planner capabilities
Sampling, distance or violation evaluation, projection, and motion validation are operations associated with a set, not part of the definition of a set. They should be represented as separate optional capabilities, for example:
The exact Python organization can be decided during implementation. The required semantic distinction is:
Composition of capabilities must also be explicit:
AnyOfsampler needs a stated mixture policy;AnyOfprojector may try children and choose a successful nearby result;AllOforAnyOfdelegates its capabilities to that child and needs no strategy;AllOfprojector with two or more children generally requires a joint projection strategy;AllOf.4. Express planner inputs in terms of roles
The internal planning problem should distinguish the role a set plays without changing what a set means:
CBiRRT can then declare the capabilities it requires from each role:
The existing
plan(...)API should initially remain available and lower its arguments into this representation. This issue should not require a public breaking change.Representative compositions
A bimanual goal with two matched grasp strategies:
The heavy-object example from the CBiRRT paper is approximately:
These examples show why both composition operators and their nesting are part of the core problem representation rather than planner-specific conveniences.
Acceptance criteria
AnyOfandAllOfcomposition with arbitrary nesting.plan(...)entry point by lowering legacy inputs into the new representation.AllOfprojector for two or more children. A single-childAllOfdelegates projection to that child. Multi-child intersections require an explicit joint or named heuristic projection strategy.T0_wandTw_eframes.AnyOfof alternatives and one whose path constraint is anAllOfcomposition.AllOfof its constituent TSRs.Non-goals
ssplanningpackage.The purpose of this issue is to establish a precise and testable problem representation inside
pycbirrt. Broader extraction should be considered only after this interface has been exercised by the existing planner.