diff --git a/behaviortree_ros2/bt_executor_parameters.md b/behaviortree_ros2/bt_executor_parameters.md
index 877d5ec..9b4cc93 100644
--- a/behaviortree_ros2/bt_executor_parameters.md
+++ b/behaviortree_ros2/bt_executor_parameters.md
@@ -72,3 +72,11 @@ List of 'package_name/subfolder' containing SubTrees to load into the BehaviorTr
*Constraints:*
- contains no duplicates
+
+## tree_on_initialization
+
+The name of the behavior tree to launch on intialization. Defaults to no behavior tree launched on initialization
+
+* Type: `string`
+* Default Value: ""
+* Read only: True
diff --git a/behaviortree_ros2/src/bt_executor_parameters.yaml b/behaviortree_ros2/src/bt_executor_parameters.yaml
index b6c36c1..5b2813e 100644
--- a/behaviortree_ros2/src/bt_executor_parameters.yaml
+++ b/behaviortree_ros2/src/bt_executor_parameters.yaml
@@ -47,3 +47,9 @@ bt_server:
unique<>: null,
}
}
+ tree_on_initialization: {
+ type: string,
+ default_value: "",
+ read_only: true,
+ description: "The name of the behavior tree to launch on intialization. Defaults to no behavior tree launched on initialization"
+ }
diff --git a/behaviortree_ros2/src/tree_execution_server.cpp b/behaviortree_ros2/src/tree_execution_server.cpp
index 80c112a..a58d641 100644
--- a/behaviortree_ros2/src/tree_execution_server.cpp
+++ b/behaviortree_ros2/src/tree_execution_server.cpp
@@ -33,6 +33,8 @@ struct TreeExecutionServer::Pimpl
rclcpp_action::Server<ExecuteTree>::SharedPtr action_server;
std::thread action_thread;
+ rclcpp_action::Client<ExecuteTree>::SharedPtr client_server;
+
std::shared_ptr<bt_server::ParamListener> param_listener;
bt_server::Params params;
@@ -71,6 +73,8 @@ TreeExecutionServer::TreeExecutionServer(const rclcpp::Node::SharedPtr& node)
handle_accepted(std::move(goal_handle));
});
+ p_->client_server = rclcpp_action::create_client<ExecuteTree>(node_, action_name);
+
// we use a wall timer to run asynchronously executeRegistration();
rclcpp::VoidCallbackType callback = [this]() {
if(!p_->factory_initialized_)
@@ -101,6 +105,16 @@ void TreeExecutionServer::executeRegistration()
// load trees (XML) from multiple directories
RegisterBehaviorTrees(p_->params, p_->factory, node_);
+ // launch initalization behavior tree if set
+ if(!p_->params.tree_on_initialization.empty())
+ {
+ auto goal_msg = ExecuteTree::Goal();
+ goal_msg.target_tree = p_->params.tree_on_initialization;
+
+ auto send_goal_options = rclcpp_action::Client<ExecuteTree>::SendGoalOptions();
+ p_->client_server->async_send_goal(goal_msg, send_goal_options);
+ }
+
p_->factory_initialized_ = true;
}