Skip to content

Commit 6f27d01

Browse files
authored
WIP: Make BT nodes have configurable wait times. (#3960)
* Make BT nodes have configurable wait times. Previous solution provided hardcoded 1s value. Right now the value can be configured for BT Action, Cancel and Service nodes. [#3920] Signed-off-by: Adam Galecki <[email protected]> * Make BT nodes have configurable wait times. Previous solution provided hardcoded 1s value. Right now the value can be configured for BT Action, Cancel and Service nodes. [#3920] Signed-off-by: Adam Galecki <[email protected]> * Fix typos, linting errors and value type from float to int * Fix extra underscores * Fix extra underscore * Update unit tests with blackboard parameter Signed-off-by: Adam Galecki <[email protected]> * Fix formatting errors Signed-off-by: Adam Galecki <[email protected]> * Update system tests to match new parameter Signed-off-by: Adam Galecki <[email protected]> --------- Signed-off-by: Adam Galecki <[email protected]>
1 parent d9bea52 commit 6f27d01

31 files changed

+100
-3
lines changed

nav2_behavior_tree/include/nav2_behavior_tree/bt_action_node.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class BtActionNode : public BT::ActionNodeBase
6161
server_timeout_ =
6262
config().blackboard->template get<std::chrono::milliseconds>("server_timeout");
6363
getInput<std::chrono::milliseconds>("server_timeout", server_timeout_);
64+
wait_for_service_timeout_ =
65+
config().blackboard->template get<std::chrono::milliseconds>("wait_for_service_timeout");
6466

6567
// Initialize the input and output messages
6668
goal_ = typename ActionT::Goal();
@@ -93,7 +95,7 @@ class BtActionNode : public BT::ActionNodeBase
9395

9496
// Make sure the server is actually there before continuing
9597
RCLCPP_DEBUG(node_->get_logger(), "Waiting for \"%s\" action server", action_name.c_str());
96-
if (!action_client_->wait_for_action_server(1s)) {
98+
if (!action_client_->wait_for_action_server(wait_for_service_timeout_)) {
9799
RCLCPP_ERROR(
98100
node_->get_logger(), "\"%s\" action server not available after waiting for 1 s",
99101
action_name.c_str());
@@ -462,6 +464,9 @@ class BtActionNode : public BT::ActionNodeBase
462464
// The timeout value for BT loop execution
463465
std::chrono::milliseconds bt_loop_duration_;
464466

467+
// The timeout value for waiting for a service to response
468+
std::chrono::milliseconds wait_for_service_timeout_;
469+
465470
// To track the action server acknowledgement when a new goal is sent
466471
std::shared_ptr<std::shared_future<typename rclcpp_action::ClientGoalHandle<ActionT>::SharedPtr>>
467472
future_goal_handle_;

nav2_behavior_tree/include/nav2_behavior_tree/bt_action_server.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,9 @@ class BtActionServer
248248
// Default timeout value while waiting for response from a server
249249
std::chrono::milliseconds default_server_timeout_;
250250

251+
// The timeout value for waiting for a service to response
252+
std::chrono::milliseconds wait_for_service_timeout_;
253+
251254
// User-provided callbacks
252255
OnGoalReceivedCallback on_goal_received_callback_;
253256
OnLoopCallback on_loop_callback_;

nav2_behavior_tree/include/nav2_behavior_tree/bt_action_server_impl.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ bool BtActionServer<ActionT>::on_configure()
158158
int default_server_timeout;
159159
node->get_parameter("default_server_timeout", default_server_timeout);
160160
default_server_timeout_ = std::chrono::milliseconds(default_server_timeout);
161+
int wait_for_service_timeout;
162+
node->get_parameter("wait_for_service_timeout", wait_for_service_timeout);
163+
wait_for_service_timeout_ = std::chrono::milliseconds(wait_for_service_timeout);
161164

162165
// Get error code id names to grab off of the blackboard
163166
error_code_names_ = node->get_parameter("error_code_names").as_string_array();
@@ -172,6 +175,9 @@ bool BtActionServer<ActionT>::on_configure()
172175
blackboard_->set<rclcpp::Node::SharedPtr>("node", client_node_); // NOLINT
173176
blackboard_->set<std::chrono::milliseconds>("server_timeout", default_server_timeout_); // NOLINT
174177
blackboard_->set<std::chrono::milliseconds>("bt_loop_duration", bt_loop_duration_); // NOLINT
178+
blackboard_->set<std::chrono::milliseconds>(
179+
"wait_for_service_timeout",
180+
wait_for_service_timeout_);
175181

176182
return true;
177183
}
@@ -235,6 +241,9 @@ bool BtActionServer<ActionT>::loadBehaviorTree(const std::string & bt_xml_filena
235241
blackboard->set<rclcpp::Node::SharedPtr>("node", client_node_);
236242
blackboard->set<std::chrono::milliseconds>("server_timeout", default_server_timeout_);
237243
blackboard->set<std::chrono::milliseconds>("bt_loop_duration", bt_loop_duration_);
244+
blackboard->set<std::chrono::milliseconds>(
245+
"wait_for_service_timeout",
246+
wait_for_service_timeout_);
238247
}
239248
} catch (const std::exception & e) {
240249
RCLCPP_ERROR(logger_, "Exception when loading BT: %s", e.what());

nav2_behavior_tree/include/nav2_behavior_tree/bt_cancel_action_node.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class BtCancelActionNode : public BT::ActionNodeBase
5959
server_timeout_ =
6060
config().blackboard->template get<std::chrono::milliseconds>("server_timeout");
6161
getInput<std::chrono::milliseconds>("server_timeout", server_timeout_);
62+
wait_for_service_timeout_ =
63+
config().blackboard->template get<std::chrono::milliseconds>("wait_for_service_timeout");
6264

6365
std::string remapped_action_name;
6466
if (getInput("server_name", remapped_action_name)) {
@@ -89,7 +91,7 @@ class BtCancelActionNode : public BT::ActionNodeBase
8991

9092
// Make sure the server is actually there before continuing
9193
RCLCPP_DEBUG(node_->get_logger(), "Waiting for \"%s\" action server", action_name.c_str());
92-
if (!action_client_->wait_for_action_server(1s)) {
94+
if (!action_client_->wait_for_action_server(wait_for_service_timeout_)) {
9395
RCLCPP_ERROR(
9496
node_->get_logger(), "\"%s\" action server not available after waiting for 1 s",
9597
action_name.c_str());
@@ -168,6 +170,8 @@ class BtCancelActionNode : public BT::ActionNodeBase
168170
// The timeout value while waiting for response from a server when a
169171
// new action goal is canceled
170172
std::chrono::milliseconds server_timeout_;
173+
// The timeout value for waiting for a service to response
174+
std::chrono::milliseconds wait_for_service_timeout_;
171175
};
172176

173177
} // namespace nav2_behavior_tree

nav2_behavior_tree/include/nav2_behavior_tree/bt_service_node.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class BtServiceNode : public BT::ActionNodeBase
6262
server_timeout_ =
6363
config().blackboard->template get<std::chrono::milliseconds>("server_timeout");
6464
getInput<std::chrono::milliseconds>("server_timeout", server_timeout_);
65+
wait_for_service_timeout_ =
66+
config().blackboard->template get<std::chrono::milliseconds>("wait_for_service_timeout");
6567

6668
// Now that we have node_ to use, create the service client for this BT service
6769
getInput("service_name", service_name_);
@@ -77,7 +79,7 @@ class BtServiceNode : public BT::ActionNodeBase
7779
RCLCPP_DEBUG(
7880
node_->get_logger(), "Waiting for \"%s\" service",
7981
service_name_.c_str());
80-
if (!service_client_->wait_for_service(1s)) {
82+
if (!service_client_->wait_for_service(wait_for_service_timeout_)) {
8183
RCLCPP_ERROR(
8284
node_->get_logger(), "\"%s\" service server not available after waiting for 1 s",
8385
service_node_name.c_str());
@@ -249,6 +251,9 @@ class BtServiceNode : public BT::ActionNodeBase
249251
// The timeout value for BT loop execution
250252
std::chrono::milliseconds bt_loop_duration_;
251253

254+
// The timeout value for waiting for a service to response
255+
std::chrono::milliseconds wait_for_service_timeout_;
256+
252257
// To track the server response when a new request is sent
253258
std::shared_future<typename ServiceT::Response::SharedPtr> future_result_;
254259
bool request_sent_{false};

nav2_behavior_tree/test/plugins/action/test_assisted_teleop_action.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ class AssistedTeleopActionTestFixture : public ::testing::Test
6868
config_->blackboard->set<std::chrono::milliseconds>(
6969
"bt_loop_duration",
7070
std::chrono::milliseconds(10));
71+
config_->blackboard->set<std::chrono::milliseconds>(
72+
"wait_for_service_timeout",
73+
std::chrono::milliseconds(1000));
7174
config_->blackboard->set<bool>("initial_pose_received", false);
7275
config_->blackboard->set<int>("number_recoveries", 0);
7376

nav2_behavior_tree/test/plugins/action/test_assisted_teleop_cancel_node.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ class CancelAssistedTeleopActionTestFixture : public ::testing::Test
6565
config_->blackboard->set<std::chrono::milliseconds>(
6666
"bt_loop_duration",
6767
std::chrono::milliseconds(10));
68+
config_->blackboard->set<std::chrono::milliseconds>(
69+
"wait_for_service_timeout",
70+
std::chrono::milliseconds(1000));
6871
client_ = rclcpp_action::create_client<nav2_msgs::action::AssistedTeleop>(
6972
node_, "assisted_teleop");
7073

nav2_behavior_tree/test/plugins/action/test_back_up_action.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ class BackUpActionTestFixture : public ::testing::Test
6868
config_->blackboard->set<std::chrono::milliseconds>(
6969
"bt_loop_duration",
7070
std::chrono::milliseconds(10));
71+
config_->blackboard->set<std::chrono::milliseconds>(
72+
"wait_for_service_timeout",
73+
std::chrono::milliseconds(1000));
7174
config_->blackboard->set<bool>("initial_pose_received", false);
7275
config_->blackboard->set<int>("number_recoveries", 0);
7376

nav2_behavior_tree/test/plugins/action/test_back_up_cancel_node.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class CancelBackUpActionTestFixture : public ::testing::Test
6464
config_->blackboard->set<std::chrono::milliseconds>(
6565
"bt_loop_duration",
6666
std::chrono::milliseconds(10));
67+
config_->blackboard->set<std::chrono::milliseconds>(
68+
"wait_for_service_timeout",
69+
std::chrono::milliseconds(1000));
6770
client_ = rclcpp_action::create_client<nav2_msgs::action::BackUp>(
6871
node_, "back_up");
6972

nav2_behavior_tree/test/plugins/action/test_bt_action_node.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class BTActionNodeTestFixture : public ::testing::Test
173173
config_->blackboard->set<rclcpp::Node::SharedPtr>("node", node_);
174174
config_->blackboard->set<std::chrono::milliseconds>("server_timeout", 20ms);
175175
config_->blackboard->set<std::chrono::milliseconds>("bt_loop_duration", 10ms);
176+
config_->blackboard->set<std::chrono::milliseconds>("wait_for_service_timeout", 1000ms);
176177
config_->blackboard->set<bool>("initial_pose_received", false);
177178
config_->blackboard->set<bool>("on_cancelled_triggered", false);
178179

0 commit comments

Comments
 (0)