Toy example for running a simple behavior tree with ROS2
ros2 launch ros2_behavior_tree_example ping_pong_launch.py -s
Arguments (pass arguments as '<name>:=<value>'):
'node1_enable':
Enable Primary Node in case you want to launch separately. Valid choices are: ['True', 'False']
(default: 'True')
'node2_enable':
Enable Secondary Node in case you want to launch separately. Valid choices are: ['True', 'False']
(default: 'True')
'node1_mode':
Set trees to reactive sequence. Valid choices are: ['sequence', 'reactive_sequence']
(default: 'reactive_sequence')
'node2_mode':
Set trees to standard sequence. Valid choices are: ['sequence', 'reactive_sequence']
(default: 'sequence')
'node1_behaviortree':
Set behevior tree file to use desired nodes. Valid choices are: ['ping_pong.xml', 'ping_pong_no_decorator.xml', 'ping_pong_executor.xml']
(default: 'ping_pong_executor.xml')
'node2_behaviortree':
Set behavior tree file to use desired nodes. Valid choices are: ['ping_pong.xml', 'ping_pong_no_decorator.xml', 'ping_pong_executor.xml']
(default: 'ping_pong_no_decorator.xml')
> ros2 lifecycle set /primary_ping_pong configure
Transitioning successful
> ros2 lifecycle set /primary_ping_pong activate
Transitioning successful
> ros2 lifecycle set /secondary_ping_pong configure
Transitioning successful
> ros2 lifecycle set /secondary_ping_pong activate
Transitioning successful
ros2 lifecycle get /NODE_NAME # returns lifecycle node status
ros2 lifecycle list /NODE_NAME # returns all lifecycles we can transition to
ros2 lifecycle set /NODE_NAME # allows you to set a valid lifecycle from available transitions
Will increment each tick. Will only continue to next if the current one is "Pass". Once it hits an async node that returns running, it will keep calling it until it gets "success" or "failiure". Any "failiure" will make the sequence restart, sequence returns success once all have succeeded.
If the node below returns a failiure, it will switch to the next node in its line. Otherwise it will return Success. If all fallback nodes fail, this will also return fail.
Similar to a sequence, except when a node is running all nodes prior to it will still be called each tick.
Repeat is a decorator node that will cause the node or tree following it to be repeated a set number of times
This node is condition node that implements a ROS subscriber as part of the parent node. It will subscribe and record data.
On tick, if it received data it will return Success and update the received id in it's output port.
This node is condition node that implements a ROS subscriber with its own executor. It will subscribe and record data. By default, it will be on the same thread as the executor running in the calling node.
On tick, if it received data it will return Success and update the received id in it's output port.
This is an async action node that implements a ROS publisher that sends out an integer message as a ping. It takes in the number of pings to send and sends them each tick. It records the last ping sent on blackboard.
This node loginfos the status message defined in its inputport and outputs ping and pong information if set to do so.
This behavior tree utilizes a decorator to make the pong node repeatedly publish.
graph TD
Root --> FallBack
FallBack --> Sequence
FallBack --> LogStatus
Sequence --> PongReceived
Sequence --> RepeatDecorator --> PingNode
This behavior tree utilizes the async behavior of the ping node to repeatedly publish
graph TD;
Root --> FallBack
FallBack --> Sequence
FallBack --> LogStatus
Sequence --> PongReceived
Sequence --> PingNode
This behavior tree is the same as ping_pong
graph TD;
Root --> FallBack
FallBack --> Sequence
FallBack --> LogStatus
Sequence --> PongReceivedExecutor
Sequence --> PingNode
All the same behavior trees, however, instead of Sequence we have Reactive Sequence so we always check if we received a pong before shooting out all the pings instead of waiting for pings to complete before checking for a pong.