Apollo  6.0
Open source self driving car software
reference_line_info.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2017 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
21 #pragma once
22 
23 #include <limits>
24 #include <list>
25 #include <memory>
26 #include <string>
27 #include <unordered_map>
28 #include <utility>
29 #include <vector>
30 
31 #include "modules/common/proto/drive_state.pb.h"
32 #include "modules/common/proto/pnc_point.pb.h"
33 #include "modules/common/vehicle_state/proto/vehicle_state.pb.h"
44 #include "modules/planning/proto/lattice_structure.pb.h"
45 #include "modules/planning/proto/planning.pb.h"
46 
47 namespace apollo {
48 namespace planning {
49 
55  public:
57  ReferenceLineInfo() = default;
58 
59  ReferenceLineInfo(const common::VehicleState& vehicle_state,
60  const common::TrajectoryPoint& adc_planning_point,
62  const hdmap::RouteSegments& segments);
63 
64  bool Init(const std::vector<const Obstacle*>& obstacles);
65 
66  bool AddObstacles(const std::vector<const Obstacle*>& obstacles);
67  Obstacle* AddObstacle(const Obstacle* obstacle);
68 
69  const common::VehicleState& vehicle_state() const { return vehicle_state_; }
70 
72  const PathDecision& path_decision() const;
73 
74  const ReferenceLine& reference_line() const;
76 
77  double SDistanceToDestination() const;
78  bool ReachedDestination() const;
79 
81  const DiscretizedTrajectory& trajectory() const;
82 
83  double Cost() const { return cost_; }
84  void AddCost(double cost) { cost_ += cost; }
85  void SetCost(double cost) { cost_ = cost; }
86  double PriorityCost() const { return priority_cost_; }
87  void SetPriorityCost(double cost) { priority_cost_ = cost; }
88  // For lattice planner'speed planning target
89  void SetLatticeStopPoint(const StopPoint& stop_point);
90  void SetLatticeCruiseSpeed(double speed);
91  const PlanningTarget& planning_target() const { return planning_target_; }
92 
93  void SetCruiseSpeed(double speed) { cruise_speed_ = speed; }
94  double GetCruiseSpeed() const;
95 
96  hdmap::LaneInfoConstPtr LocateLaneInfo(const double s) const;
97 
99  const double s, hdmap::Id* ptr_lane_id,
100  double* ptr_lane_width) const;
101 
109  bool IsStartFrom(const ReferenceLineInfo& previous_reference_line_info) const;
110 
111  planning_internal::Debug* mutable_debug() { return &debug_; }
112  const planning_internal::Debug& debug() const { return debug_; }
113  LatencyStats* mutable_latency_stats() { return &latency_stats_; }
114  const LatencyStats& latency_stats() const { return latency_stats_; }
115 
116  const PathData& path_data() const;
117  const PathData& fallback_path_data() const;
118  const SpeedData& speed_data() const;
122 
123  const RSSInfo& rss_info() const;
124  RSSInfo* mutable_rss_info();
125  // aggregate final result together by some configuration
127  const double relative_time, const double start_s,
128  DiscretizedTrajectory* discretized_trajectory);
129 
130  // adjust trajectory if it starts from cur_vehicle postion rather planning
131  // init point from upstream
133  const common::TrajectoryPoint& planning_start_point,
134  const std::vector<common::TrajectoryPoint>& trajectory,
135  DiscretizedTrajectory* adjusted_trajectory);
136 
137  const SLBoundary& AdcSlBoundary() const;
138  std::string PathSpeedDebugString() const;
139 
144  bool IsChangeLanePath() const;
145 
150  bool IsNeighborLanePath() const;
151 
156  void SetDrivable(bool drivable);
157  bool IsDrivable() const;
158 
159  void ExportEngageAdvice(common::EngageAdvice* engage_advice,
160  PlanningContext* planning_context) const;
161 
162  const hdmap::RouteSegments& Lanes() const;
163  std::list<hdmap::Id> TargetLaneId() const;
164 
165  void ExportDecision(DecisionResult* decision_result,
166  PlanningContext* planning_context) const;
167 
168  void SetJunctionRightOfWay(const double junction_s,
169  const bool is_protected) const;
170 
171  ADCTrajectory::RightOfWayStatus GetRightOfWayStatus() const;
172 
173  hdmap::Lane::LaneTurn GetPathTurnType(const double s) const;
174 
176  const hdmap::PathOverlap& pnc_junction_overlap) const;
177 
178  double OffsetToOtherReferenceLine() const {
179  return offset_to_other_reference_line_;
180  }
181  void SetOffsetToOtherReferenceLine(const double offset) {
182  offset_to_other_reference_line_ = offset;
183  }
184 
185  const std::vector<PathBoundary>& GetCandidatePathBoundaries() const;
186 
188  std::vector<PathBoundary>&& candidate_path_boundaries);
189 
190  const std::vector<PathData>& GetCandidatePathData() const;
191 
192  void SetCandidatePathData(std::vector<PathData>&& candidate_path_data);
193 
194  Obstacle* GetBlockingObstacle() const { return blocking_obstacle_; }
195  void SetBlockingObstacle(const std::string& blocking_obstacle_id);
196 
197  bool is_path_lane_borrow() const { return is_path_lane_borrow_; }
199  is_path_lane_borrow_ = is_path_lane_borrow;
200  }
201 
202  void set_is_on_reference_line() { is_on_reference_line_ = true; }
203 
204  uint32_t GetPriority() const { return reference_line_.GetPriority(); }
205 
206  void SetPriority(uint32_t priority) { reference_line_.SetPriority(priority); }
207 
209  const ADCTrajectory::TrajectoryType trajectory_type) {
210  trajectory_type_ = trajectory_type;
211  }
212 
213  ADCTrajectory::TrajectoryType trajectory_type() const {
214  return trajectory_type_;
215  }
216 
217  StGraphData* mutable_st_graph_data() { return &st_graph_data_; }
218 
219  const StGraphData& st_graph_data() { return st_graph_data_; }
220 
221  // different types of overlaps that can be handled by different scenarios.
222  enum OverlapType {
225  OBSTACLE = 3,
227  SIGNAL = 5,
230  };
231 
232  const std::vector<std::pair<OverlapType, hdmap::PathOverlap>>&
234  return first_encounter_overlaps_;
235  }
236 
237  int GetPnCJunction(const double s,
238  hdmap::PathOverlap* pnc_junction_overlap) const;
239 
240  std::vector<common::SLPoint> GetAllStopDecisionSLPoint() const;
241 
242  void SetTurnSignal(const common::VehicleSignal::TurnSignal& turn_signal);
243  void SetEmergencyLight();
244 
245  void set_path_reusable(const bool path_reusable) {
246  path_reusable_ = path_reusable;
247  }
248 
249  bool path_reusable() const { return path_reusable_; }
250 
251  private:
252  void InitFirstOverlaps();
253 
254  bool CheckChangeLane() const;
255 
256  void SetTurnSignalBasedOnLaneTurnType(
257  common::VehicleSignal* vehicle_signal) const;
258 
259  void ExportVehicleSignal(common::VehicleSignal* vehicle_signal) const;
260 
261  bool IsIrrelevantObstacle(const Obstacle& obstacle);
262 
263  void MakeDecision(DecisionResult* decision_result,
264  PlanningContext* planning_context) const;
265 
266  int MakeMainStopDecision(DecisionResult* decision_result) const;
267 
268  void MakeMainMissionCompleteDecision(DecisionResult* decision_result,
269  PlanningContext* planning_context) const;
270 
271  void MakeEStopDecision(DecisionResult* decision_result) const;
272 
273  void SetObjectDecisions(ObjectDecisions* object_decisions) const;
274 
275  bool AddObstacleHelper(const std::shared_ptr<Obstacle>& obstacle);
276 
277  bool GetFirstOverlap(const std::vector<hdmap::PathOverlap>& path_overlaps,
278  hdmap::PathOverlap* path_overlap);
279 
280  private:
281  static std::unordered_map<std::string, bool> junction_right_of_way_map_;
282  const common::VehicleState vehicle_state_;
283  const common::TrajectoryPoint adc_planning_point_;
284  ReferenceLine reference_line_;
285 
290  double cost_ = 0.0;
291 
292  bool is_drivable_ = true;
293 
294  PathDecision path_decision_;
295 
296  Obstacle* blocking_obstacle_;
297 
298  std::vector<PathBoundary> candidate_path_boundaries_;
299  std::vector<PathData> candidate_path_data_;
300 
301  PathData path_data_;
302  PathData fallback_path_data_;
303  SpeedData speed_data_;
304 
305  DiscretizedTrajectory discretized_trajectory_;
306 
307  RSSInfo rss_info_;
308 
313  SLBoundary adc_sl_boundary_;
314 
315  planning_internal::Debug debug_;
316  LatencyStats latency_stats_;
317 
318  hdmap::RouteSegments lanes_;
319 
320  bool is_on_reference_line_ = false;
321 
322  bool is_path_lane_borrow_ = false;
323 
324  ADCTrajectory::RightOfWayStatus status_ = ADCTrajectory::UNPROTECTED;
325 
326  double offset_to_other_reference_line_ = 0.0;
327 
328  double priority_cost_ = 0.0;
329 
330  PlanningTarget planning_target_;
331 
332  ADCTrajectory::TrajectoryType trajectory_type_ = ADCTrajectory::UNKNOWN;
333 
338  std::vector<std::pair<OverlapType, hdmap::PathOverlap>>
339  first_encounter_overlaps_;
340 
345  StGraphData st_graph_data_;
346 
347  common::VehicleSignal vehicle_signal_;
348 
349  double cruise_speed_ = 0.0;
350 
351  bool path_reusable_ = false;
352 
354 };
355 
356 } // namespace planning
357 } // namespace apollo
const planning_internal::Debug & debug() const
Definition: reference_line_info.h:112
bool GetNeighborLaneInfo(const ReferenceLineInfo::LaneType lane_type, const double s, hdmap::Id *ptr_lane_id, double *ptr_lane_width) const
Definition: path.h:91
void SetPriority(uint32_t priority)
Definition: reference_line_info.h:206
double OffsetToOtherReferenceLine() const
Definition: reference_line_info.h:178
bool GetIntersectionRightofWayStatus(const hdmap::PathOverlap &pnc_junction_overlap) const
const PathData & path_data() const
class RouteSegments
Definition: route_segments.h:50
Definition: reference_line_info.h:224
const PlanningTarget & planning_target() const
Definition: reference_line_info.h:91
Definition: planning_context.h:33
This is the class that associates an Obstacle with its path properties. An obstacle&#39;s path properties...
Definition: obstacle.h:60
Definition: reference_line_info.h:227
uint32_t GetPriority() const
Definition: reference_line_info.h:204
PathDecision represents all obstacle decisions on one path.
Definition: path_decision.h:38
void set_trajectory_type(const ADCTrajectory::TrajectoryType trajectory_type)
Definition: reference_line_info.h:208
std::vector< common::SLPoint > GetAllStopDecisionSLPoint() const
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void SetCandidatePathData(std::vector< PathData > &&candidate_path_data)
void ExportDecision(DecisionResult *decision_result, PlanningContext *planning_context) const
const std::vector< std::pair< OverlapType, hdmap::PathOverlap > > & FirstEncounteredOverlaps() const
Definition: reference_line_info.h:233
Definition: reference_line_info.h:226
Definition: discretized_trajectory.h:32
void SetTrajectory(const DiscretizedTrajectory &trajectory)
#define DISALLOW_COPY_AND_ASSIGN(classname)
Definition: macros.h:48
StGraphData * mutable_st_graph_data()
Definition: reference_line_info.h:217
Planning module main class. It processes GPS and IMU as input, to generate planning info...
void AddCost(double cost)
Definition: reference_line_info.h:84
LatencyStats * mutable_latency_stats()
Definition: reference_line_info.h:113
bool IsStartFrom(const ReferenceLineInfo &previous_reference_line_info) const
check if current reference line is started from another reference line info line. The method is to ch...
ReferenceLineInfo holds all data for one reference line.
Definition: reference_line_info.h:54
void SetLatticeCruiseSpeed(double speed)
const PathData & fallback_path_data() const
const DiscretizedTrajectory & trajectory() const
bool CombinePathAndSpeedProfile(const double relative_time, const double start_s, DiscretizedTrajectory *discretized_trajectory)
void SetBlockingObstacle(const std::string &blocking_obstacle_id)
hdmap::LaneInfoConstPtr LocateLaneInfo(const double s) const
ADCTrajectory::RightOfWayStatus GetRightOfWayStatus() const
const RSSInfo & rss_info() const
hdmap::Lane::LaneTurn GetPathTurnType(const double s) const
const LatencyStats & latency_stats() const
Definition: reference_line_info.h:114
Obstacle * GetBlockingObstacle() const
Definition: reference_line_info.h:194
void SetCost(double cost)
Definition: reference_line_info.h:85
planning_internal::Debug * mutable_debug()
Definition: reference_line_info.h:111
bool Init(const std::vector< const Obstacle *> &obstacles)
double PriorityCost() const
Definition: reference_line_info.h:86
bool path_reusable() const
Definition: reference_line_info.h:249
void SetCruiseSpeed(double speed)
Definition: reference_line_info.h:93
void SetPriorityCost(double cost)
Definition: reference_line_info.h:87
void SetTurnSignal(const common::VehicleSignal::TurnSignal &turn_signal)
Definition: path_data.h:36
double Cost() const
Definition: reference_line_info.h:83
void SetJunctionRightOfWay(const double junction_s, const bool is_protected) const
Definition: reference_line_info.h:223
void ExportEngageAdvice(common::EngageAdvice *engage_advice, PlanningContext *planning_context) const
Definition: reference_line_info.h:225
void SetLatticeStopPoint(const StopPoint &stop_point)
Obstacle * AddObstacle(const Obstacle *obstacle)
const common::VehicleState & vehicle_state() const
Definition: reference_line_info.h:69
: data with map info and obstacle info
std::shared_ptr< const LaneInfo > LaneInfoConstPtr
Definition: hdmap_common.h:125
const SLBoundary & AdcSlBoundary() const
const ReferenceLine & reference_line() const
bool is_path_lane_borrow() const
Definition: reference_line_info.h:197
std::list< hdmap::Id > TargetLaneId() const
const StGraphData & st_graph_data()
Definition: reference_line_info.h:219
const std::vector< PathBoundary > & GetCandidatePathBoundaries() const
Definition: reference_line.h:39
ReferenceLine * mutable_reference_line()
LaneType
Definition: reference_line_info.h:56
const hdmap::RouteSegments & Lanes() const
int GetPnCJunction(const double s, hdmap::PathOverlap *pnc_junction_overlap) const
const std::vector< PathData > & GetCandidatePathData() const
Definition: reference_line_info.h:229
ADCTrajectory::TrajectoryType trajectory_type() const
Definition: reference_line_info.h:213
void set_is_on_reference_line()
Definition: reference_line_info.h:202
void set_is_path_lane_borrow(const bool is_path_lane_borrow)
Definition: reference_line_info.h:198
std::string PathSpeedDebugString() const
bool AddObstacles(const std::vector< const Obstacle *> &obstacles)
void set_path_reusable(const bool path_reusable)
Definition: reference_line_info.h:245
OverlapType
Definition: reference_line_info.h:222
Definition: reference_line_info.h:228
void SetOffsetToOtherReferenceLine(const double offset)
Definition: reference_line_info.h:181
Definition: speed_data.h:30
bool AdjustTrajectoryWhichStartsFromCurrentPos(const common::TrajectoryPoint &planning_start_point, const std::vector< common::TrajectoryPoint > &trajectory, DiscretizedTrajectory *adjusted_trajectory)
Definition: st_graph_data.h:37
void SetCandidatePathBoundaries(std::vector< PathBoundary > &&candidate_path_boundaries)
const SpeedData & speed_data() const