Writing a RateControlNode
Overview
This tutorial demonstrates the careBT RateControlNode. Therefore the SimpleRateControl node
is implemented which has one child, the AddTwoNumbersMultiTickAction. The SimpleRateControl node
throttles the tick rate of the AddTwoNumbersMultiTickAction node to 1000 ms.
Create the SimpleRateControl node
Create a file named ratecontrol.py with following content.
Or use the provided file: ratecontrol.py
1from carebt import RateControlNode
2from carebt.examples.longrun_actions import AddTwoNumbersMultiTickAction
3
4
5class SimpleRateControl(RateControlNode):
6 """The `SimpleRateControl` example node.
7
8 The `SimpleRateControl` has one child. In this example this is the
9 `AddTwoNumbersMultiTickAction`. This node has no throttling. Due to
10 the `RateControlNode` such a throttling can be implemented without
11 changing the original source code of the node. Here, this throttling
12 rate is set to 1000 ms.
13
14 Input Parameters
15 ----------------
16 ?ticks : int
17 The number of ticks the calculation takes
18 ?a : int
19 The first value
20 ?b : int
21 The second value
22
23 """
24
25 def __init__(self, bt_runner):
26 super().__init__(bt_runner, 1000, '?ticks ?a ?b')
27
28 def on_init(self) -> None:
29 self.set_child(AddTwoNumbersMultiTickAction, '?ticks ?a ?b => ?result')
The code explained
The constructor (__init__) of the SimpleRateControl node needs to call the constructor (super().__init__)
of the RateControlNode and passes the bt_runner, the throttling rate in ms and the signature as arguments.
def __init__(self, bt_runner):
super().__init__(bt_runner, 1000, '?ticks ?a ?b')
In the on_init function the child node is added.
def on_init(self) -> None:
self.set_child(AddTwoNumbersMultiTickAction, '?ticks ?a ?b => ?result')
Run the example
Start the Python interpreter and run the SimpleRateControl node:
>>> import carebt
>>> from carebt.examples.ratecontrol import SimpleRateControl
>>> bt_runner = carebt.BehaviorTreeRunner()
>>> bt_runner.run(SimpleRateControl, '5 2 3 => ?result')
AddTwoNumbersMultiTickAction: (tick_count = 1/5)
AddTwoNumbersMultiTickAction: (tick_count = 2/5)
AddTwoNumbersMultiTickAction: (tick_count = 3/5)
AddTwoNumbersMultiTickAction: (tick_count = 4/5)
AddTwoNumbersMultiTickAction: DONE 2 + 3 = 5
The AddTwoNumbersMultiTickAction node is executed until the fifth tick completes
the execution of the node. The time between the ticks is 1000 ms.