@@ -33,6 +33,8 @@ struct TreeExecutionServer::Pimpl
33
33
rclcpp_action::Server<ExecuteTree>::SharedPtr action_server;
34
34
std::thread action_thread;
35
35
36
+ rclcpp_action::Client<ExecuteTree>::SharedPtr client_server;
37
+
36
38
std::shared_ptr<bt_server::ParamListener> param_listener;
37
39
bt_server::Params params;
38
40
@@ -71,6 +73,8 @@ TreeExecutionServer::TreeExecutionServer(const rclcpp::Node::SharedPtr& node)
71
73
handle_accepted (std::move (goal_handle));
72
74
});
73
75
76
+ p_->client_server = rclcpp_action::create_client<ExecuteTree>(node, action_name);
77
+
74
78
// we use a wall timer to run asynchronously executeRegistration();
75
79
rclcpp::VoidCallbackType callback = [this ]() {
76
80
if (!p_->factory_initialized_ )
@@ -102,6 +106,16 @@ void TreeExecutionServer::executeRegistration()
102
106
RegisterBehaviorTrees (p_->params , p_->factory , node_);
103
107
104
108
p_->factory_initialized_ = true ;
109
+
110
+ // launch initalization behavior tree if set
111
+ if (!p_->params .tree_on_initialization .empty ())
112
+ {
113
+ auto goal_msg = ExecuteTree::Goal ();
114
+ goal_msg.target_tree = p_->params .tree_on_initialization ;
115
+
116
+ auto send_goal_options = rclcpp_action::Client<ExecuteTree>::SendGoalOptions ();
117
+ p_->client_server ->async_send_goal (goal_msg, send_goal_options);
118
+ }
105
119
}
106
120
107
121
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr
0 commit comments