pub struct SubsumptionNode {
pub layers: Vec<SubsumptionLayer>,
}Expand description
Subsumption node for priority-based layered control.
This implements the subsumption architecture where behaviors are organized in layers with different priorities. Higher priority layers can override lower priority ones.
§Behavior
- Layers are executed in order of priority (highest first)
- If a layer returns
SuccessorRunning, execution stops and that status is returned - If a layer returns
Failure, the next lower priority layer is tried - If all layers fail, the node returns
Failure
§Use Cases
- Safety-critical systems: Safety behaviors override task behaviors
- Reactive control: Obstacle avoidance overrides navigation
- Hierarchical control: High-level planning with low-level reactive layers
§Example
use mecha10_behavior_patterns::prelude::*;
let subsumption = SubsumptionNode::new()
.add_layer(10, Box::new(EmergencyStopBehavior)) // Highest priority
.add_layer(5, Box::new(AvoidObstacleBehavior)) // Medium priority
.add_layer(1, Box::new(NavigateBehavior)); // Lowest priorityFields§
§layers: Vec<SubsumptionLayer>Implementations§
Source§impl SubsumptionNode
impl SubsumptionNode
Sourcepub fn add_layer(self, priority: u8, behavior: BoxedBehavior) -> Self
pub fn add_layer(self, priority: u8, behavior: BoxedBehavior) -> Self
Add a layer with the given priority and behavior.
Layers are automatically sorted by priority (highest first).
Sourcepub fn add_named_layer(
self,
priority: u8,
name: impl Into<String>,
behavior: BoxedBehavior,
) -> Self
pub fn add_named_layer( self, priority: u8, name: impl Into<String>, behavior: BoxedBehavior, ) -> Self
Add a named layer.
Sourcepub fn layer_count(&self) -> usize
pub fn layer_count(&self) -> usize
Get the number of layers.
Trait Implementations§
Source§impl BehaviorNode for SubsumptionNode
impl BehaviorNode for SubsumptionNode
Source§fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Execute one tick of the behavior. Read more
Source§fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Reset the behavior to its initial state. Read more
Source§fn on_init<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_init<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Called when the behavior is first initialized. Read more
Source§impl Debug for SubsumptionNode
impl Debug for SubsumptionNode
Auto Trait Implementations§
impl Freeze for SubsumptionNode
impl !RefUnwindSafe for SubsumptionNode
impl Send for SubsumptionNode
impl Sync for SubsumptionNode
impl Unpin for SubsumptionNode
impl !UnwindSafe for SubsumptionNode
Blanket Implementations§
Source§impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
Source§fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Run this behavior until it completes (Success or Failure). Read more
Source§fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Run this behavior with a maximum number of ticks. Read more
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more