15#include "auto_apms_mission/mission_builder_base.hpp"
16#include "auto_apms_util/container.hpp"
24 MultiNodeMissionBuildHandler(rclcpp::Node::SharedPtr ros_node_ptr, NodeLoader::SharedPtr tree_node_loader_ptr)
25 : MissionBuildHandlerBase(
"multi_node_mission", ros_node_ptr, tree_node_loader_ptr)
30 MissionConfig createMissionConfig(
const std::string & build_request)
override final
41 for (
const TreeResource::Identity & r : trees) {
42 mission_sequence.insertTreeFromResource(r);
49 .set_clear_blackboard(
true)
50 .set_executor(MISSION_EXECUTOR_NAME);
53 void buildEventMonitor(
55 const std::vector<std::pair<TreeResource::Identity, TreeResource::Identity>> & contingencies,
56 const std::vector<std::pair<TreeResource::Identity, TreeResource::Identity>> & emergencies)
override final
60 MissionBuildHandlerBase::buildEventMonitor(event_monitor_tree, contingencies, emergencies);
61 event_monitor_tree.getFirstNode()
62 .setName(event_monitor_tree.getName())
63 .setConditionalScript(BT::PostCond::ON_SUCCESS,
"@event_id = event_id")
64 .setConditionalScript(BT::PostCond::ON_FAILURE,
"@event_id = ''");
66 main_tree.
insertNode<model::KeepRunningUntilFailure>().insertNode<model::ForceSuccess>().
insertTree(
71 model::Sequence run_once_seq = seq.
insertNode<model::RunOnce>().insertNode<model::Sequence>();
72 run_once_seq.insertNode<model::SetParameterString>()
73 .set_node(EVENT_MONITOR_EXECUTOR_NAME)
74 .set_parameter(
"bb.event_id")
77 .setName(
"StartDetachedEventMonitor")
79 .set_clear_blackboard(
false)
80 .set_executor(EVENT_MONITOR_EXECUTOR_NAME);
81 seq.insertNode<model::GetParameterString>()
82 .set_node(EVENT_MONITOR_EXECUTOR_NAME)
83 .set_parameter(
"bb.event_id")
84 .set_value(
"{event_id}");
87 void buildContingencyHandling(
89 const std::vector<std::pair<TreeResource::Identity, TreeResource::Identity>> & contingencies)
override final
93 model::Parallel parallel = handler_tree.
insertNode<model::Parallel>().set_success_count(1).set_failure_count(1);
94 parallel.
insertNode<model::KeepRunningUntilFailure>()
95 .insertNode<model::GetParameterString>()
96 .set_node(EVENT_MONITOR_EXECUTOR_NAME)
97 .set_parameter(
"bb.event_id")
98 .set_value(
"{event_id}");
100 MissionBuildHandlerBase::buildContingencyHandling(base_tree, contingencies);
101 parallel.insertNode<model::WaitValueUpdate>().set_entry(
"{event_id}").insertTree(base_tree);
104 .setName(handler_tree.getName())
106 .set_clear_blackboard(
true)
107 .set_executor(EVENT_HANDLER_EXECUTOR_NAME);
110 void buildEmergencyHandling(
112 const std::vector<std::pair<TreeResource::Identity, TreeResource::Identity>> & emergencies)
override final
116 model::Parallel parallel = handler_tree.
insertNode<model::Parallel>().set_success_count(1).set_failure_count(1);
117 parallel.
insertNode<model::KeepRunningUntilFailure>()
118 .insertNode<model::GetParameterString>()
119 .set_node(EVENT_MONITOR_EXECUTOR_NAME)
120 .set_parameter(
"bb.event_id")
121 .set_value(
"{event_id}");
123 MissionBuildHandlerBase::buildEmergencyHandling(base_tree, emergencies);
124 parallel.insertNode<model::WaitValueUpdate>().set_entry(
"{event_id}").insertTree(base_tree);
127 .setName(handler_tree.getName())
129 .set_clear_blackboard(
true)
130 .set_executor(EVENT_HANDLER_EXECUTOR_NAME);
136 model::SequenceWithMemory seq = sub_tree.removeChildren().insertNode<model::SequenceWithMemory>();
137 seq.insertNode<model::TerminateExecutor>().set_executor(EVENT_MONITOR_EXECUTOR_NAME);
142 MissionBuildHandlerBase::buildShutDown(temp, trees);
143 seq.insertTree(temp);
Handle for a single node of a TreeDocument.
virtual NodeElement & setName(const std::string &instance_name)
Assign a name for this specific node instance.
NodeElement insertTree(const TreeElement &tree, const NodeElement *before_this=nullptr)
Concatenate a tree and add its first child node to the children of this node.
NodeElement insertNode(const std::string &name, const NodeElement *before_this=nullptr)
Add a new node to the children of this node.
NodeElement & removeChildren()
Recursively remove all children of this node element.
Handle for a single behavior tree of a TreeDocument.
Base class for behavior tree build handlers that are used to configure missions including fallback me...
model::StartExecutor insertStartExecutorFromString(core::TreeDocument::NodeElement &parent, const std::string &tree_str, const core::TreeDocument::NodeElement *before_this=nullptr)
Helper that extends the children of a given parent node by a StartExecutor node for a specific behavi...
#define AUTO_APMS_BEHAVIOR_TREE_REGISTER_BUILD_HANDLER(type)
Macro for registering a behavior tree build handler plugin which may be loaded at runtime to build a ...
Mission design utilities incorporating behavior trees to model the complexity of arbitrary operations...
static MissionConfig fromResource(const MissionConfigResourceIdentity &identity)
Create a mission configuration from an installed resource.