Skip to main content

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},
}

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-2.0.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (589.2 kB view details)

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

arbitration_graphs-2.0.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (584.4 kB view details)

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

arbitration_graphs-2.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (584.3 kB view details)

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

arbitration_graphs-2.0.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (584.5 kB view details)

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

arbitration_graphs-2.0.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (577.4 kB view details)

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

arbitration_graphs-2.0.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (575.5 kB view details)

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

arbitration_graphs-2.0.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (576.0 kB view details)

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

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 93359a793c656fdfc86ac3b0b31d6c204f0d94eb48dc3f97748833dac16afdda
MD5 4fbd375b93e0c114d22e56cc15de87d6
BLAKE2b-256 5392b831f05bb782fd2203ca8bd0b111dae875607e5b55e0798468550b1e65e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3d5a645273e3d7afdbd9822683a570674397eed4868c2ad0228ee2ec63a1ca6a
MD5 a8f03ffe38e6b124fb8e3fb4d56a6733
BLAKE2b-256 d2ba7981f1b5edb961312640cd10c7195598f70d249241e81cb30a958b19c04a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 afc707851e2f1cbf75e72832c5ce95c6779c8d3c8221de6acaffa57b31d4d0c7
MD5 5c760b20cca9d5dd383f2c99e3d3a5ef
BLAKE2b-256 b52500048a9e11d6822bb538e7c34824942e86fef02528d5879cfb2b6acaf61e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 49e90246b424d45ecba43e89dcc89832b5e1815d640e31c9c035e2fe23c33ec4
MD5 48ed2adc51762be9690c1fa8fa531695
BLAKE2b-256 587f317f67ad228511404e9fa43655272ce307b9051ad0dfc1932ffd024eea72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fb2efbae14c9c324b04411e6bf5995cf429353c25b447d2ca2073f9678764a97
MD5 f2a1af9c07af7a49ea5698b7d2f85a70
BLAKE2b-256 2e99f7299aa1bfd8b7450a1e2f8fdb5c00a3e85def76f5adc8fee6214587171f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 89ee62f14f9fe39c6181de3b77dda1ca1368afb49797e193cfac5bbefcca8225
MD5 cebc533ded0b6d52a8289a45a80f7ed6
BLAKE2b-256 50326bb3296e1d4078608fcb49461ddf8aa9990f319fbdec5fc438e26940ae3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for arbitration_graphs-2.0.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 24cdb0a8bfe612f4f52beafa917abaa27410414c6638eaa9ef65ef1f100f8f16
MD5 1f4a2830600ad6bb560f224258e7ecd0
BLAKE2b-256 055f224419eade9f71c64b9245ab2b381ce241d9bd20eb9f06cd8609c40dc7ff

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