Apollo 11.0
自动驾驶开放平台
obstacle.h
浏览该文件的文档.
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_msgs/config_msgs/vehicle_config.pb.h"
30#include "modules/common_msgs/perception_msgs/perception_obstacle.pb.h"
31#include "modules/common_msgs/planning_msgs/decision.pb.h"
32#include "modules/common_msgs/planning_msgs/sl_boundary.pb.h"
33#include "modules/common_msgs/prediction_msgs/prediction_obstacle.pb.h"
34
41
42namespace apollo {
43namespace planning {
44
62class Obstacle {
63 public:
64 Obstacle() = default;
65 Obstacle(const std::string& id,
66 const perception::PerceptionObstacle& perception_obstacle,
67 const prediction::ObstaclePriority::Priority& obstacle_priority,
68 const bool is_static);
69 Obstacle(const std::string& id,
70 const perception::PerceptionObstacle& perception_obstacle,
71 const prediction::Trajectory& trajectory,
72 const prediction::ObstaclePriority::Priority& obstacle_priority,
73 const bool is_static);
74
75 const std::string& Id() const { return id_; }
76 void SetId(const std::string& id) { id_ = id; }
77
78 double speed() const { return speed_; }
79
80 int32_t PerceptionId() const { return perception_id_; }
81
82 bool IsStatic() const { return is_static_; }
83 bool IsVirtual() const { return is_virtual_; }
84
85 common::TrajectoryPoint GetPointAtTime(const double time) const;
86
88 const common::TrajectoryPoint& point) const;
89
91 return perception_bounding_box_;
92 }
94 return perception_polygon_;
95 }
96 const prediction::Trajectory& Trajectory() const { return trajectory_; }
97
98 bool HasTrajectory() const {
99 return !(trajectory_.trajectory_point().empty());
100 }
101
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 void PrintPolygonCurve() const;
145
146 const SLBoundary& PerceptionSLBoundary() const;
147
149
150 const STBoundary& path_st_boundary() const;
151
152 const std::vector<std::string>& decider_tags() const;
153
154 const std::vector<ObjectDecisionType>& decisions() const;
155
156 void AddLongitudinalDecision(const std::string& decider_tag,
157 const ObjectDecisionType& decision);
158
159 void AddLateralDecision(const std::string& decider_tag,
160 const ObjectDecisionType& decision);
161 bool HasLateralDecision() const;
162
163 void set_path_st_boundary(const STBoundary& boundary);
164
166 return path_st_boundary_initialized_;
167 }
168
170
171 void EraseStBoundary();
172
173 void EraseDecision();
174
175 void SetReferenceLineStBoundary(const STBoundary& boundary);
176
178
180
181 bool HasLongitudinalDecision() const;
182
183 bool HasNonIgnoreDecision() const;
184
189 double MinRadiusStopDistance(const common::VehicleParam& vehicle_param) const;
190
197 bool IsIgnore() const;
198 bool IsLongitudinalIgnore() const;
199 bool IsLateralIgnore() const;
200
201 void BuildReferenceLineStBoundary(const ReferenceLine& reference_line,
202 const double adc_start_s);
203
204 void SetPerceptionSlBoundary(const SLBoundary& sl_boundary);
205
209 static bool IsLongitudinalDecision(const ObjectDecisionType& decision);
210
214 static bool IsLateralDecision(const ObjectDecisionType& decision);
215
216 void SetBlockingObstacle(bool blocking) { is_blocking_obstacle_ = blocking; }
217 bool IsBlockingObstacle() const { return is_blocking_obstacle_; }
218
219 /*
220 * @brief IsLaneBlocking is only meaningful when IsStatic() == true.
221 */
222 bool IsLaneBlocking() const { return is_lane_blocking_; }
223 void CheckLaneBlocking(const ReferenceLine& reference_line);
224 bool IsLaneChangeBlocking() const { return is_lane_change_blocking_; }
225 void SetLaneChangeBlocking(const bool is_distance_clear);
227 const common::TrajectoryPoint& point) const;
228
229 private:
230 FRIEND_TEST(MergeLongitudinalDecision, AllDecisions);
231 static ObjectDecisionType MergeLongitudinalDecision(
232 const ObjectDecisionType& lhs, const ObjectDecisionType& rhs);
233 FRIEND_TEST(MergeLateralDecision, AllDecisions);
234 static ObjectDecisionType MergeLateralDecision(const ObjectDecisionType& lhs,
235 const ObjectDecisionType& rhs);
236
237 bool BuildTrajectoryStBoundary(const ReferenceLine& reference_line,
238 const double adc_start_s,
239 STBoundary* const st_boundary);
240 bool IsValidObstacle(
241 const perception::PerceptionObstacle& perception_obstacle);
242
243 private:
244 std::string id_;
245 int32_t perception_id_ = 0;
246 bool is_static_ = false;
247 bool is_virtual_ = false;
248 double speed_ = 0.0;
249
250 bool path_st_boundary_initialized_ = false;
251
252 prediction::Trajectory trajectory_;
253 perception::PerceptionObstacle perception_obstacle_;
254 common::math::Box2d perception_bounding_box_;
255 common::math::Polygon2d perception_polygon_;
256
257 std::vector<ObjectDecisionType> decisions_;
258 std::vector<std::string> decider_tags_;
259 SLBoundary sl_boundary_;
260
261 STBoundary reference_line_st_boundary_;
262 STBoundary path_st_boundary_;
263
264 ObjectDecisionType lateral_decision_;
265 ObjectDecisionType longitudinal_decision_;
266
267 // for keep_clear usage only
268 bool is_blocking_obstacle_ = false;
269
270 bool is_lane_blocking_ = false;
271
272 bool is_lane_change_blocking_ = false;
273
274 bool is_caution_level_obstacle_ = false;
275
276 double min_radius_stop_distance_ = -1.0;
277
278 struct ObjectTagCaseHash {
279 size_t operator()(
280 const planning::ObjectDecisionType::ObjectTagCase tag) const {
281 return static_cast<size_t>(tag);
282 }
283 };
284
285 static const std::unordered_map<ObjectDecisionType::ObjectTagCase, int,
286 ObjectTagCaseHash>
287 s_lateral_decision_safety_sorter_;
288 static const std::unordered_map<ObjectDecisionType::ObjectTagCase, int,
289 ObjectTagCaseHash>
290 s_longitudinal_decision_safety_sorter_;
291};
292
295
296} // namespace planning
297} // namespace apollo
The class of Box2d.
Rectangular (undirected) bounding box in 2-D.
Definition box2d.h:52
The class of polygon in 2-D.
Definition polygon2d.h:42
This is the class that associates an Obstacle with its path properties.
Definition obstacle.h:62
static bool IsLongitudinalDecision(const ObjectDecisionType &decision)
check if an ObjectDecisionType is a longitudinal decision.
Definition obstacle.cc:537
std::string DebugString() const
Definition obstacle.cc:675
const std::vector< std::string > & decider_tags() const
Definition obstacle.cc:525
const STBoundary & path_st_boundary() const
Definition obstacle.cc:521
const STBoundary & reference_line_st_boundary() const
Definition obstacle.cc:517
static bool IsLateralDecision(const ObjectDecisionType &decision)
check if an ObjectDecisionType is a lateral decision.
Definition obstacle.cc:533
void SetReferenceLineStBoundaryType(const STBoundary::BoundaryType type)
Definition obstacle.cc:719
bool IsLongitudinalIgnore() const
Definition obstacle.cc:589
const std::vector< ObjectDecisionType > & decisions() const
Definition obstacle.cc:529
const perception::PerceptionObstacle & Perception() const
Definition obstacle.h:102
void AddLongitudinalDecision(const std::string &decider_tag, const ObjectDecisionType &decision)
Definition obstacle.cc:646
const ObjectDecisionType & LateralDecision() const
return the merged lateral decision Lateral decision is one of {Nudge, Ignore}
Definition obstacle.cc:581
common::TrajectoryPoint GetPointAtTime(const double time) const
Definition obstacle.cc:124
bool HasTrajectory() const
Definition obstacle.h:98
void SetId(const std::string &id)
Definition obstacle.h:76
static bool IsValidTrajectoryPoint(const common::TrajectoryPoint &point)
Definition obstacle.cc:278
double MinRadiusStopDistance(const common::VehicleParam &vehicle_param) const
Calculate stop distance with the obstacle using the ADC's minimum turning radius
Definition obstacle.cc:293
void PrintPolygonCurve() const
Definition obstacle.cc:796
bool IsLaneBlocking() const
Definition obstacle.h:222
void SetReferenceLineStBoundary(const STBoundary &boundary)
Definition obstacle.cc:715
void SetBlockingObstacle(bool blocking)
Definition obstacle.h:216
void AddLateralDecision(const std::string &decider_tag, const ObjectDecisionType &decision)
Definition obstacle.cc:661
void CheckLaneBlocking(const ReferenceLine &reference_line)
Definition obstacle.cc:739
bool HasLongitudinalDecision() const
Definition obstacle.cc:636
const ObjectDecisionType & LongitudinalDecision() const
return the merged longitudinal decision Longitudinal decision is one of {Stop, Yield,...
Definition obstacle.cc:577
void SetLaneChangeBlocking(const bool is_distance_clear)
Definition obstacle.cc:767
const prediction::Trajectory & Trajectory() const
Definition obstacle.h:96
const std::string & Id() const
Definition obstacle.h:75
int32_t PerceptionId() const
Definition obstacle.h:80
bool IsCautionLevelObstacle() const
Definition obstacle.h:124
common::math::Box2d GetBoundingBox(const common::TrajectoryPoint &point) const
Definition obstacle.cc:159
void SetStBoundaryType(const STBoundary::BoundaryType type)
Definition obstacle.cc:703
bool IsLaneChangeBlocking() const
Definition obstacle.h:224
bool IsLateralIgnore() const
Definition obstacle.cc:593
bool IsBlockingObstacle() const
Definition obstacle.h:217
bool HasLateralDecision() const
Definition obstacle.cc:631
static std::unique_ptr< Obstacle > CreateStaticVirtualObstacles(const std::string &id, const common::math::Box2d &obstacle_box)
Definition obstacle.cc:244
static bool IsValidPerceptionObstacle(const perception::PerceptionObstacle &obstacle)
Definition obstacle.cc:167
bool HasNonIgnoreDecision() const
Definition obstacle.cc:641
void BuildReferenceLineStBoundary(const ReferenceLine &reference_line, const double adc_start_s)
Definition obstacle.cc:316
void set_path_st_boundary(const STBoundary &boundary)
Definition obstacle.cc:698
const SLBoundary & PerceptionSLBoundary() const
Definition obstacle.cc:694
bool is_path_st_boundary_initialized() const
Definition obstacle.h:165
double speed() const
Definition obstacle.h:78
const common::math::Polygon2d & PerceptionPolygon() const
Definition obstacle.h:93
static std::list< std::unique_ptr< Obstacle > > CreateObstacles(const prediction::PredictionObstacles &predictions)
This is a helper function that can create obstacles from prediction data.
Definition obstacle.cc:197
void SetPerceptionSlBoundary(const SLBoundary &sl_boundary)
Definition obstacle.cc:289
common::math::Polygon2d GetObstacleTrajectoryPolygon(const common::TrajectoryPoint &point) const
Definition obstacle.cc:773
const common::math::Box2d & PerceptionBoundingBox() const
Definition obstacle.h:90
bool IsIgnore() const
Check if this object can be safely ignored.
Definition obstacle.cc:585
Planning module main class.
ThreadSafeIndexedList< std::string, Obstacle > ThreadSafeIndexedObstacles
Definition obstacle.h:294
IndexedList< std::string, Obstacle > IndexedObstacles
Definition obstacle.h:293
class register implement
Definition arena_queue.h:37
repeated apollo::common::TrajectoryPoint trajectory_point
Definition feature.proto:78
Defines the Vec2d class.