Release 4.1... getting ready for Groot2
New features / important changes
Identifying Nodes
- The unique ID of the Nodes, i.e.
TreeNode::UID()
, is now deterministic and based on the Depth-first Traversal order (starting at 1). - Struct
Tree::Subtree
has now a unique human-readable identifier calledtree_ID
. - The
Tree::Subtree::tree_ID
is used to generate theTreeNode::fullPath()
, which is also a uniquely identified string, that contains the hierarchy in the tree and the name of the Node.
A great way to get familiar with the new UID and fullPath is to look at Tutorial 10, where a TreeObserver
is introduced too.
Tools to make debugging easier.
Version 4.1 introduces a new concept: node replacement. At deployment time, i.e. before the tree is instantiated, we can add "rules" to the BT factory to substitute certain Nodes with another implementations.
This is particularly useful when generating unit tests, i.e. when we want to substitute Nodes with dummy ones.
We provide a specific "dummy node" called TestNode that should cover the vast majority of the use cases.
Also, the TreeObserver is a great tool to create unit tests: it allows the user to check which Nodes have been ticked, and what they returned, in a non-intrusive way.
Dependencies and build
-
We removed the dependency from Boost, which was used only for its coroutine library. We use now minicoro. Boost is a "commodity" in Linux, but quite annoying for Windows users.
-
We now use conan to download dependencies in non-ROS builds.
Groot2 interface
We included the first, preliminary version of the Groot2Publisher, which can be used to communicate in real-time with Groot2 to do amazing things:
- real-time visualization of the BT status
- blackboard visualization
- insert breakpoints in the tree and wait for "Continue" in Groot2
- mocking of Nodes at run-time (force FAILURE or SUCCESS)
- fault injection: make a node fail to trigger the execution of recovery branches.
Important bug fixes
- #525 Pre-Condition : _skipIf NOT working with ReactiveSequence
- #517 Halting the tree doesn't set the root node to idle
- #515 "ReactiveSequence is not supposed to reach this point"
- #514 Changed behavior of tickOnce
- #507 _skipIf precondition does not work with SubTree
- #506 Floating point values set by Script cause Floating point truncated
- #505 'std::bad_alloc' when using Script node on Raspberry Pi
- #492 Threads::Threads errors when building a project based on BT.CPP
- #489 Port type mismatch between blackboard and subtree port
And probably others that I can't remember here