@@ -76,7 +76,8 @@ ObstacleAvoidancePlanner::ObstacleAvoidancePlanner(const rclcpp::NodeOptions & n
76
76
: Node(" obstacle_avoidance_planner" , node_options),
77
77
vehicle_info_ (vehicle_info_util::VehicleInfoUtil(*this ).getVehicleInfo()),
78
78
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>())
80
81
{
81
82
// interface publisher
82
83
traj_pub_ = create_publisher<Trajectory>(" ~/output/path" , 1 );
@@ -300,22 +301,15 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::generateOptimizedTrajecto
300
301
{
301
302
time_keeper_ptr_->tic (__func__);
302
303
303
- const auto & input_traj_points = planner_data.traj_points ;
304
-
305
304
// 1. calculate trajectory with MPT
306
305
// NOTE: This function may return previously optimized trajectory points.
307
306
// Also, velocity on some points will not be updated for a logic purpose.
308
307
auto optimized_traj_points = optimizeTrajectory (planner_data);
309
308
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
316
310
insertZeroVelocityOutsideDrivableArea (planner_data, optimized_traj_points);
317
311
318
- // 4 . publish debug marker
312
+ // 3 . publish debug marker
319
313
publishDebugMarkerOfOptimization (optimized_traj_points);
320
314
321
315
time_keeper_ptr_->toc (__func__, " " );
@@ -326,7 +320,8 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::optimizeTrajectory(
326
320
const PlannerData & planner_data)
327
321
{
328
322
time_keeper_ptr_->tic (__func__);
329
- const auto & p = planner_data;
323
+
324
+ const auto & input_traj_points = planner_data.traj_points ;
330
325
331
326
// 1. check if replan (= optimization) is required
332
327
const bool is_replan_required = [&]() {
@@ -341,19 +336,37 @@ std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::optimizeTrajectory(
341
336
}();
342
337
replan_checker_ptr_->updateData (planner_data, is_replan_required, now ());
343
338
if (!is_replan_required) {
344
- return getPrevOptimizedTrajectory (p. traj_points );
339
+ return getPrevOptimizedTrajectory (input_traj_points );
345
340
}
346
341
347
342
if (enable_skip_optimization_) {
348
- return p. traj_points ;
343
+ return input_traj_points ;
349
344
}
350
345
351
346
// 2. make trajectory kinematically-feasible and collision-free (= inside the drivable area)
352
347
// 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
+ }
354
367
355
368
time_keeper_ptr_->toc (__func__, " " );
356
- return mpt_traj ;
369
+ return optimized_traj_points ;
357
370
}
358
371
359
372
std::vector<TrajectoryPoint> ObstacleAvoidancePlanner::getPrevOptimizedTrajectory (
0 commit comments