Skip to content

Commit 188b6c7

Browse files
Added conditional timer and logging\n
Signed-off-by: Arjun Jagdish Ram <arjun.ram@tier4.jp>
1 parent 5334ab8 commit 188b6c7

File tree

5 files changed

+67
-23
lines changed

5 files changed

+67
-23
lines changed

planning/obstacle_avoidance_planner/include/obstacle_avoidance_planner/mpt_optimizer.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class MPTOptimizer
177177
const std::shared_ptr<DebugData> debug_data_ptr,
178178
const std::shared_ptr<TimeKeeper> time_keeper_ptr);
179179

180-
std::vector<TrajectoryPoint> optimizeTrajectory(
180+
std::pair<std::vector<TrajectoryPoint>, int> optimizeTrajectory(
181181
const PlannerData & planner_data, const std::vector<TrajectoryPoint> & smoothed_points);
182182
std::optional<std::vector<TrajectoryPoint>> getPrevOptimizedTrajectoryPoints() const;
183183

planning/obstacle_avoidance_planner/include/obstacle_avoidance_planner/node.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "obstacle_avoidance_planner/mpt_optimizer.hpp"
2121
#include "obstacle_avoidance_planner/replan_checker.hpp"
2222
#include "obstacle_avoidance_planner/type_alias.hpp"
23+
#include "obstacle_avoidance_planner/utils/conditional_timer.hpp"
2324
#include "rclcpp/rclcpp.hpp"
2425
#include "tier4_autoware_utils/ros/logger_level_configure.hpp"
2526
#include "tier4_autoware_utils/tier4_autoware_utils.hpp"
@@ -59,6 +60,7 @@ class ObstacleAvoidancePlanner : public rclcpp::Node
5960
vehicle_info_util::VehicleInfo vehicle_info_{};
6061
mutable std::shared_ptr<DebugData> debug_data_ptr_{nullptr};
6162
mutable std::shared_ptr<TimeKeeper> time_keeper_ptr_{nullptr};
63+
mutable std::shared_ptr<ConditionalTimer> conditional_timer_{nullptr};
6264

6365
// flags for some functions
6466
bool enable_pub_debug_marker_;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#include <chrono>
4+
#include <optional>
5+
6+
class ConditionalTimer {
7+
public:
8+
void update(bool condition) {
9+
if (condition && !start_time_.has_value()) {
10+
// Condition met, start the timer
11+
start_time_ = std::chrono::high_resolution_clock::now();
12+
} else if (!condition && start_time_.has_value()) {
13+
// Condition no longer met, stop the timer
14+
start_time_ = std::nullopt;
15+
}
16+
}
17+
18+
std::chrono::duration<double> getElapsedTime() const {
19+
if (start_time_.has_value()) {
20+
auto current_time = std::chrono::high_resolution_clock::now();
21+
return current_time - *start_time_;
22+
} else {
23+
return std::chrono::duration<double>(0.0);;
24+
}
25+
}
26+
27+
private:
28+
std::optional<std::chrono::time_point<std::chrono::high_resolution_clock>> start_time_{std::nullopt};
29+
};

planning/obstacle_avoidance_planner/src/mpt_optimizer.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -473,15 +473,15 @@ void MPTOptimizer::onParam(const std::vector<rclcpp::Parameter> & parameters)
473473
debug_data_ptr_->mpt_visualize_sampling_num = mpt_param_.mpt_visualize_sampling_num;
474474
}
475475

476-
std::vector<TrajectoryPoint> MPTOptimizer::optimizeTrajectory(
476+
std::pair<std::vector<TrajectoryPoint>, int> MPTOptimizer::optimizeTrajectory(
477477
const PlannerData & planner_data, const std::vector<TrajectoryPoint> & smoothed_points)
478478
{
479479
time_keeper_ptr_->tic(__func__);
480480

481481
const auto & p = planner_data;
482482
const auto & traj_points = p.traj_points;
483483

484-
const auto get_prev_optimized_traj_points = [&]() {
484+
auto get_prev_optimized_traj_points = [&]() {
485485
if (prev_optimized_traj_points_ptr_) {
486486
return *prev_optimized_traj_points_ptr_;
487487
}
@@ -493,7 +493,7 @@ std::vector<TrajectoryPoint> MPTOptimizer::optimizeTrajectory(
493493
if (ref_points.size() < 2) {
494494
RCLCPP_INFO_EXPRESSION(
495495
logger_, enable_debug_info_, "return std::nullopt since ref_points size is less than 2.");
496-
return get_prev_optimized_traj_points();
496+
return std::make_pair<std::vector<TrajectoryPoint>, int>(get_prev_optimized_traj_points(), -1);
497497
}
498498

499499
// 2. calculate B and W matrices where x = B u + W
@@ -528,14 +528,14 @@ std::vector<TrajectoryPoint> MPTOptimizer::optimizeTrajectory(
528528
RCLCPP_INFO_STREAM(logger_, "obj_mat: " << obj_mat);
529529
RCLCPP_INFO_STREAM(logger_, "const_mat: " << const_mat);
530530

531-
return get_prev_optimized_traj_points();
531+
return std::make_pair<std::vector<TrajectoryPoint>, int>(get_prev_optimized_traj_points(), -1);
532532
}
533533

534534
// 7. convert to points with validation
535-
const auto mpt_traj_points = calcMPTPoints(ref_points, *optimized_variables, mpt_mat);
535+
auto mpt_traj_points = calcMPTPoints(ref_points, *optimized_variables, mpt_mat);
536536
if (!mpt_traj_points) {
537537
RCLCPP_WARN(logger_, "return std::nullopt since lateral or yaw error is too large.");
538-
return get_prev_optimized_traj_points();
538+
return std::make_pair<std::vector<TrajectoryPoint>, int>(get_prev_optimized_traj_points(), -1);
539539
}
540540

541541
// 8. publish trajectories for debug
@@ -548,7 +548,7 @@ std::vector<TrajectoryPoint> MPTOptimizer::optimizeTrajectory(
548548
prev_optimized_traj_points_ptr_ =
549549
std::make_shared<std::vector<TrajectoryPoint>>(*mpt_traj_points);
550550

551-
return *mpt_traj_points;
551+
return std::make_pair<std::vector<TrajectoryPoint>, int>(std::move(*mpt_traj_points), 1);
552552
}
553553

554554
std::optional<std::vector<TrajectoryPoint>> MPTOptimizer::getPrevOptimizedTrajectoryPoints() const

planning/obstacle_avoidance_planner/src/node.cpp

+28-15
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ ObstacleAvoidancePlanner::ObstacleAvoidancePlanner(const rclcpp::NodeOptions & n
7676
: Node("obstacle_avoidance_planner", node_options),
7777
vehicle_info_(vehicle_info_util::VehicleInfoUtil(*this).getVehicleInfo()),
7878
debug_data_ptr_(std::make_shared<DebugData>()),
79-
time_keeper_ptr_(std::make_shared<TimeKeeper>())
79+
time_keeper_ptr_(std::make_shared<TimeKeeper>()),
80+
conditional_timer_(std::make_shared<ConditionalTimer>())
8081
{
8182
// interface publisher
8283
traj_pub_ = create_publisher<Trajectory>("~/output/path", 1);
@@ -300,22 +301,15 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::generateOptimizedTrajecto
300301
{
301302
time_keeper_ptr_->tic(__func__);
302303

303-
const auto & input_traj_points = planner_data.traj_points;
304-
305304
// 1. calculate trajectory with MPT
306305
// NOTE: This function may return previously optimized trajectory points.
307306
// Also, velocity on some points will not be updated for a logic purpose.
308307
auto optimized_traj_points = optimizeTrajectory(planner_data);
309308

310-
// 2. update velocity
311-
// NOTE: When optimization failed or is skipped, velocity in trajectory points must
312-
// be updated since velocity in input trajectory (path) may change.
313-
applyInputVelocity(optimized_traj_points, input_traj_points, planner_data.ego_pose); // within 3s period
314-
315-
// 3. insert zero velocity when trajectory is over drivable area
309+
// 2. insert zero velocity when trajectory is over drivable area
316310
insertZeroVelocityOutsideDrivableArea(planner_data, optimized_traj_points);
317311

318-
// 4. publish debug marker
312+
// 3. publish debug marker
319313
publishDebugMarkerOfOptimization(optimized_traj_points);
320314

321315
time_keeper_ptr_->toc(__func__, " ");
@@ -326,7 +320,8 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::optimizeTrajectory(
326320
const PlannerData & planner_data)
327321
{
328322
time_keeper_ptr_->tic(__func__);
329-
const auto & p = planner_data;
323+
324+
const auto & input_traj_points = planner_data.traj_points;
330325

331326
// 1. check if replan (= optimization) is required
332327
const bool is_replan_required = [&]() {
@@ -341,19 +336,37 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::optimizeTrajectory(
341336
}();
342337
replan_checker_ptr_->updateData(planner_data, is_replan_required, now());
343338
if (!is_replan_required) {
344-
return getPrevOptimizedTrajectory(p.traj_points);
339+
return getPrevOptimizedTrajectory(input_traj_points);
345340
}
346341

347342
if (enable_skip_optimization_) {
348-
return p.traj_points;
343+
return input_traj_points;
349344
}
350345

351346
// 2. make trajectory kinematically-feasible and collision-free (= inside the drivable area)
352347
// with model predictive trajectory
353-
const auto mpt_traj = mpt_optimizer_ptr_->optimizeTrajectory(planner_data, p.traj_points);
348+
const auto mpt_traj = mpt_optimizer_ptr_->optimizeTrajectory(planner_data, input_traj_points);
349+
350+
const int optimized_traj_status = mpt_traj.second;
351+
const bool optimized_traj_failed = (optimized_traj_status == -1);
352+
353+
conditional_timer_->update(optimized_traj_failed);
354+
355+
const double elapsed_time = conditional_timer_->getElapsedTime().count();
356+
const bool elapsed_time_over_three_seconds = (elapsed_time > 3.0);
357+
358+
auto optimized_traj_points = std::move(optimized_traj_failed && elapsed_time_over_three_seconds ? input_traj_points : mpt_traj.first);
359+
const bool apply_input_velocity = optimized_traj_failed && elapsed_time_over_three_seconds;
360+
361+
if (!apply_input_velocity) {
362+
// 3. update velocity
363+
// NOTE: When optimization failed or is skipped, velocity in trajectory points must
364+
// be updated since velocity in input trajectory (path) may change.
365+
applyInputVelocity(optimized_traj_points, input_traj_points, planner_data.ego_pose);
366+
}
354367

355368
time_keeper_ptr_->toc(__func__, " ");
356-
return mpt_traj;
369+
return optimized_traj_points;
357370
}
358371

359372
std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::getPrevOptimizedTrajectory(

0 commit comments

Comments
 (0)