Apollo 11.0
自动驾驶开放平台
apollo::planning::NaviPlanning类 参考

#include <navi_planning.h>

类 apollo::planning::NaviPlanning 继承关系图:
apollo::planning::NaviPlanning 的协作图:

Public 成员函数

 NaviPlanning (const std::shared_ptr< DependencyInjector > &injector)
 
virtual ~NaviPlanning ()
 
std::string Name () const override
 Planning algorithm name.
 
apollo::common::Status Init (const PlanningConfig &config) override
 module initialization function
 
void RunOnce (const LocalView &local_view, ADCTrajectory *const trajectory_pb) override
 main logic of the planning module, runs periodically triggered by timer.
 
apollo::common::Status Plan (const double current_time_stamp, const std::vector< common::TrajectoryPoint > &stitching_trajectory, ADCTrajectory *const trajectory) override
 Plan the trajectory given current vehicle state
 
- Public 成员函数 继承自 apollo::planning::PlanningBase
 PlanningBase ()=delete
 
 PlanningBase (const std::shared_ptr< DependencyInjector > &injector)
 
virtual ~PlanningBase ()
 
bool IsPlanningFinished (const ADCTrajectory::TrajectoryType &current_trajectory_type) const
 Check if vehicle reaches the end point of the RoutingRequest.
 
bool GenerateWidthOfLane (const Vec2d &current_location, Vec2d &left_point, Vec2d &right_point)
 

额外继承的成员函数

- Protected 成员函数 继承自 apollo::planning::PlanningBase
virtual void FillPlanningPb (const double timestamp, ADCTrajectory *const trajectory_pb)
 
void LoadPlanner ()
 
- Protected 属性 继承自 apollo::planning::PlanningBase
LocalView local_view_
 
const hdmap::HDMap * hdmap_ = nullptr
 
double start_time_ = 0.0
 
size_t seq_num_ = 0
 
PlanningConfig config_
 
TrafficDecider traffic_decider_
 
std::unique_ptr< Frame > frame_
 
std::shared_ptr< Planner > planner_
 
std::unique_ptr< PublishableTrajectory > last_publishable_trajectory_
 
std::shared_ptr< DependencyInjector > injector_
 

详细描述

在文件 navi_planning.h 第 42 行定义.

构造及析构函数说明

◆ NaviPlanning()

apollo::planning::NaviPlanning::NaviPlanning ( const std::shared_ptr< DependencyInjector > &  injector)
inlineexplicit

在文件 navi_planning.h 第 44 行定义.

45 : PlanningBase(injector) {}

◆ ~NaviPlanning()

apollo::planning::NaviPlanning::~NaviPlanning ( )
virtual

在文件 navi_planning.cc 第 51 行定义.

51 {
52 last_publishable_trajectory_.reset(nullptr);
53 frame_.reset(nullptr);
54 injector_->frame_history()->Clear();
55 injector_->history()->Clear();
56 injector_->planning_context()->mutable_planning_status()->Clear();
57}
std::unique_ptr< Frame > frame_
std::unique_ptr< PublishableTrajectory > last_publishable_trajectory_
std::shared_ptr< DependencyInjector > injector_

成员函数说明

◆ Init()

Status apollo::planning::NaviPlanning::Init ( const PlanningConfig &  config)
overridevirtual

module initialization function

返回
initialization status

重载 apollo::planning::PlanningBase .

在文件 navi_planning.cc 第 61 行定义.

61 {
62 if (!CheckPlanningConfig(config)) {
63 return Status(ErrorCode::PLANNING_ERROR,
64 "planning config error: " + config.DebugString());
65 }
66
67 PlanningBase::Init(config);
68
69 // clear planning history
70 injector_->history()->Clear();
71
72 // clear planning status
73 injector_->planning_context()->mutable_planning_status()->Clear();
74
76 if (!planner_) {
77 return Status(
78 ErrorCode::PLANNING_ERROR,
79 "planning is not initialized with config : " + config_.DebugString());
80 }
81
83
84 return planner_->Init(injector_, FLAGS_planner_config_path);
85}
virtual apollo::common::Status Init(const PlanningConfig &config)
std::shared_ptr< Planner > planner_
bool Init(const std::shared_ptr< DependencyInjector > &injector)

◆ Name()

std::string apollo::planning::NaviPlanning::Name ( ) const
overridevirtual

Planning algorithm name.

实现了 apollo::planning::PlanningBase.

在文件 navi_planning.cc 第 59 行定义.

59{ return "navi_planning"; }

◆ Plan()

Status apollo::planning::NaviPlanning::Plan ( const double  current_time_stamp,
const std::vector< common::TrajectoryPoint > &  stitching_trajectory,
ADCTrajectory *const  trajectory 
)
overridevirtual

Plan the trajectory given current vehicle state

if (FLAGS_enable_stitch_last_trajectory) { last_publishable_trajectory_->PrependTrajectoryPoints( std::vector<TrajectoryPoint>(stitching_trajectory.begin(), stitching_trajectory.end() - 1)); }

实现了 apollo::planning::PlanningBase.

在文件 navi_planning.cc 第 468 行定义.

471 {
472 auto* ptr_debug = trajectory_pb->mutable_debug();
473 if (FLAGS_enable_record_debug) {
474 ptr_debug->mutable_planning_data()->mutable_init_point()->CopyFrom(
475 stitching_trajectory.back());
476 }
477
478 auto status =
479 planner_->Plan(stitching_trajectory.back(), frame_.get(), trajectory_pb);
480
481 ExportReferenceLineDebug(ptr_debug);
482
483 const auto* best_ref_info = frame_->FindDriveReferenceLineInfo();
484 if (!best_ref_info) {
485 const std::string msg = "planner failed to make a driving plan";
486 AERROR << msg;
489 }
490 return Status(ErrorCode::PLANNING_ERROR, msg);
491 }
492 ptr_debug->MergeFrom(best_ref_info->debug());
493 trajectory_pb->mutable_latency_stats()->MergeFrom(
494 best_ref_info->latency_stats());
495 // set right of way status
496 trajectory_pb->set_right_of_way_status(best_ref_info->GetRightOfWayStatus());
497 for (const auto& id : best_ref_info->TargetLaneId()) {
498 trajectory_pb->add_lane_id()->CopyFrom(id);
499 }
500
501 best_ref_info->ExportDecision(trajectory_pb->mutable_decision(),
502 injector_->planning_context());
503
504 // Add debug information.
505 if (FLAGS_enable_record_debug) {
506 auto* reference_line = ptr_debug->mutable_planning_data()->add_path();
507 reference_line->set_name("planning_reference_line");
508 const auto& reference_points =
509 best_ref_info->reference_line().reference_points();
510 double s = 0.0;
511 double prev_x = 0.0;
512 double prev_y = 0.0;
513 bool empty_path = true;
514 for (const auto& reference_point : reference_points) {
515 auto* path_point = reference_line->add_path_point();
516 path_point->set_x(reference_point.x());
517 path_point->set_y(reference_point.y());
518 path_point->set_theta(reference_point.heading());
519 path_point->set_kappa(reference_point.kappa());
520 path_point->set_dkappa(reference_point.dkappa());
521 if (empty_path) {
522 path_point->set_s(0.0);
523 empty_path = false;
524 } else {
525 double dx = reference_point.x() - prev_x;
526 double dy = reference_point.y() - prev_y;
527 s += std::hypot(dx, dy);
528 path_point->set_s(s);
529 }
530 prev_x = reference_point.x();
531 prev_y = reference_point.y();
532 }
533 }
534
535 last_publishable_trajectory_.reset(new PublishableTrajectory(
536 current_time_stamp, best_ref_info->trajectory()));
537
538 ADEBUG << "current_time_stamp: " << current_time_stamp;
539
540 // Navi Planner doesn't need to stitch the last path planning
541 // trajectory.Otherwise, it will cause the Dreamview planning track to display
542 // flashing or bouncing
543 // TODO(Yifei): remove this if navi-planner doesn't need stitching
552 for (size_t i = 0; i < last_publishable_trajectory_->NumOfPoints(); ++i) {
553 if (last_publishable_trajectory_->TrajectoryPointAt(i).relative_time() >
554 FLAGS_trajectory_time_high_density_period) {
555 break;
556 }
557 ADEBUG << last_publishable_trajectory_->TrajectoryPointAt(i)
558 .ShortDebugString();
559 }
560
561 last_publishable_trajectory_->PopulateTrajectoryProtobuf(trajectory_pb);
562
563 best_ref_info->ExportEngageAdvice(trajectory_pb->mutable_engage_advice(),
564 injector_->planning_context());
565
566 return status;
567}
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44

◆ RunOnce()

void apollo::planning::NaviPlanning::RunOnce ( const LocalView &  local_view,
ADCTrajectory *const  trajectory_pb 
)
overridevirtual

main logic of the planning module, runs periodically triggered by timer.

实现了 apollo::planning::PlanningBase.

在文件 navi_planning.cc 第 113 行定义.

114 {
116 const double start_timestamp = Clock::NowInSeconds();
117
118 // recreate reference line provider in every cycle
119 hdmap_ = HDMapUtil::BaseMapPtr(*local_view.relative_map);
120 const ReferenceLineConfig* reference_line_config = nullptr;
121 if (config_.has_reference_line_config()) {
122 reference_line_config = &config_.reference_line_config();
123 }
124 // Prefer "std::make_unique" to direct use of "new".
125 // Refer to "https://herbsutter.com/gotw/_102/" for details.
126 reference_line_provider_ = std::make_unique<ReferenceLineProvider>(
127 injector_->vehicle_state(), reference_line_config,
129
130 // localization
131 ADEBUG << "Get localization: "
132 << local_view_.localization_estimate->DebugString();
133
134 // chassis
135 ADEBUG << "Get chassis: " << local_view_.chassis->DebugString();
136
137 Status status = injector_->vehicle_state()->Update(
139
140 auto vehicle_config =
141 ComputeVehicleConfigFromLocalization(*local_view_.localization_estimate);
142
143 if (last_vehicle_config_.is_valid_ && vehicle_config.is_valid_) {
144 auto x_diff_map = vehicle_config.x_ - last_vehicle_config_.x_;
145 auto y_diff_map = vehicle_config.y_ - last_vehicle_config_.y_;
146
147 auto cos_map_veh = std::cos(last_vehicle_config_.theta_);
148 auto sin_map_veh = std::sin(last_vehicle_config_.theta_);
149
150 auto x_diff_veh = cos_map_veh * x_diff_map + sin_map_veh * y_diff_map;
151 auto y_diff_veh = -sin_map_veh * x_diff_map + cos_map_veh * y_diff_map;
152
153 auto theta_diff = vehicle_config.theta_ - last_vehicle_config_.theta_;
154
156 x_diff_veh, y_diff_veh, theta_diff, last_publishable_trajectory_.get());
157 }
158 last_vehicle_config_ = vehicle_config;
159
160 VehicleState vehicle_state = injector_->vehicle_state()->vehicle_state();
161
162 // estimate (x, y) at current timestamp
163 // This estimate is only valid if the current time and vehicle state timestamp
164 // differs only a small amount (20ms). When the different is too large, the
165 // estimation is invalid.
166 DCHECK_GE(start_timestamp, vehicle_state.timestamp());
167 if (start_timestamp - vehicle_state.timestamp() <
168 FLAGS_message_latency_threshold) {
169 auto future_xy = injector_->vehicle_state()->EstimateFuturePosition(
170 start_timestamp - vehicle_state.timestamp());
171 vehicle_state.set_x(future_xy.x());
172 vehicle_state.set_y(future_xy.y());
173 vehicle_state.set_timestamp(start_timestamp);
174 }
175
176 auto* not_ready = trajectory_pb->mutable_decision()
177 ->mutable_main_decision()
178 ->mutable_not_ready();
179
180 if (!status.ok() || !util::IsVehicleStateValid(vehicle_state)) {
181 const std::string msg = "Update VehicleStateProvider failed";
182 AERROR << msg;
183 not_ready->set_reason(msg);
184 status.Save(trajectory_pb->mutable_header()->mutable_status());
185 // TODO(all): integrate reverse gear
186 trajectory_pb->set_gear(canbus::Chassis::GEAR_DRIVE);
187 FillPlanningPb(start_timestamp, trajectory_pb);
188 return;
189 }
190
191 const double planning_cycle_time = 1.0 / FLAGS_planning_loop_rate;
192
193 std::vector<TrajectoryPoint> stitching_trajectory;
194 std::string replan_reason;
196 *(local_view_.chassis), vehicle_state, start_timestamp,
197 planning_cycle_time, FLAGS_trajectory_stitching_preserved_length, true,
198 last_publishable_trajectory_.get(), &replan_reason,
200
201 const uint32_t frame_num = static_cast<uint32_t>(seq_num_++);
202 status = InitFrame(frame_num, stitching_trajectory.back(), vehicle_state);
203
204 if (!frame_) {
205 const std::string msg = "Failed to init frame";
206 AERROR << msg;
207 not_ready->set_reason(msg);
208 status.Save(trajectory_pb->mutable_header()->mutable_status());
209 // TODO(all): integrate reverse gear
210 trajectory_pb->set_gear(canbus::Chassis::GEAR_DRIVE);
211 FillPlanningPb(start_timestamp, trajectory_pb);
212 return;
213 }
214
215 injector_->ego_info()->Update(stitching_trajectory.back(), vehicle_state);
216
217 if (FLAGS_enable_record_debug) {
218 frame_->RecordInputDebug(trajectory_pb->mutable_debug());
219 }
220 trajectory_pb->mutable_latency_stats()->set_init_frame_time_ms(
221 Clock::NowInSeconds() - start_timestamp);
222 if (!status.ok()) {
223 AERROR << status.ToString();
224 if (FLAGS_publish_estop) {
225 // Because the function "Control::ProduceControlCommand()" checks the
226 // "estop" signal with the following line (Line 170 in control.cc):
227 // estop_ = estop_ || trajectory_.estop().is_estop();
228 // we should add more information to ensure the estop being triggered.
229 ADCTrajectory estop_trajectory;
230 EStop* estop = estop_trajectory.mutable_estop();
231 estop->set_is_estop(true);
232 estop->set_reason(status.error_message());
233 status.Save(estop_trajectory.mutable_header()->mutable_status());
234 // TODO(all): integrate reverse gear
235 trajectory_pb->set_gear(canbus::Chassis::GEAR_DRIVE);
236 FillPlanningPb(start_timestamp, &estop_trajectory);
237 } else {
238 trajectory_pb->mutable_decision()
239 ->mutable_main_decision()
240 ->mutable_not_ready()
241 ->set_reason(status.ToString());
242 status.Save(trajectory_pb->mutable_header()->mutable_status());
243 // TODO(all): integrate reverse gear
244 trajectory_pb->set_gear(canbus::Chassis::GEAR_DRIVE);
245 FillPlanningPb(start_timestamp, trajectory_pb);
246 }
247
248 frame_->set_current_frame_planned_trajectory(*trajectory_pb);
249 auto seq_num = frame_->SequenceNum();
250 injector_->frame_history()->Add(seq_num, std::move(frame_));
251
252 return;
253 }
254
255 // Use planning pad message to make driving decisions
256 if (FLAGS_enable_planning_pad_msg) {
257 const auto& pad_msg_driving_action = frame_->GetPadMsgDrivingAction();
258 ProcessPadMsg(pad_msg_driving_action);
259 }
260
261 for (auto& ref_line_info : *frame_->mutable_reference_line_info()) {
262 auto traffic_status =
263 traffic_decider_.Execute(frame_.get(), &ref_line_info);
264 if (!traffic_status.ok() || !ref_line_info.IsDrivable()) {
265 ref_line_info.SetDrivable(false);
266 AWARN << "Reference line " << ref_line_info.Lanes().Id()
267 << " traffic decider failed";
268 continue;
269 }
270 }
271
272 status = Plan(start_timestamp, stitching_trajectory, trajectory_pb);
273
274 const auto time_diff_ms = (Clock::NowInSeconds() - start_timestamp) * 1000;
275 ADEBUG << "total planning time spend: " << time_diff_ms << " ms.";
276
277 trajectory_pb->mutable_latency_stats()->set_total_time_ms(time_diff_ms);
278 ADEBUG << "Planning latency: "
279 << trajectory_pb->latency_stats().DebugString();
280
281 auto* ref_line_task =
282 trajectory_pb->mutable_latency_stats()->add_task_stats();
283 ref_line_task->set_time_ms(reference_line_provider_->LastTimeDelay() *
284 1000.0);
285 ref_line_task->set_name("ReferenceLineProvider");
286
287 if (!status.ok()) {
288 status.Save(trajectory_pb->mutable_header()->mutable_status());
289 AERROR << "Planning failed:" << status.ToString();
290 if (FLAGS_publish_estop) {
291 AERROR << "Planning failed and set estop";
292 // Because the function "Control::ProduceControlCommand()" checks the
293 // "estop" signal with the following line (Line 170 in control.cc):
294 // estop_ = estop_ || trajectory_.estop().is_estop();
295 // we should add more information to ensure the estop being triggered.
296 EStop* estop = trajectory_pb->mutable_estop();
297 estop->set_is_estop(true);
298 estop->set_reason(status.error_message());
299 }
300 }
301
302 trajectory_pb->set_is_replan(stitching_trajectory.size() == 1);
303 // TODO(all): integrate reverse gear
304 trajectory_pb->set_gear(canbus::Chassis::GEAR_DRIVE);
305 FillPlanningPb(start_timestamp, trajectory_pb);
306 ADEBUG << "Planning pb:" << trajectory_pb->header().DebugString();
307
308 auto seq_num = frame_->SequenceNum();
309 injector_->frame_history()->Add(seq_num, std::move(frame_));
310}
static double NowInSeconds()
gets the current time in second.
Definition clock.cc:56
static const HDMap * BaseMapPtr()
apollo::common::Status Plan(const double current_time_stamp, const std::vector< common::TrajectoryPoint > &stitching_trajectory, ADCTrajectory *const trajectory) override
Plan the trajectory given current vehicle state
virtual void FillPlanningPb(const double timestamp, ADCTrajectory *const trajectory_pb)
const hdmap::HDMap * hdmap_
apollo::common::Status Execute(Frame *frame, ReferenceLineInfo *reference_line_info)
static std::vector< common::TrajectoryPoint > ComputeStitchingTrajectory(const canbus::Chassis &vehicle_chassis, const common::VehicleState &vehicle_state, const double current_timestamp, const double planning_cycle_time, const size_t preserved_points_num, const bool replan_by_offset, const PublishableTrajectory *prev_trajectory, std::string *replan_reason, const control::ControlInteractiveMsg &control_interactive_msg)
static void TransformLastPublishedTrajectory(const double x_diff, const double y_diff, const double theta_diff, PublishableTrajectory *prev_trajectory)
#define AWARN
Definition log.h:43
bool IsVehicleStateValid(const VehicleState &vehicle_state)
Definition util.cc:35
std::shared_ptr< localization::LocalizationEstimate > localization_estimate
Definition local_view.h:43
std::shared_ptr< relative_map::MapMsg > relative_map
Definition local_view.h:45
std::shared_ptr< control::ControlInteractiveMsg > control_interactive_msg
Definition local_view.h:50
std::shared_ptr< canbus::Chassis > chassis
Definition local_view.h:42
optional ReferenceLineConfig reference_line_config
LocalView contains all necessary data as planning input

该类的文档由以下文件生成: