Skip to main content

🚀 ABTree

Asynchronous behavior tree framework built on Python asyncio, designed for intelligent decision systems with declarative programming paradigm

PythonLicense StarsForks

中文 | English


📑 Table of Contents


✨ Core Features

🚀 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

⚡ Asynchronous Behavior Tree Engine

  • 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

🎯 Rich Node System

  • 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

💾 Smart Data Management

  • 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

🌲 Behavior Forest Collaboration

  • 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

🎬 Quick Start

🔧 Environment Setup

Development Environment Installation

For source code development, debugging, and contributing:

git clone https://github.com/xiongwc/abtree.git
cd abtree
pip install -e .

Production Environment Installation

For production deployment and daily use:

pip install abtree

📝 Basic Usage

🚀 Method 1: Programmatic Building

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())

📄 Method 2: Declarative XML Configuration

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())

🌲 Behavior Forest Example

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())

📖 Documentation

📁 Project Structure

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

🔧 Technology Stack

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+

🗺️ Roadmap

  • 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

🤝 Contributing

  1. Fork the project repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

🙏 Acknowledgments

Inspiration from BehaviorTree.CPP.


📜 License

This project is licensed under the MIT License.


⭐ If this project helps you, please give us a Star to support development! ⭐

GitHub DiscussionsGitHub IssuesGitHub Pull Requests

Release files for abtree 0.3.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for abtree 0.3.12
File Size Uploaded
abtree-0.3.12.tar.gz 106.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for abtree 0.3.12
File Interpreter ABI Platform
abtree-0.3.12-py3-none-any.whl Python 3 none any Details

Total release size: 189.1 kB

Release files / abtree-0.3.12.tar.gz

Download URL abtree-0.3.12.tar.gz
Size 106.4 kB
Tags Source
SHA-256 checksum
How to use checksums
bcd924236c5a3800235fd9a7f867fae13e3c0596c71b3b8daa645c2e63a909d5
BLAKE2b-256 checksum
How to use checksums
a690e63d34a37f37d41b2ae0d8f2a3db25e54584588b31947e143f00f9a42a92
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.13

Release files / abtree-0.3.12-py3-none-any.whl

Download URL abtree-0.3.12-py3-none-any.whl
Size 82.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
718395fec934e37ff40b47aa5e79135badf26926b37a3565408e216a4d91a615
BLAKE2b-256 checksum
How to use checksums
828885c26d446933e79035246c9266257ecd93230a0ea167c5a4084a4c954b89
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.13

Release history Release notifications | RSS feed

This release

0.3.12 This release

2 release files

0.3.11

2 release files

0.3.10

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page