151 {
152 if (!reference_line_info->IsChangeLanePath() &&
153 reference_line_info->IsNeighborLanePath()) {
154 reference_line_info->AddCost(kStraightForwardLineCost);
155 }
156 ADEBUG <<
"planning start point:" << planning_init_point.DebugString();
157 auto* heuristic_speed_data = reference_line_info->mutable_speed_data();
158 auto speed_profile =
159 GenerateInitSpeedProfile(planning_init_point, reference_line_info);
160 if (speed_profile.empty()) {
161 speed_profile = GenerateSpeedHotStart(planning_init_point);
162 ADEBUG <<
"Using dummy hot start for speed vector";
163 }
164 *heuristic_speed_data = SpeedData(speed_profile);
165
167
168 for (auto& task : tasks_) {
170 ret = task->Execute(frame, reference_line_info);
171 if (!ret.ok()) {
172 AERROR <<
"Failed to run tasks[" << task->Name()
173 << "], Error message: " << ret.error_message();
174 break;
175 }
177 const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
178
179 ADEBUG <<
"after task " << task->Name() <<
":"
180 << reference_line_info->PathSpeedDebugString();
181 ADEBUG << task->Name() <<
" time spend: " << time_diff_ms <<
" ms.";
182
183 RecordDebugInfo(reference_line_info, task->Name(), time_diff_ms);
184 }
185
186 RecordObstacleDebugInfo(reference_line_info);
187
188 if (reference_line_info->path_data().Empty()) {
189 ADEBUG <<
"Path fallback.";
190 GenerateFallbackPathProfile(reference_line_info,
191 reference_line_info->mutable_path_data());
192 reference_line_info->AddCost(kPathOptimizationFallbackClost);
193 }
194
195 if (!ret.ok() || reference_line_info->speed_data().empty()) {
196 ADEBUG <<
"Speed fallback.";
197 GenerateFallbackSpeedProfile(reference_line_info->mutable_speed_data());
198 reference_line_info->AddCost(kSpeedOptimizationFallbackClost);
199 }
200
201 DiscretizedTrajectory trajectory;
202 if (!reference_line_info->CombinePathAndSpeedProfile(
203 planning_init_point.relative_time(),
204 planning_init_point.path_point().s(), &trajectory)) {
205 const std::string msg = "Fail to aggregate planning trajectory.";
207 return Status(ErrorCode::PLANNING_ERROR, msg);
208 }
209
210 for (const auto* obstacle :
211 reference_line_info->path_decision()->obstacles().Items()) {
212 if (obstacle->IsVirtual()) {
213 continue;
214 }
215 if (!obstacle->IsStatic()) {
216 continue;
217 }
218 if (obstacle->LongitudinalDecision().has_stop()) {
219 static constexpr double kRefrenceLineStaticObsCost = 1e3;
220 reference_line_info->AddCost(kRefrenceLineStaticObsCost);
221 }
222 }
223
224 if (FLAGS_enable_trajectory_check) {
227 const std::string msg = "Current planning trajectory is not valid.";
229 return Status(ErrorCode::PLANNING_ERROR, msg);
230 }
231 }
232
233 reference_line_info->SetTrajectory(trajectory);
234 reference_line_info->SetDrivable(true);
236}
static double NowInSeconds()
gets the current time in second.
static Result ValidTrajectory(const DiscretizedTrajectory &trajectory)