Apollo 11.0
自动驾驶开放平台
backside_vehicle.cc
浏览该文件的文档.
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
22
23#include <memory>
24#include <string>
25
26namespace apollo {
27namespace planning {
28
33
34
36 const std::string& name,
37 const std::shared_ptr<DependencyInjector>& injector) {
38 if (!TrafficRule::Init(name, injector)) {
39 return false;
40 }
41 // Load the config this task.
42 return TrafficRule::LoadConfig<BacksideVehicleConfig>(&config_);
43}
44
45void BacksideVehicle::MakeLaneKeepingObstacleDecision(
46 const SLBoundary& adc_sl_boundary, PathDecision* path_decision,
47 const VehicleState& vehicle_state) {
48 ObjectDecisionType ignore;
49 ignore.mutable_ignore();
50 const double adc_length_s =
51 adc_sl_boundary.end_s() - adc_sl_boundary.start_s();
52 for (const auto* obstacle : path_decision->obstacles().Items()) {
53 if (obstacle->PerceptionSLBoundary().end_s() >= adc_sl_boundary.start_s()) {
54 // don't ignore such vehicles.
55 continue;
56 }
57
58 if (obstacle->IsCautionLevelObstacle() &&
59 obstacle->PerceptionSLBoundary().start_s() >=
60 adc_sl_boundary.start_s()) {
61 // don't ignore such vehicles.
62 continue;
63 }
64
65 if (obstacle->reference_line_st_boundary().IsEmpty()) {
66 path_decision->AddLongitudinalDecision("backside_vehicle/no-st-region",
67 obstacle->Id(), ignore);
68 path_decision->AddLateralDecision("backside_vehicle/no-st-region",
69 obstacle->Id(), ignore);
70 continue;
71 }
72 // Ignore the car comes from back of ADC
73 if (obstacle->reference_line_st_boundary().min_s() < -adc_length_s) {
74 path_decision->AddLongitudinalDecision("backside_vehicle/st-min-s < adc",
75 obstacle->Id(), ignore);
76 path_decision->AddLateralDecision("backside_vehicle/st-min-s < adc",
77 obstacle->Id(), ignore);
78 continue;
79 }
80
81 const double lane_boundary = config_.backside_lane_width();
82 if (obstacle->PerceptionSLBoundary().start_s() < adc_sl_boundary.end_s()) {
83 if (obstacle->PerceptionSLBoundary().start_l() > lane_boundary ||
84 obstacle->PerceptionSLBoundary().end_l() < -lane_boundary) {
85 continue;
86 }
87 path_decision->AddLongitudinalDecision("backside_vehicle/sl < adc.end_s",
88 obstacle->Id(), ignore);
89 path_decision->AddLateralDecision("backside_vehicle/sl < adc.end_s",
90 obstacle->Id(), ignore);
91 continue;
92 }
93
94 if (PredictionLineOverlapEgo(*obstacle, vehicle_state)) {
95 ADEBUG << "Prediction Line Overlap Ego Obstacle " << obstacle->Id();
96 path_decision->AddLongitudinalDecision("backside_vehicle/"
97 "prediction line overlap ego",
98 obstacle->Id(), ignore);
99 path_decision->AddLateralDecision("backside_vehicle/"
100 "prediction line overlap ego",
101 obstacle->Id(), ignore);
102 continue;
103 }
104 }
105}
106
108 Frame* const, ReferenceLineInfo* const reference_line_info) {
109 auto* path_decision = reference_line_info->path_decision();
110 const auto& adc_sl_boundary = reference_line_info->AdcSlBoundary();
111 const VehicleState& vehicle_state = reference_line_info->vehicle_state();
112 // The lane keeping reference line.
113 if (reference_line_info->Lanes().IsOnSegment()) {
114 MakeLaneKeepingObstacleDecision(adc_sl_boundary, path_decision,
115 vehicle_state);
116 }
117 return Status::OK();
118}
119
120bool BacksideVehicle::PredictionLineOverlapEgo(
121 const Obstacle& obstacle, const VehicleState& vehicle_state) {
122 const auto& trajectory = obstacle.Trajectory().trajectory_point();
123
124 if (trajectory.empty()) return false;
125
126 const auto vehicle_param =
128 Box2d adc_box({vehicle_state.x(), vehicle_state.y()}, vehicle_state.heading(),
129 vehicle_param.length(), vehicle_param.width());
130 Polygon2d adc_polygon(adc_box);
131 for (auto& point : trajectory) {
132 Polygon2d obs_polygon = obstacle.GetObstacleTrajectoryPolygon(point);
133 if (adc_polygon.HasOverlap(obs_polygon)) {
134 return true;
135 }
136 }
137 return false;
138}
139
140} // namespace planning
141} // namespace apollo
A general class to denote the return status of an API call.
Definition status.h:43
static Status OK()
generate a success status.
Definition status.h:60
static const VehicleConfig & GetConfig()
Get the current vehicle configuration.
Rectangular (undirected) bounding box in 2-D.
Definition box2d.h:52
The class of polygon in 2-D.
Definition polygon2d.h:42
bool Init(const std::string &name, const std::shared_ptr< DependencyInjector > &injector) override
common::Status ApplyRule(Frame *const frame, ReferenceLineInfo *const reference_line_info)
Frame holds all data for one planning cycle.
Definition frame.h:62
This is the class that associates an Obstacle with its path properties.
Definition obstacle.h:62
const prediction::Trajectory & Trajectory() const
Definition obstacle.h:96
common::math::Polygon2d GetObstacleTrajectoryPolygon(const common::TrajectoryPoint &point) const
Definition obstacle.cc:773
PathDecision represents all obstacle decisions on one path.
bool AddLateralDecision(const std::string &tag, const std::string &object_id, const ObjectDecisionType &decision)
bool AddLongitudinalDecision(const std::string &tag, const std::string &object_id, const ObjectDecisionType &decision)
ReferenceLineInfo holds all data for one reference line.
const common::VehicleState & vehicle_state() const
const hdmap::RouteSegments & Lanes() const
const SLBoundary & AdcSlBoundary() const
virtual bool Init(const std::string &name, const std::shared_ptr< DependencyInjector > &injector)
Planning module main class.
#define ADEBUG
Definition log.h:41
class register implement
Definition arena_queue.h:37
optional VehicleParam vehicle_param
repeated apollo::common::TrajectoryPoint trajectory_point
Definition feature.proto:78