Apollo 10.0
自动驾驶开放平台
apollo::hdmap::PathApproximation类 参考

#include <path.h>

apollo::hdmap::PathApproximation 的协作图:

Public 成员函数

 PathApproximation ()=default
 
 PathApproximation (const Path &path, const double max_error)
 
double max_error () const
 
const std::vector< int > & original_ids () const
 
const std::vector< common::math::LineSegment2d > & segments () const
 
bool GetProjection (const Path &path, const common::math::Vec2d &point, double *accumulate_s, double *lateral, double *distance) const
 
bool OverlapWith (const Path &path, const common::math::Box2d &box, double width) const
 

Protected 成员函数

void Init (const Path &path)
 
bool is_within_max_error (const Path &path, const int s, const int t)
 
double compute_max_error (const Path &path, const int s, const int t)
 
void InitDilute (const Path &path)
 
void InitProjections (const Path &path)
 

Protected 属性

double max_error_ = 0
 
double max_sqr_error_ = 0
 
int num_points_ = 0
 
std::vector< int > original_ids_
 
std::vector< common::math::LineSegment2dsegments_
 
std::vector< double > max_error_per_segment_
 
std::vector< double > projections_
 
double max_projection_
 
int num_projection_samples_ = 0
 
std::vector< double > original_projections_
 
std::vector< double > max_original_projections_to_left_
 
std::vector< double > min_original_projections_to_right_
 
std::vector< int > sampled_max_original_projections_to_left_
 

详细描述

在文件 path.h153 行定义.

构造及析构函数说明

◆ PathApproximation() [1/2]

apollo::hdmap::PathApproximation::PathApproximation ( )
default

◆ PathApproximation() [2/2]

apollo::hdmap::PathApproximation::PathApproximation ( const Path path,
const double  max_error 
)
inline

在文件 path.h156 行定义.

成员函数说明

◆ compute_max_error()

double apollo::hdmap::PathApproximation::compute_max_error ( const Path path,
const int  s,
const int  t 
)
protected

在文件 path.cc1066 行定义.

1067 {
1068 if (s + 1 >= t) {
1069 return 0.0;
1070 }
1071 const auto& points = path.path_points();
1072 const LineSegment2d segment(points[s], points[t]);
1073 double max_distance_sqr = 0.0;
1074 for (int i = s + 1; i < t; ++i) {
1075 max_distance_sqr =
1076 std::max(max_distance_sqr, segment.DistanceSquareTo(points[i]));
1077 }
1078 return sqrt(max_distance_sqr);
1079}

◆ GetProjection()

bool apollo::hdmap::PathApproximation::GetProjection ( const Path path,
const common::math::Vec2d point,
double *  accumulate_s,
double *  lateral,
double *  distance 
) const

在文件 path.cc1215 行定义.

1218 {
1219 if (num_points_ == 0) {
1220 return false;
1221 }
1222 if (accumulate_s == nullptr || lateral == nullptr ||
1223 min_distance == nullptr) {
1224 return false;
1225 }
1226 double min_distance_sqr = std::numeric_limits<double>::infinity();
1227 int estimate_nearest_segment_idx = -1;
1228 std::vector<double> distance_sqr_to_segments;
1229 distance_sqr_to_segments.reserve(segments_.size());
1230 for (size_t i = 0; i < segments_.size(); ++i) {
1231 const double distance_sqr = segments_[i].DistanceSquareTo(point);
1232 distance_sqr_to_segments.push_back(distance_sqr);
1233 if (distance_sqr < min_distance_sqr) {
1234 min_distance_sqr = distance_sqr;
1235 estimate_nearest_segment_idx = static_cast<int>(i);
1236 }
1237 }
1238 if (estimate_nearest_segment_idx < 0) {
1239 return false;
1240 }
1241 const auto& original_segments = path.segments();
1242 const int num_original_segments = static_cast<int>(original_segments.size());
1243 const auto& original_accumulated_s = path.accumulated_s();
1244 double min_distance_sqr_with_error =
1245 Sqr(sqrt(min_distance_sqr) +
1246 max_error_per_segment_[estimate_nearest_segment_idx] + max_error_);
1247 *min_distance = std::numeric_limits<double>::infinity();
1248 int nearest_segment_idx = -1;
1249 for (size_t i = 0; i < segments_.size(); ++i) {
1250 if (distance_sqr_to_segments[i] >= min_distance_sqr_with_error) {
1251 continue;
1252 }
1253 int first_segment_idx = original_ids_[i];
1254 int last_segment_idx = original_ids_[i + 1] - 1;
1255 double max_original_projection = std::numeric_limits<double>::infinity();
1256 if (first_segment_idx < last_segment_idx) {
1257 const auto& segment = segments_[i];
1258 const double projection = segment.ProjectOntoUnit(point);
1259 const double prod_sqr = Sqr(segment.ProductOntoUnit(point));
1260 if (prod_sqr >= min_distance_sqr_with_error) {
1261 continue;
1262 }
1263 const double scan_distance = sqrt(min_distance_sqr_with_error - prod_sqr);
1264 const double min_projection = projection - scan_distance;
1265 max_original_projection = projections_[i] + projection + scan_distance;
1266 if (min_projection > 0.0) {
1267 const double limit = projections_[i] + min_projection;
1268 const int sample_index =
1269 std::max(0, static_cast<int>(limit / kSampleDistance));
1270 if (sample_index >= num_projection_samples_) {
1271 first_segment_idx = last_segment_idx;
1272 } else {
1273 first_segment_idx =
1274 std::max(first_segment_idx,
1276 if (first_segment_idx >= last_segment_idx) {
1277 first_segment_idx = last_segment_idx;
1278 } else {
1279 while (first_segment_idx < last_segment_idx &&
1280 max_original_projections_to_left_[first_segment_idx + 1] <
1281 limit) {
1282 ++first_segment_idx;
1283 }
1284 }
1285 }
1286 }
1287 }
1288 bool min_distance_updated = false;
1289 bool is_within_end_point = false;
1290 for (int idx = first_segment_idx; idx <= last_segment_idx; ++idx) {
1291 if (min_original_projections_to_right_[idx] > max_original_projection) {
1292 break;
1293 }
1294 const auto& original_segment = original_segments[idx];
1295 const double x0 = point.x() - original_segment.start().x();
1296 const double y0 = point.y() - original_segment.start().y();
1297 const double ux = original_segment.unit_direction().x();
1298 const double uy = original_segment.unit_direction().y();
1299 double proj = x0 * ux + y0 * uy;
1300 double distance = 0.0;
1301 if (proj < 0.0) {
1302 if (is_within_end_point) {
1303 continue;
1304 }
1305 is_within_end_point = true;
1306 distance = hypot(x0, y0);
1307 } else if (proj <= original_segment.length()) {
1308 is_within_end_point = true;
1309 distance = std::abs(x0 * uy - y0 * ux);
1310 } else {
1311 is_within_end_point = false;
1312 if (idx != last_segment_idx) {
1313 continue;
1314 }
1315 distance = original_segment.end().DistanceTo(point);
1316 }
1317 if (distance < *min_distance) {
1318 min_distance_updated = true;
1319 *min_distance = distance;
1320 nearest_segment_idx = idx;
1321 }
1322 }
1323 if (min_distance_updated) {
1324 min_distance_sqr_with_error = Sqr(*min_distance + max_error_);
1325 }
1326 }
1327 if (nearest_segment_idx >= 0) {
1328 const auto& segment = original_segments[nearest_segment_idx];
1329 double proj = segment.ProjectOntoUnit(point);
1330 const double prod = segment.ProductOntoUnit(point);
1331 if (nearest_segment_idx > 0) {
1332 proj = std::max(0.0, proj);
1333 }
1334 if (nearest_segment_idx + 1 < num_original_segments) {
1335 proj = std::min(segment.length(), proj);
1336 }
1337 *accumulate_s = original_accumulated_s[nearest_segment_idx] + proj;
1338 if ((nearest_segment_idx == 0 && proj < 0.0) ||
1339 (nearest_segment_idx + 1 == num_original_segments &&
1340 proj > segment.length())) {
1341 *lateral = prod;
1342 } else {
1343 *lateral = (prod > 0 ? (*min_distance) : -(*min_distance));
1344 }
1345 return true;
1346 }
1347 return false;
1348}
std::vector< common::math::LineSegment2d > segments_
Definition path.h:187
std::vector< double > min_original_projections_to_right_
Definition path.h:203
std::vector< int > sampled_max_original_projections_to_left_
Definition path.h:204
std::vector< double > max_error_per_segment_
Definition path.h:188
std::vector< double > projections_
Definition path.h:193
std::vector< int > original_ids_
Definition path.h:186
std::vector< double > max_original_projections_to_left_
Definition path.h:202
double Sqr(const double x)
Definition math_utils.cc:26

◆ Init()

void apollo::hdmap::PathApproximation::Init ( const Path path)
protected

在文件 path.cc1096 行定义.

1096 {
1097 InitDilute(path);
1098 InitProjections(path);
1099}
void InitProjections(const Path &path)
Definition path.cc:1143
void InitDilute(const Path &path)
Definition path.cc:1101

◆ InitDilute()

void apollo::hdmap::PathApproximation::InitDilute ( const Path path)
protected

在文件 path.cc1101 行定义.

1101 {
1102 const int num_original_points = path.num_points();
1103 original_ids_.clear();
1104 int last_idx = 0;
1105 while (last_idx < num_original_points - 1) {
1106 original_ids_.push_back(last_idx);
1107 int next_idx = last_idx + 1;
1108 int delta = 2;
1109 for (; last_idx + delta < num_original_points; delta *= 2) {
1110 if (!is_within_max_error(path, last_idx, last_idx + delta)) {
1111 break;
1112 }
1113 next_idx = last_idx + delta;
1114 }
1115 for (; delta > 0; delta /= 2) {
1116 if (next_idx + delta < num_original_points &&
1117 is_within_max_error(path, last_idx, next_idx + delta)) {
1118 next_idx += delta;
1119 }
1120 }
1121 last_idx = next_idx;
1122 }
1123 original_ids_.push_back(last_idx);
1124 num_points_ = static_cast<int>(original_ids_.size());
1125 if (num_points_ == 0) {
1126 return;
1127 }
1128
1129 segments_.clear();
1130 segments_.reserve(num_points_ - 1);
1131 for (int i = 0; i < num_points_ - 1; ++i) {
1132 segments_.emplace_back(path.path_points()[original_ids_[i]],
1133 path.path_points()[original_ids_[i + 1]]);
1134 }
1135 max_error_per_segment_.clear();
1137 for (int i = 0; i < num_points_ - 1; ++i) {
1138 max_error_per_segment_.push_back(
1140 }
1141}
bool is_within_max_error(const Path &path, const int s, const int t)
Definition path.cc:1081
double compute_max_error(const Path &path, const int s, const int t)
Definition path.cc:1066

◆ InitProjections()

void apollo::hdmap::PathApproximation::InitProjections ( const Path path)
protected

在文件 path.cc1143 行定义.

1143 {
1144 if (num_points_ == 0) {
1145 return;
1146 }
1147 projections_.clear();
1148 projections_.reserve(segments_.size() + 1);
1149 double s = 0.0;
1150 projections_.push_back(0);
1151 for (const auto& segment : segments_) {
1152 s += segment.length();
1153 projections_.push_back(s);
1154 }
1155 const auto& original_points = path.path_points();
1156 const int num_original_points = static_cast<int>(original_points.size());
1157 original_projections_.clear();
1158 original_projections_.reserve(num_original_points);
1159 for (size_t i = 0; i < projections_.size(); ++i) {
1160 original_projections_.push_back(projections_[i]);
1161 if (i + 1 < projections_.size()) {
1162 const auto& segment = segments_[i];
1163 for (int idx = original_ids_[i] + 1; idx < original_ids_[i + 1]; ++idx) {
1164 const double proj = segment.ProjectOntoUnit(original_points[idx]);
1165 original_projections_.push_back(
1166 projections_[i] + std::max(0.0, std::min(proj, segment.length())));
1167 }
1168 }
1169 }
1170
1171 // max_p_to_left[i] = max(p[0], p[1], ... p[i]).
1172 max_original_projections_to_left_.resize(num_original_points);
1173 double last_projection = -std::numeric_limits<double>::infinity();
1174 for (int i = 0; i < num_original_points; ++i) {
1175 last_projection = std::max(last_projection, original_projections_[i]);
1176 max_original_projections_to_left_[i] = last_projection;
1177 }
1178 for (int i = 0; i + 1 < num_original_points; ++i) {
1180 max_original_projections_to_left_[i + 1] + kMathEpsilon);
1181 }
1182
1183 // min_p_to_right[i] = min(p[i], p[i + 1], ... p[size - 1]).
1185 last_projection = std::numeric_limits<double>::infinity();
1186 for (int i = num_original_points - 1; i >= 0; --i) {
1187 last_projection = std::min(last_projection, original_projections_[i]);
1188 min_original_projections_to_right_[i] = last_projection;
1189 }
1190 for (int i = 0; i + 1 < num_original_points; ++i) {
1192 min_original_projections_to_right_[i + 1] + kMathEpsilon);
1193 }
1194
1195 // Sample max_p_to_left by sample_distance.
1198 static_cast<int>(max_projection_ / kSampleDistance) + 1;
1201 double proj = 0.0;
1202 int last_index = 0;
1203 for (int i = 0; i < num_projection_samples_; ++i) {
1204 while (last_index + 1 < num_original_points &&
1205 max_original_projections_to_left_[last_index + 1] < proj) {
1206 ++last_index;
1207 }
1208 sampled_max_original_projections_to_left_.push_back(last_index);
1209 proj += kSampleDistance;
1210 }
1212 static_cast<size_t>(num_projection_samples_));
1213}
std::vector< double > original_projections_
Definition path.h:199

◆ is_within_max_error()

bool apollo::hdmap::PathApproximation::is_within_max_error ( const Path path,
const int  s,
const int  t 
)
protected

在文件 path.cc1081 行定义.

1082 {
1083 if (s + 1 >= t) {
1084 return true;
1085 }
1086 const auto& points = path.path_points();
1087 const LineSegment2d segment(points[s], points[t]);
1088 for (int i = s + 1; i < t; ++i) {
1089 if (segment.DistanceSquareTo(points[i]) > max_sqr_error_) {
1090 return false;
1091 }
1092 }
1093 return true;
1094}

◆ max_error()

double apollo::hdmap::PathApproximation::max_error ( ) const
inline

在文件 path.h160 行定义.

160{ return max_error_; }

◆ original_ids()

const std::vector< int > & apollo::hdmap::PathApproximation::original_ids ( ) const
inline

在文件 path.h161 行定义.

161{ return original_ids_; }

◆ OverlapWith()

bool apollo::hdmap::PathApproximation::OverlapWith ( const Path path,
const common::math::Box2d box,
double  width 
) const

在文件 path.cc1350 行定义.

1351 {
1352 if (num_points_ == 0) {
1353 return false;
1354 }
1355 const Vec2d center = box.center();
1356 const double radius = box.diagonal() / 2.0 + width;
1357 const double radius_sqr = Sqr(radius);
1358 const auto& original_segments = path.segments();
1359 for (size_t i = 0; i < segments_.size(); ++i) {
1360 const LineSegment2d& segment = segments_[i];
1361 const double max_error = max_error_per_segment_[i];
1362 const double radius_sqr_with_error = Sqr(radius + max_error);
1363 if (segment.DistanceSquareTo(center) > radius_sqr_with_error) {
1364 continue;
1365 }
1366 int first_segment_idx = original_ids_[i];
1367 int last_segment_idx = original_ids_[i + 1] - 1;
1368 double max_original_projection = std::numeric_limits<double>::infinity();
1369 if (first_segment_idx < last_segment_idx) {
1370 const auto& segment = segments_[i];
1371 const double projection = segment.ProjectOntoUnit(center);
1372 const double prod_sqr = Sqr(segment.ProductOntoUnit(center));
1373 if (prod_sqr >= radius_sqr_with_error) {
1374 continue;
1375 }
1376 const double scan_distance = sqrt(radius_sqr_with_error - prod_sqr);
1377 const double min_projection = projection - scan_distance;
1378 max_original_projection = projections_[i] + projection + scan_distance;
1379 if (min_projection > 0.0) {
1380 const double limit = projections_[i] + min_projection;
1381 const int sample_index =
1382 std::max(0, static_cast<int>(limit / kSampleDistance));
1383 if (sample_index >= num_projection_samples_) {
1384 first_segment_idx = last_segment_idx;
1385 } else {
1386 first_segment_idx =
1387 std::max(first_segment_idx,
1389 if (first_segment_idx >= last_segment_idx) {
1390 first_segment_idx = last_segment_idx;
1391 } else {
1392 while (first_segment_idx < last_segment_idx &&
1393 max_original_projections_to_left_[first_segment_idx + 1] <
1394 limit) {
1395 ++first_segment_idx;
1396 }
1397 }
1398 }
1399 }
1400 }
1401 for (int idx = first_segment_idx; idx <= last_segment_idx; ++idx) {
1402 if (min_original_projections_to_right_[idx] > max_original_projection) {
1403 break;
1404 }
1405 const auto& original_segment = original_segments[idx];
1406 if (original_segment.DistanceSquareTo(center) > radius_sqr) {
1407 continue;
1408 }
1409 if (box.DistanceTo(original_segment) <= width) {
1410 return true;
1411 }
1412 }
1413 }
1414 return false;
1415}
uint32_t width
Width of point cloud

◆ segments()

const std::vector< common::math::LineSegment2d > & apollo::hdmap::PathApproximation::segments ( ) const
inline

在文件 path.h162 行定义.

162 {
163 return segments_;
164 }

类成员变量说明

◆ max_error_

double apollo::hdmap::PathApproximation::max_error_ = 0
protected

在文件 path.h182 行定义.

◆ max_error_per_segment_

std::vector<double> apollo::hdmap::PathApproximation::max_error_per_segment_
protected

在文件 path.h188 行定义.

◆ max_original_projections_to_left_

std::vector<double> apollo::hdmap::PathApproximation::max_original_projections_to_left_
protected

在文件 path.h202 行定义.

◆ max_projection_

double apollo::hdmap::PathApproximation::max_projection_
protected

在文件 path.h194 行定义.

◆ max_sqr_error_

double apollo::hdmap::PathApproximation::max_sqr_error_ = 0
protected

在文件 path.h183 行定义.

◆ min_original_projections_to_right_

std::vector<double> apollo::hdmap::PathApproximation::min_original_projections_to_right_
protected

在文件 path.h203 行定义.

◆ num_points_

int apollo::hdmap::PathApproximation::num_points_ = 0
protected

在文件 path.h185 行定义.

◆ num_projection_samples_

int apollo::hdmap::PathApproximation::num_projection_samples_ = 0
protected

在文件 path.h195 行定义.

◆ original_ids_

std::vector<int> apollo::hdmap::PathApproximation::original_ids_
protected

在文件 path.h186 行定义.

◆ original_projections_

std::vector<double> apollo::hdmap::PathApproximation::original_projections_
protected

在文件 path.h199 行定义.

◆ projections_

std::vector<double> apollo::hdmap::PathApproximation::projections_
protected

在文件 path.h193 行定义.

◆ sampled_max_original_projections_to_left_

std::vector<int> apollo::hdmap::PathApproximation::sampled_max_original_projections_to_left_
protected

在文件 path.h204 行定义.

◆ segments_

std::vector<common::math::LineSegment2d> apollo::hdmap::PathApproximation::segments_
protected

在文件 path.h187 行定义.


该类的文档由以下文件生成: