Skip to main content

High-performance asynchronous behavior tree framework with behavior forest collaboration,

Project description

๐Ÿš€ 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abtree-0.3.12.tar.gz (106.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

abtree-0.3.12-py3-none-any.whl (82.7 kB view details)

Uploaded Python 3

File details

Details for the file abtree-0.3.12.tar.gz.

File metadata

  • Download URL: abtree-0.3.12.tar.gz
  • Upload date:
  • Size: 106.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.13

File hashes

Hashes for abtree-0.3.12.tar.gz
Algorithm Hash digest
SHA256 bcd924236c5a3800235fd9a7f867fae13e3c0596c71b3b8daa645c2e63a909d5
MD5 956546ba770c0a31eb34992b3d8691ec
BLAKE2b-256 a690e63d34a37f37d41b2ae0d8f2a3db25e54584588b31947e143f00f9a42a92

See more details on using hashes here.

File details

Details for the file abtree-0.3.12-py3-none-any.whl.

File metadata

  • Download URL: abtree-0.3.12-py3-none-any.whl
  • Upload date:
  • Size: 82.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.13

File hashes

Hashes for abtree-0.3.12-py3-none-any.whl
Algorithm Hash digest
SHA256 718395fec934e37ff40b47aa5e79135badf26926b37a3565408e216a4d91a615
MD5 a28bf34605ebd42af1ec317f7cf69b45
BLAKE2b-256 828885c26d446933e79035246c9266257ecd93230a0ea167c5a4084a4c954b89

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page