19 #include "behaviortree_cpp_v3/controls/parallel_node.h"
21 constexpr
const char* BT::ParallelNode::THRESHOLD_FAILURE;
22 constexpr
const char* BT::ParallelNode::THRESHOLD_SUCCESS;
25 BT::ControlNode(name, {}),
26 success_threshold_(success_threshold),
27 failure_threshold_(failure_threshold),
28 read_parameter_from_ports_(
false){
29 setRegistrationID(
"Parallel_robot");
33 BT::ControlNode(name, config),
34 success_threshold_(1),
35 failure_threshold_(1),
36 read_parameter_from_ports_(true)
42 throw BT::RuntimeError(
"Missing parameter [",
THRESHOLD_SUCCESS,
"] in ParallelNode");
46 throw BT::RuntimeError(
"Missing parameter [",
THRESHOLD_FAILURE,
"] in ParallelNode");
50 size_t success_childred_num = 0;
51 size_t failure_childred_num = 0;
53 const size_t children_count = children_nodes_.size();
56 throw BT::LogicError(
"Number of children is less than threshold. Can never succeed.");
60 throw BT::LogicError(
"Number of children is less than threshold. Can never fail.");
64 for (
unsigned int i = 0; i < children_count; i++){
65 TreeNode* child_node = children_nodes_[i];
67 bool in_skip_list = (
skip_list_.count(i) != 0);
69 BT::NodeStatus child_status;
71 child_status = child_node->status();
74 child_status = child_node->executeTick();
77 switch (child_status){
78 case BT::NodeStatus::SUCCESS: {
82 success_childred_num++;
86 BT::ControlNode::ControlNode::
88 return BT::NodeStatus::SUCCESS;
93 case BT::NodeStatus::FAILURE: {
101 return BT::NodeStatus::FAILURE;
106 case BT::NodeStatus::RUNNING: {
107 return BT::NodeStatus::RUNNING;
112 throw BT::LogicError(
"A child node must never return IDLE");
117 return BT::NodeStatus::RUNNING;