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 abtree
import 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.