17 #include "nav2_behavior_tree/plugins/control/round_robin_node.hpp"
19 namespace nav2_behavior_tree
23 : BT::ControlNode::ControlNode(name, {})
28 const std::string & name,
29 const BT::NodeConfiguration & config)
30 : BT::ControlNode(name, config)
36 const auto num_children = children_nodes_.size();
38 setStatus(BT::NodeStatus::RUNNING);
39 unsigned num_skipped_children = 0;
41 while (num_failed_children_ + num_skipped_children < num_children) {
42 TreeNode * child_node = children_nodes_[current_child_idx_];
43 const BT::NodeStatus child_status = child_node->executeTick();
45 if (child_status != BT::NodeStatus::RUNNING) {
47 if (++current_child_idx_ == num_children) {
48 current_child_idx_ = 0;
52 switch (child_status) {
53 case BT::NodeStatus::SUCCESS:
55 num_failed_children_ = 0;
56 ControlNode::haltChildren();
57 return BT::NodeStatus::SUCCESS;
60 case BT::NodeStatus::FAILURE:
62 num_failed_children_++;
66 case BT::NodeStatus::SKIPPED:
68 num_skipped_children++;
71 case BT::NodeStatus::RUNNING:
72 return BT::NodeStatus::RUNNING;
75 throw BT::LogicError(
"Invalid status return from BT node");
79 const bool all_skipped = (num_skipped_children == num_children);
82 return all_skipped ? BT::NodeStatus::SKIPPED : BT::NodeStatus::FAILURE;
88 current_child_idx_ = 0;
89 num_failed_children_ = 0;
94 BT_REGISTER_NODES(factory)
Type of sequence node that ticks children in a round-robin fashion.
void halt() override
The other (optional) override required by a BT action to reset node state.
BT::NodeStatus tick() override
The main override required by a BT action.
RoundRobinNode(const std::string &name)
A constructor for nav2_behavior_tree::RoundRobinNode.