Skip to content

Commit 7f8c7b6

Browse files
authored
Return time which was taken to compute the motion plan or execute recovery behaviour (#1829)
1 parent f3b7be2 commit 7f8c7b6

File tree

9 files changed

+52
-13
lines changed

9 files changed

+52
-13
lines changed

nav2_msgs/action/BackUp.action

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ geometry_msgs/Point target
33
float32 speed
44
---
55
#result definition
6-
std_msgs/Empty result
6+
builtin_interfaces/Duration total_elapsed_time
77
---
88
float32 distance_traveled

nav2_msgs/action/ComputePathToPose.action

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ string planner_id
44
---
55
#result definition
66
nav_msgs/Path path
7+
builtin_interfaces/Duration planning_time
78
---
89
#feedback

nav2_msgs/action/DummyRecovery.action

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
std_msgs/String command
33
---
44
#result definition
5-
std_msgs/Empty result
5+
builtin_interfaces/Duration total_elapsed_time
66
---
77
#feedback

nav2_msgs/action/Spin.action

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
float32 target_yaw
33
---
44
#result definition
5-
std_msgs/Empty result
5+
builtin_interfaces/Duration total_elapsed_time
66
---
77
float32 angular_distance_traveled

nav2_msgs/action/Wait.action

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
builtin_interfaces/Duration time
33
---
44
#result definition
5-
std_msgs/Empty result
5+
builtin_interfaces/Duration total_elapsed_time
66
---
77
#feedback
88
builtin_interfaces/Duration time_left

nav2_planner/include/nav2_planner/planner_server.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ class PlannerServer : public nav2_util::LifecycleNode
122122
double max_planner_duration_;
123123
std::string planner_ids_concat_;
124124

125+
// Clock
126+
rclcpp::Clock steady_clock_{RCL_STEADY_TIME};
127+
125128
// TF buffer
126129
std::shared_ptr<tf2_ros::Buffer> tf_;
127130

nav2_planner/src/planner_server.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ PlannerServer::on_shutdown(const rclcpp_lifecycle::State &)
207207
void
208208
PlannerServer::computePlan()
209209
{
210-
auto start_time = now();
210+
auto start_time = steady_clock_.now();
211211

212212
// Initialize the ComputePathToPose goal and result
213213
auto goal = action_server_->get_current_goal();
@@ -285,16 +285,18 @@ PlannerServer::computePlan()
285285
RCLCPP_DEBUG(get_logger(), "Publishing the valid path");
286286
publishPlan(result->path);
287287

288-
action_server_->succeeded_current(result);
288+
auto cycle_duration = steady_clock_.now() - start_time;
289+
result->planning_time = cycle_duration;
289290

290-
auto cycle_duration = (now() - start_time).seconds();
291-
if (max_planner_duration_ && cycle_duration > max_planner_duration_) {
291+
if (max_planner_duration_ && cycle_duration.seconds() > max_planner_duration_) {
292292
RCLCPP_WARN(
293293
get_logger(),
294294
"Planner loop missed its desired rate of %.4f Hz. Current loop rate is %.4f Hz",
295-
1 / max_planner_duration_, 1 / cycle_duration);
295+
1 / max_planner_duration_, 1 / cycle_duration.seconds());
296296
}
297297

298+
action_server_->succeeded_current(result);
299+
298300
return;
299301
} catch (std::exception & ex) {
300302
RCLCPP_WARN(

nav2_recoveries/include/nav2_recoveries/recovery.hpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ class Recovery : public nav2_core::Recovery
147147
std::string robot_base_frame_;
148148
double transform_tolerance_;
149149

150+
// Clock
151+
rclcpp::Clock steady_clock_{RCL_STEADY_TIME};
152+
150153
void execute()
151154
{
152155
RCLCPP_INFO(node_->get_logger(), "Attempting %s", recovery_name_.c_str());
@@ -167,13 +170,19 @@ class Recovery : public nav2_core::Recovery
167170
1s,
168171
[&]() {RCLCPP_INFO(node_->get_logger(), "%s running...", recovery_name_.c_str());});
169172

173+
auto start_time = steady_clock_.now();
174+
175+
// Initialize the ActionT result
176+
auto result = std::make_shared<typename ActionT::Result>();
177+
170178
rclcpp::Rate loop_rate(cycle_frequency_);
171179

172180
while (rclcpp::ok()) {
173181
if (action_server_->is_cancel_requested()) {
174182
RCLCPP_INFO(node_->get_logger(), "Canceling %s", recovery_name_.c_str());
175183
stopRobot();
176-
action_server_->terminate_all();
184+
result->total_elapsed_time = steady_clock_.now() - start_time;
185+
action_server_->terminate_all(result);
177186
return;
178187
}
179188

@@ -184,19 +193,22 @@ class Recovery : public nav2_core::Recovery
184193
" however feature is currently not implemented. Aborting and stopping.",
185194
recovery_name_.c_str());
186195
stopRobot();
187-
action_server_->terminate_current();
196+
result->total_elapsed_time = steady_clock_.now() - start_time;
197+
action_server_->terminate_current(result);
188198
return;
189199
}
190200

191201
switch (onCycleUpdate()) {
192202
case Status::SUCCEEDED:
193203
RCLCPP_INFO(node_->get_logger(), "%s completed successfully", recovery_name_.c_str());
194-
action_server_->succeeded_current();
204+
result->total_elapsed_time = steady_clock_.now() - start_time;
205+
action_server_->succeeded_current(result);
195206
return;
196207

197208
case Status::FAILED:
198209
RCLCPP_WARN(node_->get_logger(), "%s failed", recovery_name_.c_str());
199-
action_server_->terminate_current();
210+
result->total_elapsed_time = steady_clock_.now() - start_time;
211+
action_server_->terminate_current(result);
200212
return;
201213

202214
case Status::RUNNING:

nav2_recoveries/test/test_recoveries.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,27 @@ TEST_F(RecoveryTest, testingSequentialFailures)
232232
SUCCEED();
233233
}
234234

235+
TEST_F(RecoveryTest, testingTotalElapsedTimeIsGratherThanZeroIfStarted)
236+
{
237+
ASSERT_TRUE(sendCommand("Testing success"));
238+
EXPECT_GT(getResult().result->total_elapsed_time.sec, 0.0);
239+
SUCCEED();
240+
}
241+
242+
TEST_F(RecoveryTest, testingTotalElapsedTimeIsZeroIfFailureOnInit)
243+
{
244+
ASSERT_TRUE(sendCommand("Testing failure on init"));
245+
EXPECT_EQ(getResult().result->total_elapsed_time.sec, 0.0);
246+
SUCCEED();
247+
}
248+
249+
TEST_F(RecoveryTest, testingTotalElapsedTimeIsZeroIfFailureOnRun)
250+
{
251+
ASSERT_TRUE(sendCommand("Testing failure on run"));
252+
EXPECT_EQ(getResult().result->total_elapsed_time.sec, 0.0);
253+
SUCCEED();
254+
}
255+
235256
int main(int argc, char ** argv)
236257
{
237258
::testing::InitGoogleTest(&argc, argv);

0 commit comments

Comments
 (0)