- postpone pruning / interface auto-detection to top task-level
only the task state knows for sure, that it requires its wrapped child to push to both ends
- perform connectivity validation only after pruning
only then, we the interfaces are completely determined
works if propagation direction can be derived from a generator or
connecting stage within the sequence
start-to-end propagation through whole serial container still fails
Establishing the interface connections, we face a chicken-egg-problem:
To establish a connection, a predecessors/successors pull interface is
assigned to the current's stage push interface.
However, propagating stages (in auto-detection mode) can only create
their pull interfaces if the corresponding, opposite-side push interface
is present already (because that's the mechanism to determine the supported
propagation directions).
Hence, we need to resolve this by performing two sweeps:
- initialization, assuming both propagation directions should be supported,
thus generating both pull interfaces, i.e. providing the egg
- stripping down the interfaces to the actual context
This context is provided by two stages pushing from both ends
into a (potentially long) sequence of propagating stages (tbd).
Contributions of this PR:
- PropagatingEitherWay: explicitly distinguish AUTO from BOTHWAYS interface
AUTO: auto-derive interface from provided push interfaces
BOTHWAYS: explicitly require both directions
- SerialContainer: (better, but not yet perfect) validation of connectivity
- ParallelContainer: determine interface from what children offer
- basic implementation for StagePrivate
- implementation for Stage calls this
- implementation for ContainerBase recursively calls this
- implementation for Task added
Separate planning approaches (using MoveIt pipeline or computeCartesianPath) from stages.
This allows to reuse planning in various stages without code duplication.
Reworked stages:
Move -> Connect
Gripper + CartesianPositionMotion -> MoveTo
CartesianPositionMotion -> MoveRelative