Apollo 11.0
自动驾驶开放平台
end_condition_sampler.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 <algorithm>
24
25#include "cyber/common/log.h"
27
28namespace apollo {
29namespace planning {
30
31using State = std::array<double, 3>;
32using Condition = std::pair<State, double>;
33
35 const State& init_s, const State& init_d,
36 std::shared_ptr<PathTimeGraph> ptr_path_time_graph,
37 std::shared_ptr<PredictionQuerier> ptr_prediction_querier)
38 : init_s_(init_s),
39 init_d_(init_d),
40 feasible_region_(init_s),
41 ptr_path_time_graph_(std::move(ptr_path_time_graph)),
42 ptr_prediction_querier_(std::move(ptr_prediction_querier)) {}
43
44std::vector<Condition> EndConditionSampler::SampleLatEndConditions() const {
45 std::vector<Condition> end_d_conditions;
46 std::array<double, 3> end_d_candidates = {0.0, -0.5, 0.5};
47 std::array<double, 4> end_s_candidates = {10.0, 20.0, 40.0, 80.0};
48
49 for (const auto& s : end_s_candidates) {
50 for (const auto& d : end_d_candidates) {
51 State end_d_state = {d, 0.0, 0.0};
52 end_d_conditions.emplace_back(end_d_state, s);
53 }
54 }
55 return end_d_conditions;
56}
57
59 const double ref_cruise_speed) const {
60 CHECK_GT(FLAGS_num_velocity_sample, 1U);
61
62 // time interval is one second plus the last one 0.01
63 static constexpr size_t num_of_time_samples = 9;
64 std::array<double, num_of_time_samples> time_samples;
65 for (size_t i = 1; i < num_of_time_samples; ++i) {
66 auto ratio =
67 static_cast<double>(i) / static_cast<double>(num_of_time_samples - 1);
68 time_samples[i] = FLAGS_trajectory_time_length * ratio;
69 }
70 time_samples[0] = FLAGS_polynomial_minimal_param;
71
72 std::vector<Condition> end_s_conditions;
73 for (const auto& time : time_samples) {
74 double v_upper = std::min(feasible_region_.VUpper(time), ref_cruise_speed);
75 double v_lower = feasible_region_.VLower(time);
76
77 State lower_end_s = {0.0, v_lower, 0.0};
78 end_s_conditions.emplace_back(lower_end_s, time);
79
80 State upper_end_s = {0.0, v_upper, 0.0};
81 end_s_conditions.emplace_back(upper_end_s, time);
82
83 double v_range = v_upper - v_lower;
84 // Number of sample velocities
85 size_t num_of_mid_points =
86 std::min(static_cast<size_t>(FLAGS_num_velocity_sample - 2),
87 static_cast<size_t>(v_range / FLAGS_min_velocity_sample_gap));
88
89 if (num_of_mid_points > 0) {
90 double velocity_seg =
91 v_range / static_cast<double>(num_of_mid_points + 1);
92 for (size_t i = 1; i <= num_of_mid_points; ++i) {
93 State end_s = {0.0, v_lower + velocity_seg * static_cast<double>(i),
94 0.0};
95 end_s_conditions.emplace_back(end_s, time);
96 }
97 }
98 }
99 return end_s_conditions;
100}
101
103 const double ref_stop_point) const {
104 // time interval is one second plus the last one 0.01
105 static constexpr size_t num_of_time_samples = 9;
106 std::array<double, num_of_time_samples> time_samples;
107 for (size_t i = 1; i < num_of_time_samples; ++i) {
108 auto ratio =
109 static_cast<double>(i) / static_cast<double>(num_of_time_samples - 1);
110 time_samples[i] = FLAGS_trajectory_time_length * ratio;
111 }
112 time_samples[0] = FLAGS_polynomial_minimal_param;
113
114 std::vector<Condition> end_s_conditions;
115 for (const auto& time : time_samples) {
116 State end_s = {std::max(init_s_[0], ref_stop_point), 0.0, 0.0};
117 end_s_conditions.emplace_back(end_s, time);
118 }
119 return end_s_conditions;
120}
121
122std::vector<Condition>
124 std::vector<Condition> end_s_conditions;
125
126 std::vector<SamplePoint> sample_points = QueryPathTimeObstacleSamplePoints();
127 for (const SamplePoint& sample_point : sample_points) {
128 if (sample_point.path_time_point.t() < FLAGS_polynomial_minimal_param) {
129 continue;
130 }
131 double s = sample_point.path_time_point.s();
132 double v = sample_point.ref_v;
133 double t = sample_point.path_time_point.t();
134 if (s > feasible_region_.SUpper(t) || s < feasible_region_.SLower(t)) {
135 continue;
136 }
137 State end_state = {s, v, 0.0};
138 end_s_conditions.emplace_back(end_state, t);
139 }
140 return end_s_conditions;
141}
142
143std::vector<SamplePoint>
144EndConditionSampler::QueryPathTimeObstacleSamplePoints() const {
145 const auto& vehicle_config =
146 common::VehicleConfigHelper::Instance()->GetConfig();
147 std::vector<SamplePoint> sample_points;
148 for (const auto& path_time_obstacle :
149 ptr_path_time_graph_->GetPathTimeObstacles()) {
150 std::string obstacle_id = path_time_obstacle.id();
151 QueryFollowPathTimePoints(vehicle_config, obstacle_id, &sample_points);
152 QueryOvertakePathTimePoints(vehicle_config, obstacle_id, &sample_points);
153 }
154 return sample_points;
155}
156
157void EndConditionSampler::QueryFollowPathTimePoints(
158 const common::VehicleConfig& vehicle_config, const std::string& obstacle_id,
159 std::vector<SamplePoint>* const sample_points) const {
160 std::vector<STPoint> follow_path_time_points =
161 ptr_path_time_graph_->GetObstacleSurroundingPoints(
162 obstacle_id, -FLAGS_numerical_epsilon, FLAGS_time_min_density);
163
164 for (const auto& path_time_point : follow_path_time_points) {
165 double v = ptr_prediction_querier_->ProjectVelocityAlongReferenceLine(
166 obstacle_id, path_time_point.s(), path_time_point.t());
167 // Generate candidate s
168 double s_upper = path_time_point.s() -
169 vehicle_config.vehicle_param().front_edge_to_center();
170 double s_lower = s_upper - FLAGS_default_lon_buffer;
171 CHECK_GE(FLAGS_num_sample_follow_per_timestamp, 2U);
172 double s_gap =
173 FLAGS_default_lon_buffer /
174 static_cast<double>(FLAGS_num_sample_follow_per_timestamp - 1);
175 for (size_t i = 0; i < FLAGS_num_sample_follow_per_timestamp; ++i) {
176 double s = s_lower + s_gap * static_cast<double>(i);
177 SamplePoint sample_point;
178 sample_point.path_time_point = path_time_point;
179 sample_point.path_time_point.set_s(s);
180 sample_point.ref_v = v;
181 sample_points->push_back(std::move(sample_point));
182 }
183 }
184}
185
186void EndConditionSampler::QueryOvertakePathTimePoints(
187 const common::VehicleConfig& vehicle_config, const std::string& obstacle_id,
188 std::vector<SamplePoint>* sample_points) const {
189 std::vector<STPoint> overtake_path_time_points =
190 ptr_path_time_graph_->GetObstacleSurroundingPoints(
191 obstacle_id, FLAGS_numerical_epsilon, FLAGS_time_min_density);
192
193 for (const auto& path_time_point : overtake_path_time_points) {
194 double v = ptr_prediction_querier_->ProjectVelocityAlongReferenceLine(
195 obstacle_id, path_time_point.s(), path_time_point.t());
196 SamplePoint sample_point;
197 sample_point.path_time_point = path_time_point;
198 sample_point.path_time_point.set_s(path_time_point.s() +
199 FLAGS_default_lon_buffer);
200 sample_point.ref_v = v;
201 sample_points->push_back(std::move(sample_point));
202 }
203}
204
205} // namespace planning
206} // namespace apollo
EndConditionSampler(const std::array< double, 3 > &init_s, const std::array< double, 3 > &init_d, std::shared_ptr< PathTimeGraph > ptr_path_time_graph, std::shared_ptr< PredictionQuerier > ptr_prediction_querier)
std::vector< std::pair< std::array< double, 3 >, double > > SampleLatEndConditions() const
std::vector< std::pair< std::array< double, 3 >, double > > SampleLonEndConditionsForPathTimePoints() const
std::vector< std::pair< std::array< double, 3 >, double > > SampleLonEndConditionsForStopping(const double ref_stop_point) const
std::vector< std::pair< std::array< double, 3 >, double > > SampleLonEndConditionsForCruising(const double ref_cruise_speed) const
double VLower(const double t) const
double SLower(const double t) const
double SUpper(const double t) const
double VUpper(const double t) const
Planning module main class.
std::array< double, 3 > State
std::pair< State, double > Condition
class register implement
Definition arena_queue.h:37
Definition future.h:29