123 TriggerActionContext trigger_action_context_;
124 std::map<rclcpp_action::GoalUUID, TreeConstructor> pending_tree_constructors_;
131 rclcpp_action::GoalResponse handle_trigger_goal_(
132 const rclcpp_action::GoalUUID & uuid, std::shared_ptr<const TriggerGoal> goal_ptr);
133 rclcpp_action::CancelResponse handle_trigger_cancel_(std::shared_ptr<TriggerGoalHandle> goal_handle_ptr);
134 void handle_trigger_accept_(std::shared_ptr<TriggerGoalHandle> goal_handle_ptr);
136 typename rclcpp_action::Server<ActionT>::SharedPtr trigger_action_ptr_;
143template <
typename ActionT>
145 const std::string & name,
const std::string & action_name, Options options)
148 using namespace std::placeholders;
149 trigger_action_ptr_ = rclcpp_action::create_server<ActionT>(
150 node_ptr_, action_name, std::bind(&ActionBasedTreeExecutorNode::handle_trigger_goal_,
this, _1, _2),
151 std::bind(&ActionBasedTreeExecutorNode::handle_trigger_cancel_,
this, _1),
152 std::bind(&ActionBasedTreeExecutorNode::handle_trigger_accept_,
this, _1));
155template <
typename ActionT>
157 const std::string & name,
const std::string & action_name, rclcpp::NodeOptions ros_options)
162template <
typename ActionT>
164 const rclcpp_action::GoalUUID & uuid, std::shared_ptr<const TriggerGoal> )
168 logger_,
"Goal %s was REJECTED: Tree '%s' is currently executing.", rclcpp_action::to_string(uuid).c_str(),
175template <
typename ActionT>
180template <
typename ActionT>
183 trigger_action_context_.setUp(goal_handle_ptr);
184 RCLCPP_INFO(
logger_,
"Successfully started execution of tree '%s' via action trigger.",
getTreeName().c_str());
187template <
typename ActionT>
212template <
typename ActionT>
213void ActionBasedTreeExecutorNode<ActionT>::onTermination(
const ExecutionResult & result)
215 if (trigger_action_context_.isValid()) {
216 onGoalExecutionTermination(result, trigger_action_context_);
217 trigger_action_context_.invalidate();
221template <
typename ActionT>
222rclcpp_action::GoalResponse ActionBasedTreeExecutorNode<ActionT>::handle_trigger_goal_(
223 const rclcpp_action::GoalUUID & uuid, std::shared_ptr<const TriggerGoal> goal_ptr)
225 if (!shouldAcceptGoal(uuid, goal_ptr)) {
226 return rclcpp_action::GoalResponse::REJECT;
230 pending_tree_constructors_[uuid] = getTreeConstructorFromGoal(goal_ptr);
231 }
catch (
const std::exception & e) {
233 logger_,
"Goal %s was REJECTED: Exception in getTreeConstructorFromGoal(): %s",
234 rclcpp_action::to_string(uuid).c_str(), e.what());
235 return rclcpp_action::GoalResponse::REJECT;
237 return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
240template <
typename ActionT>
241rclcpp_action::CancelResponse ActionBasedTreeExecutorNode<ActionT>::handle_trigger_cancel_(
242 std::shared_ptr<TriggerGoalHandle> )
244 setControlCommand(ControlCommand::TERMINATE);
245 return rclcpp_action::CancelResponse::ACCEPT;
248template <
typename ActionT>
249void ActionBasedTreeExecutorNode<ActionT>::handle_trigger_accept_(std::shared_ptr<TriggerGoalHandle> goal_handle_ptr)
251 onAcceptedGoal(goal_handle_ptr);
253 const rclcpp_action::GoalUUID uuid = goal_handle_ptr->get_goal_id();
254 auto node = pending_tree_constructors_.extract(uuid);
256 RCLCPP_ERROR(logger_,
"No pending tree constructor found for goal %s.", rclcpp_action::to_string(uuid).c_str());
257 auto result_ptr = std::make_shared<TriggerResult>();
258 goal_handle_ptr->abort(result_ptr);
261 TreeConstructor tree_constructor = std::move(node.mapped());
263 const ExecutorParameters params = executor_param_listener_.get_params();
265 startExecution(tree_constructor, params.tick_rate, params.groot2_port);
266 }
catch (
const std::exception & e) {
267 auto result_ptr = std::make_shared<TriggerResult>();
268 goal_handle_ptr->abort(result_ptr);
269 RCLCPP_ERROR(logger_,
"An error occurred trying to start execution: %s", e.what());
273 onExecutionStarted(goal_handle_ptr);