private: /** * @brief Node Execution Logic * @return BT::NodeStatus node status */ BT::NodeStatus tick() { if (!initialized_) Initialize(); auto now = std::chrono::high_resolution_clock::now(); auto elapsed = now - start_; auto seconds = std::chrono::duration_cast<std::chrono::duration<float>>(elapsed); if (first_time_ || seconds.count() >= period_) { first_time_ = false; const BT::NodeStatus child_status = child_node_->executeTick(); start_ = std::chrono::high_resolution_clock::now(); switch (child_status) { case BT::NodeStatus::RUNNING: return BT::NodeStatus::RUNNING; case BT::NodeStatus::SUCCESS: return BT::NodeStatus::SUCCESS; case BT::NodeStatus::FAILURE: default: return BT::NodeStatus::FAILURE; } } return BT::NodeStatus::FAILURE; }
bool first_time_; // first tiem execute child node bool initialized_; // initialization flag double period_; // execute child node period std::chrono::time_point<std::chrono::high_resolution_clock> start_; // start time of tick };
<SubTreeID="DilemmaSetControlHandler"> <input_portdefault="true"name="__shared_blackboard">If false (default), the Subtree has an isolated blackboard and needs port remapping</input_port> </SubTree>