31using State = std::array<double, 3>;
36 std::shared_ptr<PathTimeGraph> ptr_path_time_graph,
37 std::shared_ptr<PredictionQuerier> ptr_prediction_querier)
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)) {}
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};
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);
55 return end_d_conditions;
59 const double ref_cruise_speed)
const {
60 CHECK_GT(FLAGS_num_velocity_sample, 1U);
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) {
67 static_cast<double>(i) /
static_cast<double>(num_of_time_samples - 1);
68 time_samples[i] = FLAGS_trajectory_time_length * ratio;
70 time_samples[0] = FLAGS_polynomial_minimal_param;
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);
77 State lower_end_s = {0.0, v_lower, 0.0};
78 end_s_conditions.emplace_back(lower_end_s, time);
80 State upper_end_s = {0.0, v_upper, 0.0};
81 end_s_conditions.emplace_back(upper_end_s, time);
83 double v_range = v_upper - v_lower;
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));
89 if (num_of_mid_points > 0) {
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),
95 end_s_conditions.emplace_back(end_s, time);
99 return end_s_conditions;
103 const double ref_stop_point)
const {
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) {
109 static_cast<double>(i) /
static_cast<double>(num_of_time_samples - 1);
110 time_samples[i] = FLAGS_trajectory_time_length * ratio;
112 time_samples[0] = FLAGS_polynomial_minimal_param;
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);
119 return end_s_conditions;
122std::vector<Condition>
124 std::vector<Condition> end_s_conditions;
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) {
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)) {
137 State end_state = {s, v, 0.0};
138 end_s_conditions.emplace_back(end_state, t);
140 return end_s_conditions;
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);
154 return sample_points;
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);
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());
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);
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));
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);
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));
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