Skip to main content

Hierarchical behavior models for complex decision-making and behavior generation in robotics

Project description

Arbitration Graphs

Latest Release License Unit Test Status

TL;DR: Replace those rusty state machines with safe and scalable arbitration graphs!

Hierarchical behavior models for complex decision-making and behavior generation in robotics!

  • 🌱 Bottom-up
    Combine simple atomic behavior components to generate complex behaviors.
  • 🧩 Functional decomposition
    Behavior components address How to do it? and Can we do it?, while Arbitrators decide What to do?
  • 🧠 Meta-framework
    Integrate diverse methods in one decision-making framework. Why not combine optimization-based planning, probabilistic approaches (POMDPs), and machine learning (RL)? Use any approach where it performs best!
  • 🛠️ Maintainability
    Add new behaviors without having to touch existing ones – did we mention strict modularity and functional decomposition?
  • 🛡️ Behavior Verification
    Use tightly integrated verifiers to ensure that only safe and valid behavior commands are executed.
  • 🪂 Graceful Degradation
    Your behavior is unreliable or unsafe? Arbitrators will gracefully fall back to the next-best option.
😋 Click for more reasons!
  • 📈 Scalability
    Stack behavior components in arbitrators to create hierarchical behavior models.
  • 💡 Transparency
    Easily follow and understand the decision-making process, e.g., with our GUI.
  • 📦 Header-Only
    Simple integration – just include this header-only C++17 library!
  • 🐍 Python Bindings
    For easy prototyping, testing, and integration of machine learning algorithms, all the functionality is available via Python bindings.
  • 📜 Permissive License
    Published under MIT license to ensure maximum flexibility for your projects.
🤨 How does it compare to Behavior Trees?

Behavior Trees (BTs) are great for a variety of applications and thrive within a vibrant community!
Kudos to Petter Ögren's crew, Michele Colledanchise and Davide Faconti 🖖

But, Arbitration Graphs bring great value, especially for safety critical applications like self-driving cars and mobile robots in general – by strictly coupling preconditions to behaviors and tightly integrating behavior verification. A bit more in detail:

Behavior Trees Arbitration Graphs
Interfaces Nodes return execution status (success, failure, or running).
⏵ more flexibility w.r.t. a node's actuator interfaces
Behavior components & arbitrators return commands (e.g., a trajectory).
⏵ control theory motivated interface ${f(\boldsymbol{x}) \to \boldsymbol{u}}$
⏵ command can be verified by each arbitrator
Preconditions Implemented by condition nodes distributed throughout the tree.
⏵ easy to reuse preconditions for multiple behaviors
Require behavior components to define their own preconditions.
⏵ tight coupling of preconditions to behaviors
⏵ robustness and safety less dependent on node arrangement
Safety Each node decides on its success or failure.
⏵ can lead to safety and reliability issues, if not carefully managed
Integrate safety into the selection mechanism, using node-independent verifiers.
⏵ reduces the burden on behavior engineers
⏵ allows an easy integration of unsafe behavior components (ML, probabilistic, …)

At a Glance

Arbitration Graphs break down complex decision-making into atomic behavior components and arbitrators.

Behavior components compute a command (e.g., a trajectory) based on the current state of the world. They define whether they can be executed in the current state using their invocation condition.

Arbitrators select the best option based on a defined decision-making policy. Options can be behavior components or nested arbitrators.

Verifiers check whether the command of a behavior component is safe and valid prior to being selected by an arbitrator.

Demo

We provide a demo of this library using Pac-Man as an example application.
The arbitration graph controls Pac-Man on its journey to collect tasty dots 🍬

Run the demo with:

git clone https://github.com/KIT-MRT/arbitration_graphs.git
cd arbitration_graphs/demo
docker compose up

Open the GUI with your favorite browser:
http://0.0.0.0:8080

Explanation

You will see the Pac-Man Agent arbitrator selecting between five behavior options (by priority).
The Eat Dots option is itself an arbitrator with two sub-behaviors (selecting by expected benefit).

In this scene,

  • the Chase Ghost and Avoid Ghost behaviors are not applicable (no ghosts in close vicinity) → grey background,
  • the Eat Closest Dot and Move Randomly behavior failed verification (our verification showcase) → red background,
  • thus, the least-prioritized Stay in Place behavior is being executed → green background.

Installation

Note: We are currently working on a new major release of the library which will include some breaking changes. See the corresponding issue and pull request for details and the current status.

The Python interface to the arbitration graph library is generated using pybind11 and provides a convenient interface to utilize the full power of the arbitration graph library in Python.

Via PyPI (Recommended)

Even more good news: The package is available on PyPI, so installing it is as easy as running:

pip install arbitration-graphs

Note: The package requires Python 3.8 or higher and currently only supports a limited set of platforms. Let us know if you need support for an additional platform and we will see what we can do!

From Source

You can also build the package from source. Handy for development or if your target platform is currently not supported by the pre-built package.

Prerequisites

First make sure all dependencies are installed:

See also the Dockerfile for how to install these packages under Debian or Ubuntu.

Via pip
# From local repository
git clone https://github.com/KIT-MRT/arbitration_graphs.git
cd arbitration_graphs/python_bindings
pip install .

# Or directly from GitHub
pip install git+https://github.com/KIT-MRT/arbitration_graphs.git#subdirectory=python_bindings
Via CMake

Clone the repository and build the package using CMake:

mkdir -p arbitration_graphs/python_bindings/build
cd arbitration_graphs/python_bindings/build
# Point to the pybind11 CMake configuration directory, if not installed globally (e.g., via pip in a virtual environment)
cmake -Dpybind11_DIR=$(pybind11-config --cmakedir) ..
cmake --build .

Development

Using Docker image

Clone the repository and run the development image

git clone https://github.com/KIT-MRT/arbitration_graphs.git
cd arbitration_graphs/python_bindings
docker compose build arbitration_graphs_pybind_devel
docker compose run --rm arbitration_graphs_pybind_devel

This mounts the source into the container's /home/blinky/arbitration_graphs folder. There, you can edit the source code, compile and run the tests etc.

Running unit tests

This package includes unit tests analogous to the C++ tests. To run all tests, use the following command:

cd arbitration_graphs/python_bindings
python -m unittest discover

Contributors

This library and repo has been crafted with ❤️ by

Christoph Burger   ChristophBurger89   LinkedIn logo christoph-burger   ORCID iD 0009-0002-9147-8749
Nick Le Large   ll-nick   LinkedIn logo nick-le-large   ORCID iD 0009-0006-5191-9043
Piotr Spieker   orzechow   LinkedIn logo piotr-spieker   ORCID iD 0000-0002-0449-3741

Christoph and Piotr coded the core in a pair-programming session. Piotr also contributed the GUI and GitHub Page. Nick implemented the awesome Pac-Man demo and tutorial, with drafting support by Christoph, reviews and finetuning by Piotr. The Python bindings have been contributed by Nick and reviewed by Piotr.

The repository is maintained by Piotr Spieker  orzechow and Nick Le Large  ll-nick .

Citation

If you use arbitration graphs in your research, we would be pleased if you cite our work:

Piotr Spieker, Nick Le Large, and Martin Lauer, “Better Safe Than Sorry: Enhancing Arbitration Graphs for Safe and Robust Autonomous Decision-Making,” Nov. 15, 2024, arXiv: arXiv:2411.10170. doi: 10.48550/arXiv.2411.10170.

@misc{spieker2024ArbitrationGraphs,
  title={Better Safe Than Sorry: Enhancing Arbitration Graphs for Safe and Robust Autonomous Decision-Making}, 
  author={Piotr Spieker and Nick Le Large and Martin Lauer},
  year={2024},
  eprint={2411.10170},
  eprinttype = {arXiv},
  archivePrefix={arXiv},
  primaryClass={cs.RO},
  doi = {10.48550/arXiv.2411.10170},
  url={https://arxiv.org/abs/2411.10170}, 
}
Earlier publications

Behavior Verification and Fallback Layers

A safety concept that extends Arbitration Graphs with behavior verification and fallback layers in the context of automated driving has been proposed by Piotr Spieker (née Orzechowski) in his PhD thesis. This served as the basis for the paper with Nick above.

Piotr F. Orzechowski, “Verhaltensentscheidung für automatisierte Fahrzeuge mittels Arbitrationsgraphen,” phd, Karlsruher Institut für Technologie (KIT), 2023. doi: 10.5445/IR/1000160638.

@thesis{Orzechowski2023Arbitrationsgraphen,
  type = {phdthesis},
  title = {Verhaltensentscheidung für automatisierte Fahrzeuge mittels Arbitrationsgraphen},
  author = {Orzechowski, Piotr Franciszek},
  date = {2023},
  institution = {Karlsruher Institut für Technologie (KIT)},
  doi = {10.5445/IR/1000160638},
  langid = {german},
  pagetotal = {169},
}

Replacing state machines in AV

Arbitration Graphs replaced state machines in the context of automated driving at the Institute of Measurement and Control Systems (MRT) of the Karlsruhe Institute of Technology (KIT):

Piotr F. Orzechowski, Christoph Burger, and Martin Lauer, “Decision-Making for Automated Vehicles Using a Hierarchical Behavior-Based Arbitration Scheme,” in Intelligent Vehicles Symposium, Las Vegas, NV, USA: IEEE, Oct. 2020, pp. 767–774. doi: 10.1109/IV47402.2020.9304723.

@inproceedings{orzechowski2020ArbitrationGraphs,
  title = {Decision-Making for Automated Vehicles Using a Hierarchical Behavior-Based Arbitration Scheme},
  booktitle = {Intelligent Vehicles Symposium},
  author = {Orzechowski, Piotr F. and Burger, Christoph and Lauer, Martin},
  date = {2020-10},
  pages = {767--774},
  publisher = {IEEE},
  location = {Las Vegas, NV, USA},
  issn = {2642-7214},
  doi = {10.1109/IV47402.2020.9304723},
}

Foundation work in Robot Soccer

The foundations for Arbitration Graphs have been proposed in the context of robot soccer:

Martin Lauer, Roland Hafner, Sascha Lange, and Martin Riedmiller, “Cognitive concepts in autonomous soccer playing robots,” Cognitive Systems Research, vol. 11, no. 3, pp. 287–309, 2010, doi: 10.1016/j.cogsys.2009.12.003.

@article{lauer2010CognitiveConceptsAutonomous,
  title = {Cognitive Concepts in Autonomous Soccer Playing Robots},
  author = {Lauer, Martin and Hafner, Roland and Lange, Sascha and Riedmiller, Martin},
  date = {2010},
  journaltitle = {Cognitive Systems Research},
  volume = {11},
  number = {3},
  pages = {287--309},
  doi = {10.1016/j.cogsys.2009.12.003},
}

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

arbitration_graphs-1.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (555.2 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (549.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (549.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (549.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (548.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (546.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (546.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

arbitration_graphs-1.0.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (545.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

File details

Details for the file arbitration_graphs-1.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 599e215c073a528b5595d5b1e16c0c85a0069364cceefc26a31da62257dfbd03
MD5 5b5a8a7c50cd445d72bc270592d8424e
BLAKE2b-256 656a52c9ea8a9743fa6399117822e15eb5924321ad9293ab63ae27d4c2f231a0

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1054222a1482a5909c4e1e6d0166d5dd215f9903718f4877a6168c0fce5e2f37
MD5 385b6c7a11b8c0092ec7851929fd82dc
BLAKE2b-256 9bff9df46f055556e2e6a83129c9bece7bc2c298456aba9a18b20a0d659fd046

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 71b8ab3d6d0352e989fd6e5e8976cc302077ad9261574de9f4cf1877fa1d9f95
MD5 6450b38d578b890d3f8e8b337ea039a2
BLAKE2b-256 b7259b89a85970d751bf1509a52a69a18e3d7e4aeeec488cd96ba1e2841b2797

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 95e2cef37228005ec9a509fcef442c2f4537cee653e138bf3c0f2ae3790068fb
MD5 94edd72fad44599ed027f09957cf1b85
BLAKE2b-256 a621ecb6d4eba761ccdb33556f3c5e8a50708ae8a55a4c7113fd122f41218335

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ac429f7e9c908cd4a86832a796730ac999bbce1e46caa0318ddc1c61768d930c
MD5 151ab84fc62d82536291bf02b1f88063
BLAKE2b-256 920d9f1c7c9f33d5098a96d80e1f5b6397f0d141187c3111dd5d7063a5f9a7f2

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e9c3eb189ae33cb1769bc96ca2cc48530014212ad30241782e9f030f50cb9453
MD5 b8a4d30c8f10ebed69dab9884e5d7d07
BLAKE2b-256 67fd046dbe1b6584651e845fd9c7a5d38c51213e31c23488bd8330c93cf67f22

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 36b6c72c6066f952722df40c76c16f92e6ea6d1cdcf720db8455825d2935510d
MD5 9465788bb46ab0088719bd4056f163e3
BLAKE2b-256 b94f981386a803dfa99e10ebea4b90f7aa9303acdb3391e1254a0844ee94c7fa

See more details on using hashes here.

File details

Details for the file arbitration_graphs-1.0.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbitration_graphs-1.0.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 17f85fcf15470a0d18282740a5fa34670a7b188112a102770545bf7f30abe13c
MD5 045fe473e6f56a764176f4fabf42f3d5
BLAKE2b-256 76755f3057c97bd088659ad37e247785e607cd6633c4d982cca4d8c2a245cc61

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