{"id":22353459,"url":"https://github.com/splintered-reality/py_trees","last_synced_at":"2025-05-14T07:08:53.522Z","repository":{"id":37285003,"uuid":"60054396","full_name":"splintered-reality/py_trees","owner":"splintered-reality","description":"Python implementation of behaviour trees.","archived":false,"fork":false,"pushed_at":"2025-04-13T14:30:55.000Z","size":11786,"stargazers_count":480,"open_issues_count":30,"forks_count":167,"subscribers_count":19,"default_branch":"devel","last_synced_at":"2025-05-11T14:49:03.762Z","etag":null,"topics":["behaviour-trees","python","robotics"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/splintered-reality.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-05-31T03:08:03.000Z","updated_at":"2025-05-09T14:41:49.000Z","dependencies_parsed_at":"2024-06-18T15:26:38.279Z","dependency_job_id":"4246828b-741b-4bf2-9786-4064cef6f429","html_url":"https://github.com/splintered-reality/py_trees","commit_stats":{"total_commits":1189,"total_committers":26,"mean_commits":45.73076923076923,"dds":"0.23128679562657695","last_synced_commit":"6e97964a2c604995b44ce9f1f248db91c693f48f"},"previous_names":[],"tags_count":84,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splintered-reality%2Fpy_trees","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splintered-reality%2Fpy_trees/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splintered-reality%2Fpy_trees/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splintered-reality%2Fpy_trees/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/splintered-reality","download_url":"https://codeload.github.com/splintered-reality/py_trees/tar.gz/refs/heads/devel","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254092776,"owners_count":22013290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["behaviour-trees","python","robotics"],"created_at":"2024-12-04T13:08:36.668Z","updated_at":"2025-05-14T07:08:48.509Z","avatar_url":"https://github.com/splintered-reality.png","language":"Python","readme":"# PyTrees\n\n[[About](#about)] [[What's New?](#whats-new)] [[Documentation](#documentation)] [[Getting Started](#getting-started)] [[Next Steps](#next-steps)] [[Releases](#releases)]\n\n----\n\n## About\n\nPyTrees is a Python implementation of behaviour trees designed to facilitate the rapid development of medium sized decision making engines for use in fields like robotics.\n\nBrief feature list:\n\n* Behaviours, Decorators, Sequences, Selectors, Parallels and BehaviourTree.\n* Blackboards for data sharing.\n* A useful library of behaviours, decorators, and idioms.\n* Serialise to a dot graph or render to ascii/unicode in a terminal.\n* Tested on Linux and Mac (YMMV with Windows).\n\n## What's New?\n\n* [2025-01-11] Support for Python 3.12 was added, and Python 3.8 was dropped.\n\n## Documentation\n\n[![devel][docs-devel-image]][docs-devel] [![2.3.x][docs-2.3.x-image]][docs-2.3.x] [![2.2.x][docs-2.2.x-image]][docs-2.2.x] [![2.1.x][docs-2.1.x-image]][docs-2.1.x]\n\n## Getting Started\n\nYou can get started on Codespaces (with no mismatched environment issues and in under 5 minutes) [1]:\n\n1. Fork the project to your personal account\n2. Click on Code -\u003e Codespaces -\u003e + Create a Codespace\n3. Enter the Terminal\n\n```\n# Install Dependencies\n(docker) zen@py_trees:/workspaces/py_trees$ poetry install\n\n# Explore the demos\n(docker) zen@py_trees:/workspaces/py_trees$ poetry shell\n(py-trees-py3.10) (docker) zen@py_trees:/workspaces/py_trees$ py-trees-demo-\u003ctab\u003e-\u003ctab\u003e\npy-trees-demo-action-behaviour            py-trees-demo-context-switching           py-trees-demo-logging\npy-trees-demo-behaviour-lifecycle         py-trees-demo-display-modes               py-trees-demo-pick-up-where-you-left-off\npy-trees-demo-blackboard                  py-trees-demo-dot-graphs                  py-trees-demo-selector\npy-trees-demo-blackboard-namespaces       py-trees-demo-either-or                   py-trees-demo-sequence\npy-trees-demo-blackboard-remappings       py-trees-demo-eternal-guard               py-trees-demo-tree-stewardship\n(py-trees-py3.10) (docker) zen@py_trees:/workspaces/py_trees$ py-trees-demo-blackboard\n...\n(py-trees-py3.10) (docker) zen@py_trees:/workspaces/py_trees$ exit\n\n# Hack some Code\n\n# Run the Formatter, Tests, Linters and Mypy\n(docker) zen@py_trees:/workspaces/py_trees$ poetry run tox -l\npy310 py312 format check mypy310 mypy312\n(docker) zen@py_trees:/workspaces/py_trees$ poetry run tox -e format\n...\n(docker) zen@py_trees:/workspaces/py_trees$ poetry run tox -e py310\n...\n(docker) zen@py_trees:/workspaces/py_trees$ poetry run tox -e check\n...\n\n# Contribute a PR!\n# https://github.com/splintered-reality/py_trees/blob/devel/CONTRIBUTING.md\n```\n\n[1] All of the above will, of course, work in a local environment if you have `poetry` installed.\nIf you're using `VSCode` you don't even need that, just reopen the project in the [devcontainer](.devcontainer/devcontainer.json) and be froody.\n\n## Next Steps\n\nOn PyPi:\n* [py_trees](https://pypi.org/project/py-trees/)\n* [py_trees_js](https://pypi.org/project/py-trees-js/)\n\nExamples:\n* [ReadTheDocs - PyTrees ROS Tutorials](https://py-trees-ros-tutorials.readthedocs.io/en/devel/index.html) - significantly more edifying than the demos, these incrementally walk through the process of building a decision making layer for a robot. These use ROS2 (sparsely), but merely browsing should be enlightening regardless.\n\nVisualisation:\n* [py_trees_js](https://github.com/splintered-reality/py_trees_js) - a javascript library for building your own runtime visualisation tool\n\nRobotics:\n* [py_trees_ros](https://github.com/splintered-reality/py_trees_ros) - a tree manager and behaviours designed for use specifically with `ROS2`\n* [py_trees_ros_viewer](https://github.com/splintered-reality/py_trees_ros_viewer) - a `Qt/ROS2` implementation of `py_trees_js`\n\n## Releases\n\n* `2.3.x` - Support for Python 3.12 was added, and Python 3.8 was dropped.\n* `2.2.x` - Selectors, Sequences with and without memory. Improved testing and style/type checking.\n* `2.1.x` - Chooser deprecated. API housekeeping.\n* `2.0.x` - Blackboards V2!\n* `1.2.x` - Trees can now shutdown cleanly. StatusToBlackboard and EternalGuard, Visitors get finalise().\n* `1.1.x` - Fixes for setup, tick-tock, viz.\n* `1.0.x` - Behaviours, Decorators, Composites, Blackboards, Tree Management and Viz tools.\n* `0.y.x` - First open source pre-releases.\n\n| | Devel | 2.3.x | 2.2.x | 2.1.x | 2.0.x | 1.2.x |\n|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n| Sources | [![devel][sources-devel-image]][sources-devel] | [![2.3.x][sources-2.3.x-image]][sources-2.3.x] | [![2.2.x][sources-2.2.x-image]][sources-2.2.x] | [![2.1.x][sources-2.1.x-image]][sources-2.1.x] | [![2.0.x][sources-2.0.x-image]][sources-2.0.x] | [![1.2.x][sources-1.2.x-image]][sources-1.2.x] |\n| Compatibility | [![Python 3.12][python312-image]][python312-docs]\u003cbr/\u003e[![Python 3.10][python310-image]][python310-docs] | [![Python 3.12][python312-image]][python312-docs]\u003cbr/\u003e[![Python 3.10][python310-image]][python310-docs] | [![Python 3.10][python310-image]][python310-docs]\u003cbr/\u003e[![Python 3.8][python38-image]][python38-docs] | [![Python 3.6][python36-image]][python36-docs] | [![Python 3.6][python36-image]][python36-docs] | [![Python 3.6][python36-image]][python36-docs] | [![Python 3.6][python36-image]][python36-docs] |\n| CI | [![devel-Status][devel-build-status-image]][devel-build-status] | [![2.3.x-Status][2.3.x-build-status-image]][2.3.x-build-status] | [![2.2.x-Status][2.2.x-build-status-image]][2.2.x-build-status] | - | - | - | - | - |\n| Documentation | [![devel-Docs][rtd-devel-image]][docs-devel] | [![2.3.x-Docs][rtd-2.3.x-image]][docs-2.3.x] | [![2.2.x-Docs][rtd-2.2.x-image]][docs-2.2.x] | [![2.1.x-Docs][rtd-2.1.x-image]][docs-2.1.x] | [![2.0.x-Docs][rtd-2.0.x-image]][docs-2.0.x] | [![1.2.x-Docs][rtd-1.2.x-image]][docs-1.2.x] |\n\n\n[license-image]: https://img.shields.io/badge/License-BSD%203--Clause-orange.svg?style=plastic\n[license]: LICENSE\n\n[python312-image]: https://img.shields.io/badge/python-3.12-green.svg?style=plastic\n[python312-docs]: https://docs.python.org/3.12/\n[python310-image]: https://img.shields.io/badge/python-3.10-green.svg?style=plastic\n[python310-docs]: https://docs.python.org/3.10/\n[python38-image]: https://img.shields.io/badge/python-3.8-green.svg?style=plastic\n[python38-docs]: https://docs.python.org/3.8/\n[python36-image]: https://img.shields.io/badge/python-3.6-green.svg?style=plastic\n[python36-docs]: https://docs.python.org/3.6/\n\n[devel-build-status-image]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml/badge.svg\n[devel-build-status]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml\n[2.3.x-build-status-image]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml/badge.svg??branch=release/2.3.x\n[2.3.x-build-status]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml\n[2.2.x-build-status-image]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml/badge.svg??branch=release/2.2.x\n[2.2.x-build-status]: https://github.com/splintered-reality/py_trees/actions/workflows/pre-merge.yaml\n\n[docs-devel]: http://py-trees.readthedocs.io/\n[docs-2.3.x]: http://py-trees.readthedocs.io/en/release-2.3.x/\n[docs-2.2.x]: http://py-trees.readthedocs.io/en/release-2.2.x/\n[docs-2.1.x]: http://py-trees.readthedocs.io/en/release-2.1.x/\n[docs-2.0.x]: http://py-trees.readthedocs.io/en/release-2.0.x/\n[docs-1.3.x]: http://py-trees.readthedocs.io/en/release-1.3.x/\n[docs-1.2.x]: http://py-trees.readthedocs.io/en/release-1.2.x/\n[docs-0.7.x]: http://py-trees.readthedocs.io/en/release-0.7.x/\n[docs-0.6.x]: http://py-trees.readthedocs.io/en/release-0.6.x/\n[docs-0.5.x]: http://docs.ros.org/kinetic/api/py_trees/html/\n\n[docs-devel-image]: http://img.shields.io/badge/docs-devel-brightgreen.svg?style=plastic\n[docs-2.3.x-image]: http://img.shields.io/badge/docs-2.3.x-brightgreen.svg?style=plastic\n[docs-2.2.x-image]: http://img.shields.io/badge/docs-2.2.x-brightgreen.svg?style=plastic\n[docs-2.1.x-image]: http://img.shields.io/badge/docs-2.1.x-brightgreen.svg?style=plastic\n[docs-2.0.x-image]: http://img.shields.io/badge/docs-2.0.x-brightgreen.svg?style=plastic\n[docs-1.3.x-image]: http://img.shields.io/badge/docs-1.3.x-brightgreen.svg?style=plastic\n[docs-1.2.x-image]: http://img.shields.io/badge/docs-1.2.x-brightgreen.svg?style=plastic\n[docs-0.7.x-image]: http://img.shields.io/badge/docs-0.7.x-brightgreen.svg?style=plastic\n[docs-0.6.x-image]: http://img.shields.io/badge/docs-0.6.x-brightgreen.svg?style=plastic\n[docs-0.5.x-image]: http://img.shields.io/badge/docs-0.5.x-brightgreen.svg?style=plastic\n\n[rtd-devel-image]: https://readthedocs.org/projects/py-trees/badge/?version=devel\u0026style=plastic\n[rtd-2.3.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-2.3.x\u0026style=plastic\n[rtd-2.2.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-2.2.x\u0026style=plastic\n[rtd-2.1.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-2.1.x\u0026style=plastic\n[rtd-2.0.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-2.0.x\u0026style=plastic\n[rtd-1.3.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-1.3.x\u0026style=plastic\n[rtd-1.2.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-1.2.x\u0026style=plastic\n[rtd-0.7.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-0.7.x\u0026style=plastic\n[rtd-0.6.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-0.6.x\u0026style=plastic\n[rtd-0.5.x-image]: https://readthedocs.org/projects/py-trees/badge/?version=release-0.5.x\u0026style=plastic\n[not-available-docs-image]: http://img.shields.io/badge/docs-n/a-yellow.svg?style=plastic\n\n[sources-devel]: https://github.com/splintered-reality/py_trees/tree/devel\n[sources-2.3.x]: https://github.com/splintered-reality/py_trees/tree/release/2.3.x\n[sources-2.2.x]: https://github.com/splintered-reality/py_trees/tree/release/2.2.x\n[sources-2.1.x]: https://github.com/splintered-reality/py_trees/tree/release/2.1.x\n[sources-2.0.x]: https://github.com/splintered-reality/py_trees/tree/release/2.0.x\n[sources-1.3.x]: https://github.com/splintered-reality/py_trees/tree/release/1.3.x\n[sources-1.2.x]: https://github.com/splintered-reality/py_trees/tree/release/1.2.x\n[sources-0.7.x]: https://github.com/splintered-reality/py_trees/tree/release/0.7.x\n[sources-0.6.x]: https://github.com/splintered-reality/py_trees/tree/release/0.6.x\n[sources-0.5.x]: https://github.com/splintered-reality/py_trees/tree/release/0.5.x\n\n[sources-devel-image]: http://img.shields.io/badge/sources-devel-blue.svg?style=plastic\n[sources-2.3.x-image]: http://img.shields.io/badge/sources-2.3.x-blue.svg?style=plastic\n[sources-2.2.x-image]: http://img.shields.io/badge/sources-2.2.x-blue.svg?style=plastic\n[sources-2.1.x-image]: http://img.shields.io/badge/sources-2.1.x-blue.svg?style=plastic\n[sources-2.0.x-image]: http://img.shields.io/badge/sources-2.0.x-blue.svg?style=plastic\n[sources-1.3.x-image]: http://img.shields.io/badge/sources-1.3.x-blue.svg?style=plastic\n[sources-1.2.x-image]: http://img.shields.io/badge/sources-1.2.x-blue.svg?style=plastic\n[sources-0.7.x-image]: http://img.shields.io/badge/sources-0.7.x-blue.svg?style=plastic\n[sources-0.6.x-image]: http://img.shields.io/badge/sources-0.6.x-blue.svg?style=plastic\n[sources-0.5.x-image]: http://img.shields.io/badge/sources-0.5.x-blue.svg?style=plastic\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplintered-reality%2Fpy_trees","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsplintered-reality%2Fpy_trees","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplintered-reality%2Fpy_trees/lists"}