17 #include "nav2_behavior_tree/plugins/control/round_robin_node.hpp"
19 namespace nav2_behavior_tree
23 : BT::ControlNode::ControlNode(name, {}), wrap_around_(
false)
28 const std::string & name,
29 const BT::NodeConfiguration & config)
30 : BT::ControlNode(name, config)
32 getInput(
"wrap_around", wrap_around_);
37 const auto num_children = children_nodes_.size();
39 setStatus(BT::NodeStatus::RUNNING);
40 unsigned num_skipped_children = 0;
42 while (num_failed_children_ + num_skipped_children < num_children) {
43 TreeNode * child_node = children_nodes_[current_child_idx_];
44 const BT::NodeStatus child_status = child_node->executeTick();
46 if (child_status != BT::NodeStatus::RUNNING) {
48 if (++current_child_idx_ == num_children) {
50 current_child_idx_ = 0;
52 if (child_status == BT::NodeStatus::SKIPPED) {
53 num_skipped_children++;
54 }
else if (child_status == BT::NodeStatus::FAILURE) {
55 num_failed_children_++;
63 switch (child_status) {
64 case BT::NodeStatus::SUCCESS:
66 num_failed_children_ = 0;
67 ControlNode::haltChildren();
68 return BT::NodeStatus::SUCCESS;
71 case BT::NodeStatus::FAILURE:
73 num_failed_children_++;
77 case BT::NodeStatus::SKIPPED:
79 num_skipped_children++;
82 case BT::NodeStatus::RUNNING:
83 return BT::NodeStatus::RUNNING;
86 throw BT::LogicError(
"Invalid status return from BT node");
90 const bool all_skipped = (num_skipped_children == num_children);
93 return all_skipped ? BT::NodeStatus::SKIPPED : BT::NodeStatus::FAILURE;
99 current_child_idx_ = 0;
100 num_failed_children_ = 0;
105 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.