Asynchronous behavior tree framework built on Python asyncio, designed for intelligent decision systems with declarative programming paradigm
δΈζ | English
- β¨ Core Features
- π¬ Quick Start
- π Documentation
- π§ Technology Stack
- πΊοΈ Roadmap
- π€ Contributing
- π License
| π Async Engine | π― Node System | πΎ Data Management | π² Behavior Forest |
|---|---|---|---|
| Based on asyncio High Performance Concurrency | Rich Node Types Dynamic Registration | Blackboard System Event Driven | Multi-tree Collaboration Internal & External Communication |
- High Performance Async Execution - Concurrent node scheduling based on Python asyncio
- Smart Tick Management - Automated execution cycle management and resource control
- Event Driven Architecture - Asynchronous event dispatcher supporting real-time response
- Memory Optimization - Efficient state management and garbage collection
- Composite Nodes - Sequence, Selector, Parallel and other classic control flows
- Decorator Nodes - Inverter, Repeater, UntilSuccess and other behavior modifiers
- Action Nodes - Action, Log, Wait, SetBlackboard and other execution units
- Condition Nodes - Condition, CheckBlackboard, Compare and other judgment logic
- Dynamic Registration - Runtime node type registration and extension mechanism
- Blackboard System - Cross-node data sharing and state persistence
- Event Dispatcher - Asynchronous event listening, publishing and subscription mechanism
- State Management - Complete tracking of behavior tree execution state
- Data Validation - Type-safe data access and modification
- Multi-tree Coordination - Multiple behavior trees working together as a forest
- Communication Modes - Pub/Sub, Req/Resp, Shared Blackboard, State Monitoring, Behavior Invocation, Task Board, External IO
- Forest Management - Centralized forest configuration and lifecycle management
- Performance Monitoring - Real-time performance analysis and optimization suggestions
For source code development, debugging, and contributing:
git clone https://github.com/xiongwc/abtree.git cd abtree pip install -e .For production deployment and daily use:
pip install abtreeimport asyncio from abtree import BehaviorTree, Sequence, Selector, Action, Condition from abtree.core import Status # Define action nodes class OpenDoor(Action): async def execute(self): print("Opening door") return Status.SUCCESS class CloseDoor(Action): async def execute(self): print("Closing door") return Status.SUCCESS # Define condition nodes class IsDoorOpen(Condition): async def evaluate(self): return self.blackboard.get("door_open", False) # Build behavior tree root = Selector("Robot Decision") root.add_child(Sequence("Door Control Sequence")) root.children[0].add_child(IsDoorOpen("Check Door Status")) root.children[0].add_child(CloseDoor("Close Door")) # Create behavior tree instance tree = BehaviorTree() tree.load_from_node(root) # Execute async def main(): blackboard = tree.blackboard blackboard.set("door_open", True) result = await tree.tick() print(f"Execution result: {result}") asyncio.run(main())import asyncio from abtree import load_from_xml_string # Declarative XML: Express behavior logic in a readable, structured format xml_string = ''' <BehaviorTree name="Robot Decision"> <Sequence name="Door Control Sequence"> <CheckBlackboard name="Check Door Status" key="door_open" expected_value="true" /> <Log name="Close Door Log" message="Door detected open, preparing to close" /> <Wait name="Close Door Wait" duration="1.0" /> </Sequence> </BehaviorTree>''' # Load behavior tree from declarative XML configuration tree = load_from_xml_string(xml_string) # Execute async def main(): blackboard = tree.blackboard blackboard.set("door_open", True) result = await tree.tick() print(f"Execution result: {result}") asyncio.run(main())import asyncio from abtree import ( BehaviorForest, ForestNode, ForestNodeType, BehaviorTree, Sequence, Selector, Action, Condition ) from abtree.core import Status # Simple robot action node class RobotAction(Action): def __init__(self, name: str, action_type: str): super().__init__(name) self.action_type = action_type async def execute(self): print(f"Robot {self.action_type}") if self.action_type == "cleaning": self.blackboard.set("cleaning_needed", False) return Status.SUCCESS # Simple condition node class SimpleCondition(Condition): def __init__(self, name: str, key: str, default: bool = True): super().__init__(name) self.key = key self.default = default async def evaluate(self): return self.blackboard.get(self.key, self.default) def create_robot_tree(robot_id: str) -> BehaviorTree: """Create a simple robot behavior tree""" root = Selector(f"Robot_{robot_id}") # Cleaning sequence cleaning_seq = Sequence("Cleaning") cleaning_seq.add_child(SimpleCondition("Check Cleaning", "cleaning_needed")) cleaning_seq.add_child(RobotAction("Clean", "cleaning")) cleaning_seq.add_child(RobotAction("Navigate", "navigating")) root.add_child(cleaning_seq) tree = BehaviorTree() tree.load_from_node(root) return tree async def main(): # Create behavior forest forest = BehaviorForest("Robot Forest") # Add robot nodes for robot_id in ["R1", "R2", "R3"]: tree = create_robot_tree(robot_id) node = ForestNode( name=f"Robot_{robot_id}", tree=tree, node_type=ForestNodeType.WORKER, capabilities={"cleaning", "navigation"} ) forest.add_node(node) # Start forest await forest.start() # Execute ticks for i in range(3): results = await forest.tick() print(f"Tick {i+1}: {results}") await asyncio.sleep(0.5) await forest.stop() if __name__ == "__main__": asyncio.run(main())- π Quick Start: examples/
- π§ API Reference: docs/api.md
- π οΈ CLI Tools: cli/
- π§ͺ Testing: tests/
abtree/ βββ abtree/ # π¦ Core package β βββ core/ # π§ Core functionality β βββ engine/ # βοΈ Engine system β βββ forest/ # π² Behavior forest β βββ nodes/ # π― Node implementations β βββ parser/ # π Configuration parsing β βββ registry/ # π Node registration β βββ utils/ # π§ Utilities βββ cli/ # π₯οΈ Command line tools βββ docs/ # π Documentation βββ examples/ # π Example code βββ tests/ # π§ͺ Test suite βββ scripts/ # π Script tools βββ test_reports/ # π Test reports βββ pyproject.toml # βοΈ Build and dependency configuration | Component | Technology | Version |
|---|---|---|
| Language | Python | 3.8+ |
| Async Framework | asyncio | Built-in |
| XML Processing | xml.etree | Built-in |
| Testing | pytest | 7.0+ |
| Type Checking | mypy | 1.0+ |
- β v0.1 - Core asynchronous behavior tree framework
- β v0.2 - XML configuration support
- β v0.3 - event dispatcher and blackboard optimization
- π― v0.4 - Advanced node types
- π€ v0.5 - ROS2 integration support
- Fork the project repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Inspiration from BehaviorTree.CPP.
This project is licensed under the MIT License.