Apollo  6.0
Open source self driving car software
obstacle.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 <list>
24 #include <memory>
25 #include <string>
26 #include <unordered_map>
27 #include <vector>
28 
29 #include "modules/common/configs/proto/vehicle_config.pb.h"
32 #include "modules/perception/proto/perception_obstacle.pb.h"
35 #include "modules/planning/proto/decision.pb.h"
36 #include "modules/planning/proto/sl_boundary.pb.h"
38 #include "modules/prediction/proto/prediction_obstacle.pb.h"
39 
40 namespace apollo {
41 namespace planning {
42 
60 class Obstacle {
61  public:
62  Obstacle() = default;
63  Obstacle(const std::string& id,
64  const perception::PerceptionObstacle& perception_obstacle,
65  const prediction::ObstaclePriority::Priority& obstacle_priority,
66  const bool is_static);
67  Obstacle(const std::string& id,
68  const perception::PerceptionObstacle& perception_obstacle,
69  const prediction::Trajectory& trajectory,
70  const prediction::ObstaclePriority::Priority& obstacle_priority,
71  const bool is_static);
72 
73  const std::string& Id() const { return id_; }
74  void SetId(const std::string& id) { id_ = id; }
75 
76  double speed() const { return speed_; }
77 
78  int32_t PerceptionId() const { return perception_id_; }
79 
80  bool IsStatic() const { return is_static_; }
81  bool IsVirtual() const { return is_virtual_; }
82 
83  common::TrajectoryPoint GetPointAtTime(const double time) const;
84 
86  const common::TrajectoryPoint& point) const;
87 
89  return perception_bounding_box_;
90  }
92  return perception_polygon_;
93  }
94  const prediction::Trajectory& Trajectory() const { return trajectory_; }
95  common::TrajectoryPoint* AddTrajectoryPoint() {
96  return trajectory_.add_trajectory_point();
97  }
98  bool HasTrajectory() const {
99  return !(trajectory_.trajectory_point().empty());
100  }
101 
102  const perception::PerceptionObstacle& Perception() const {
103  return perception_obstacle_;
104  }
105 
113  static std::list<std::unique_ptr<Obstacle>> CreateObstacles(
114  const prediction::PredictionObstacles& predictions);
115 
116  static std::unique_ptr<Obstacle> CreateStaticVirtualObstacles(
117  const std::string& id, const common::math::Box2d& obstacle_box);
118 
119  static bool IsValidPerceptionObstacle(
120  const perception::PerceptionObstacle& obstacle);
121 
122  static bool IsValidTrajectoryPoint(const common::TrajectoryPoint& point);
123 
124  inline bool IsCautionLevelObstacle() const {
125  return is_caution_level_obstacle_;
126  }
127 
128  // const Obstacle* obstacle() const;
129 
134  const ObjectDecisionType& LateralDecision() const;
135 
140  const ObjectDecisionType& LongitudinalDecision() const;
141 
142  std::string DebugString() const;
143 
144  const SLBoundary& PerceptionSLBoundary() const;
145 
146  const STBoundary& reference_line_st_boundary() const;
147 
148  const STBoundary& path_st_boundary() const;
149 
150  const std::vector<std::string>& decider_tags() const;
151 
152  const std::vector<ObjectDecisionType>& decisions() const;
153 
154  void AddLongitudinalDecision(const std::string& decider_tag,
155  const ObjectDecisionType& decision);
156 
157  void AddLateralDecision(const std::string& decider_tag,
158  const ObjectDecisionType& decision);
159  bool HasLateralDecision() const;
160 
161  void set_path_st_boundary(const STBoundary& boundary);
162 
164  return path_st_boundary_initialized_;
165  }
166 
168 
169  void EraseStBoundary();
170 
171  void SetReferenceLineStBoundary(const STBoundary& boundary);
172 
174 
176 
177  bool HasLongitudinalDecision() const;
178 
179  bool HasNonIgnoreDecision() const;
180 
185  double MinRadiusStopDistance(const common::VehicleParam& vehicle_param) const;
186 
193  bool IsIgnore() const;
194  bool IsLongitudinalIgnore() const;
195  bool IsLateralIgnore() const;
196 
197  void BuildReferenceLineStBoundary(const ReferenceLine& reference_line,
198  const double adc_start_s);
199 
200  void SetPerceptionSlBoundary(const SLBoundary& sl_boundary);
201 
205  static bool IsLongitudinalDecision(const ObjectDecisionType& decision);
206 
210  static bool IsLateralDecision(const ObjectDecisionType& decision);
211 
212  void SetBlockingObstacle(bool blocking) { is_blocking_obstacle_ = blocking; }
213  bool IsBlockingObstacle() const { return is_blocking_obstacle_; }
214 
215  /*
216  * @brief IsLaneBlocking is only meaningful when IsStatic() == true.
217  */
218  bool IsLaneBlocking() const { return is_lane_blocking_; }
219  void CheckLaneBlocking(const ReferenceLine& reference_line);
220  bool IsLaneChangeBlocking() const { return is_lane_change_blocking_; }
221  void SetLaneChangeBlocking(const bool is_distance_clear);
222 
223  private:
224  FRIEND_TEST(MergeLongitudinalDecision, AllDecisions);
225  static ObjectDecisionType MergeLongitudinalDecision(
226  const ObjectDecisionType& lhs, const ObjectDecisionType& rhs);
227  FRIEND_TEST(MergeLateralDecision, AllDecisions);
228  static ObjectDecisionType MergeLateralDecision(const ObjectDecisionType& lhs,
229  const ObjectDecisionType& rhs);
230 
231  bool BuildTrajectoryStBoundary(const ReferenceLine& reference_line,
232  const double adc_start_s,
233  STBoundary* const st_boundary);
234  bool IsValidObstacle(
235  const perception::PerceptionObstacle& perception_obstacle);
236 
237  private:
238  std::string id_;
239  int32_t perception_id_ = 0;
240  bool is_static_ = false;
241  bool is_virtual_ = false;
242  double speed_ = 0.0;
243 
244  bool path_st_boundary_initialized_ = false;
245 
246  prediction::Trajectory trajectory_;
247  perception::PerceptionObstacle perception_obstacle_;
248  common::math::Box2d perception_bounding_box_;
249  common::math::Polygon2d perception_polygon_;
250 
251  std::vector<ObjectDecisionType> decisions_;
252  std::vector<std::string> decider_tags_;
253  SLBoundary sl_boundary_;
254 
255  STBoundary reference_line_st_boundary_;
256  STBoundary path_st_boundary_;
257 
258  ObjectDecisionType lateral_decision_;
259  ObjectDecisionType longitudinal_decision_;
260 
261  // for keep_clear usage only
262  bool is_blocking_obstacle_ = false;
263 
264  bool is_lane_blocking_ = false;
265 
266  bool is_lane_change_blocking_ = false;
267 
268  bool is_caution_level_obstacle_ = false;
269 
270  double min_radius_stop_distance_ = -1.0;
271 
272  struct ObjectTagCaseHash {
273  size_t operator()(
274  const planning::ObjectDecisionType::ObjectTagCase tag) const {
275  return static_cast<size_t>(tag);
276  }
277  };
278 
279  static const std::unordered_map<ObjectDecisionType::ObjectTagCase, int,
280  ObjectTagCaseHash>
281  s_lateral_decision_safety_sorter_;
282  static const std::unordered_map<ObjectDecisionType::ObjectTagCase, int,
283  ObjectTagCaseHash>
284  s_longitudinal_decision_safety_sorter_;
285 };
286 
289 
290 } // namespace planning
291 } // namespace apollo
void SetStBoundaryType(const STBoundary::BoundaryType type)
void SetBlockingObstacle(bool blocking)
Definition: obstacle.h:212
This is the class that associates an Obstacle with its path properties. An obstacle&#39;s path properties...
Definition: obstacle.h:60
void SetPerceptionSlBoundary(const SLBoundary &sl_boundary)
Defines the Vec2d class.
bool IsLaneChangeBlocking() const
Definition: obstacle.h:220
bool IsBlockingObstacle() const
Definition: obstacle.h:213
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void SetReferenceLineStBoundaryType(const STBoundary::BoundaryType type)
static bool IsValidTrajectoryPoint(const common::TrajectoryPoint &point)
bool IsIgnore() const
Check if this object can be safely ignored. The object will be ignored if the lateral decision is ign...
static std::unique_ptr< Obstacle > CreateStaticVirtualObstacles(const std::string &id, const common::math::Box2d &obstacle_box)
bool IsLaneBlocking() const
Definition: obstacle.h:218
const std::vector< std::string > & decider_tags() const
const STBoundary & reference_line_st_boundary() const
Planning module main class. It processes GPS and IMU as input, to generate planning info...
static bool IsLongitudinalDecision(const ObjectDecisionType &decision)
check if an ObjectDecisionType is a longitudinal decision.
The class of polygon in 2-D.
Definition: polygon2d.h:43
const STBoundary & path_st_boundary() const
void SetLaneChangeBlocking(const bool is_distance_clear)
static std::list< std::unique_ptr< Obstacle > > CreateObstacles(const prediction::PredictionObstacles &predictions)
This is a helper function that can create obstacles from prediction data. The original prediction may...
bool HasNonIgnoreDecision() const
const perception::PerceptionObstacle & Perception() const
Definition: obstacle.h:102
double MinRadiusStopDistance(const common::VehicleParam &vehicle_param) const
Calculate stop distance with the obstacle using the ADC&#39;s minimum turning radius. ...
void AddLongitudinalDecision(const std::string &decider_tag, const ObjectDecisionType &decision)
void AddLateralDecision(const std::string &decider_tag, const ObjectDecisionType &decision)
common::TrajectoryPoint GetPointAtTime(const double time) const
std::string DebugString() const
bool HasTrajectory() const
Definition: obstacle.h:98
void SetReferenceLineStBoundary(const STBoundary &boundary)
Rectangular (undirected) bounding box in 2-D.
Definition: box2d.h:52
static bool IsLateralDecision(const ObjectDecisionType &decision)
check if an ObjectDecisionType is a lateral decision.
Definition: st_boundary.h:38
bool IsVirtual() const
Definition: obstacle.h:81
void BuildReferenceLineStBoundary(const ReferenceLine &reference_line, const double adc_start_s)
common::math::Box2d GetBoundingBox(const common::TrajectoryPoint &point) const
bool HasLateralDecision() const
void SetId(const std::string &id)
Definition: obstacle.h:74
int32_t PerceptionId() const
Definition: obstacle.h:78
const prediction::Trajectory & Trajectory() const
Definition: obstacle.h:94
static bool IsValidPerceptionObstacle(const perception::PerceptionObstacle &obstacle)
bool HasLongitudinalDecision() const
void set_path_st_boundary(const STBoundary &boundary)
Definition: reference_line.h:39
ThreadSafeIndexedList< std::string, Obstacle > ThreadSafeIndexedObstacles
Definition: obstacle.h:288
const ObjectDecisionType & LongitudinalDecision() const
return the merged longitudinal decision Longitudinal decision is one of {Stop, Yield, Follow, Overtake, Ignore}
const std::string & Id() const
Definition: obstacle.h:73
IndexedList< std::string, Obstacle > IndexedObstacles
Definition: obstacle.h:287
The class of Box2d. Here, the x/y axes are respectively Forward/Left, as opposed to what happens in e...
void CheckLaneBlocking(const ReferenceLine &reference_line)
const common::math::Box2d & PerceptionBoundingBox() const
Definition: obstacle.h:88
common::TrajectoryPoint * AddTrajectoryPoint()
Definition: obstacle.h:95
bool IsCautionLevelObstacle() const
Definition: obstacle.h:124
bool IsStatic() const
Definition: obstacle.h:80
const ObjectDecisionType & LateralDecision() const
const common::math::Polygon2d & PerceptionPolygon() const
Definition: obstacle.h:91
BoundaryType
Definition: st_boundary.h:80
bool IsLongitudinalIgnore() const
double speed() const
Definition: obstacle.h:76
bool is_path_st_boundary_initialized()
Definition: obstacle.h:163
const std::vector< ObjectDecisionType > & decisions() const
const SLBoundary & PerceptionSLBoundary() const