132 {
133 static size_t num_planning_cycles = 0;
134 static size_t num_planning_succeeded_cycles = 0;
135
137 double current_time = start_time;
138
139 ADEBUG <<
"Number of planning cycles: " << num_planning_cycles <<
" "
140 << num_planning_succeeded_cycles;
141 ++num_planning_cycles;
142
143 reference_line_info->set_is_on_reference_line();
144
145 auto ptr_reference_line =
146 std::make_shared<std::vector<PathPoint>>(ToDiscretizedReferenceLine(
147 reference_line_info->reference_line().reference_points()));
148
149
150
152 *ptr_reference_line, planning_init_point.path_point().x(),
153 planning_init_point.path_point().y());
154
155
156 std::array<double, 3> init_s;
157 std::array<double, 3> init_d;
158 ComputeInitFrenetState(matched_point, planning_init_point, &init_s, &init_d);
159
160 ADEBUG <<
"ReferenceLine and Frenet Conversion Time = "
163
164 auto ptr_prediction_querier = std::make_shared<PredictionQuerier>(
165 frame->obstacles(), ptr_reference_line);
166
167
168 auto ptr_path_time_graph = std::make_shared<PathTimeGraph>(
169 ptr_prediction_querier->GetObstacles(), *ptr_reference_line,
170 reference_line_info, init_s[0],
171 init_s[0] + FLAGS_speed_lon_decision_horizon, 0.0,
172 FLAGS_trajectory_time_length, init_d);
173
174 double speed_limit =
175 reference_line_info->reference_line().GetSpeedLimitFromS(init_s[0]);
176 reference_line_info->SetLatticeCruiseSpeed(speed_limit);
177
178 PlanningTarget planning_target = reference_line_info->planning_target();
179 if (planning_target.has_stop_point()) {
180 ADEBUG <<
"Planning target stop s: " << planning_target.stop_point().s()
181 << "Current ego s: " << init_s[0];
182 }
183
186
187
188 Trajectory1dGenerator trajectory1d_generator(
189 init_s, init_d, ptr_path_time_graph, ptr_prediction_querier);
190 std::vector<std::shared_ptr<Curve1d>> lon_trajectory1d_bundle;
191 std::vector<std::shared_ptr<Curve1d>> lat_trajectory1d_bundle;
192 trajectory1d_generator.GenerateTrajectoryBundles(
193 planning_target, &lon_trajectory1d_bundle, &lat_trajectory1d_bundle);
194
195 ADEBUG <<
"Trajectory_Generation_Time = "
198
199
200
201
202
203 TrajectoryEvaluator trajectory_evaluator(
204 init_s, planning_target, lon_trajectory1d_bundle, lat_trajectory1d_bundle,
205 ptr_path_time_graph, ptr_reference_line);
206
207 ADEBUG <<
"Trajectory_Evaluator_Construction_Time = "
210
211 ADEBUG <<
"number of trajectory pairs = "
212 << trajectory_evaluator.num_of_trajectory_pairs()
213 << " number_lon_traj = " << lon_trajectory1d_bundle.size()
214 << " number_lat_traj = " << lat_trajectory1d_bundle.size();
215
216
217 CollisionChecker collision_checker(frame->obstacles(), init_s[0], init_d[0],
218 *ptr_reference_line, reference_line_info,
219 ptr_path_time_graph);
220
221
222
223 size_t constraint_failure_count = 0;
224 size_t collision_failure_count = 0;
225 size_t combined_constraint_failure_count = 0;
226
227 size_t lon_vel_failure_count = 0;
228 size_t lon_acc_failure_count = 0;
229 size_t lon_jerk_failure_count = 0;
230 size_t curvature_failure_count = 0;
231 size_t lat_acc_failure_count = 0;
232 size_t lat_jerk_failure_count = 0;
233
234 size_t num_lattice_traj = 0;
235
236 while (trajectory_evaluator.has_more_trajectory_pairs()) {
237 double trajectory_pair_cost =
238 trajectory_evaluator.top_trajectory_pair_cost();
239 auto trajectory_pair = trajectory_evaluator.next_top_trajectory_pair();
240
241
243 *ptr_reference_line, *trajectory_pair.first, *trajectory_pair.second,
244 planning_init_point.relative_time());
245
246
247
250 ++combined_constraint_failure_count;
251
252 switch (result) {
254 lon_vel_failure_count += 1;
255 break;
257 lon_acc_failure_count += 1;
258 break;
260 lon_jerk_failure_count += 1;
261 break;
263 curvature_failure_count += 1;
264 break;
266 lat_acc_failure_count += 1;
267 break;
269 lat_jerk_failure_count += 1;
270 break;
272 default:
273
274 break;
275 }
276 continue;
277 }
278
279
280 if (collision_checker.InCollision(combined_trajectory)) {
281 ++collision_failure_count;
282 continue;
283 }
284
285
286 const auto& combined_trajectory_points = combined_trajectory;
287 num_lattice_traj += 1;
288 reference_line_info->SetTrajectory(combined_trajectory);
289 reference_line_info->SetCost(reference_line_info->PriorityCost() +
290 trajectory_pair_cost);
291 reference_line_info->SetDrivable(true);
292
293
294 ADEBUG <<
"Starting Lon. State: s = " << init_s[0] <<
" ds = " << init_s[1]
295 << " dds = " << init_s[2];
296
297 auto lattice_traj_ptr =
298 std::dynamic_pointer_cast<LatticeTrajectory1d>(trajectory_pair.first);
299 if (!lattice_traj_ptr) {
300 ADEBUG <<
"Dynamically casting trajectory1d ptr. failed.";
301 }
302
303 if (lattice_traj_ptr->has_target_position()) {
304 ADEBUG <<
"Ending Lon. State s = " << lattice_traj_ptr->target_position()
305 << " ds = " << lattice_traj_ptr->target_velocity()
306 << " t = " << lattice_traj_ptr->target_time();
307 }
308
310 ADEBUG <<
"XY: " << planning_init_point.ShortDebugString();
311 ADEBUG <<
"S: (" << init_s[0] <<
", " << init_s[1] <<
"," << init_s[2]
312 << ")";
313 ADEBUG <<
"L: (" << init_d[0] <<
", " << init_d[1] <<
"," << init_d[2]
314 << ")";
315
316 ADEBUG <<
"Reference_line_priority_cost = "
317 << reference_line_info->PriorityCost();
318 ADEBUG <<
"Total_Trajectory_Cost = " << trajectory_pair_cost;
319 ADEBUG <<
"OutputTrajectory";
320 for (uint i = 0; i < 10; ++i) {
321 ADEBUG << combined_trajectory_points[i].ShortDebugString();
322 }
323
324 break;
325
326
327
328
329
330
331
332
333
334 }
335
336 ADEBUG <<
"Trajectory_Evaluation_Time = "
338
339 ADEBUG <<
"Step CombineTrajectory Succeeded";
340
341 ADEBUG <<
"1d trajectory not valid for constraint ["
342 << constraint_failure_count << "] times";
343 ADEBUG <<
"Combined trajectory not valid for ["
344 << combined_constraint_failure_count << "] times";
345 ADEBUG <<
"Trajectory not valid for collision [" << collision_failure_count
346 << "] times";
347 ADEBUG <<
"Total_Lattice_Planning_Frame_Time = "
349
350 if (num_lattice_traj > 0) {
351 ADEBUG <<
"Planning succeeded";
352 num_planning_succeeded_cycles += 1;
353 reference_line_info->SetDrivable(true);
355 } else {
356 AERROR <<
"Planning failed";
357 if (FLAGS_enable_backup_trajectory) {
358 AERROR <<
"Use backup trajectory";
359 BackupTrajectoryGenerator backup_trajectory_generator(
360 init_s, init_d, planning_init_point.relative_time(),
361 std::make_shared<CollisionChecker>(collision_checker),
362 &trajectory1d_generator);
363 DiscretizedTrajectory trajectory =
364 backup_trajectory_generator.GenerateTrajectory(*ptr_reference_line);
365
366 reference_line_info->AddCost(FLAGS_backup_trajectory_cost);
367 reference_line_info->SetTrajectory(trajectory);
368 reference_line_info->SetDrivable(true);
370
371 } else {
372 reference_line_info->SetCost(std::numeric_limits<double>::infinity());
373 }
374 return Status(ErrorCode::PLANNING_ERROR,
"No feasible trajectories");
375 }
376}
static PathPoint MatchToPath(const std::vector< PathPoint > &reference_line, const double x, const double y)
static double NowInSeconds()
gets the current time in second.
static Result ValidTrajectory(const DiscretizedTrajectory &trajectory)
@ LON_ACCELERATION_OUT_OF_BOUND
@ LAT_ACCELERATION_OUT_OF_BOUND
@ LON_VELOCITY_OUT_OF_BOUND
static DiscretizedTrajectory Combine(const std::vector< common::PathPoint > &reference_line, const Curve1d &lon_trajectory, const Curve1d &lat_trajectory, const double init_relative_time)