Skip to content

Commit 4d368b9

Browse files
authored
Merge pull request #1209 from kaigohirao/cherry-pick-planning-validator
fix(planning_validator): cherry-pick numerically safe calculation of max lateral acceleration for MRM check
2 parents c815849 + c8336ed commit 4d368b9

File tree

3 files changed

+59
-24
lines changed

3 files changed

+59
-24
lines changed

planning/planning_validator/include/planning_validator/utils.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ std::pair<double, size_t> getAbsMaxValAndIdx(const std::vector<double> & v);
3636

3737
Trajectory resampleTrajectory(const Trajectory & trajectory, const double min_interval);
3838

39-
void calcCurvature(const Trajectory & trajectory, std::vector<double> & curvatures);
39+
void calcCurvature(
40+
const Trajectory & trajectory, std::vector<double> & curvatures,
41+
const double curvature_distance = 1.0);
4042

4143
void calcSteeringAngles(
4244
const Trajectory & trajectory, const double wheelbase, std::vector<double> & steering_array);

planning/planning_validator/src/planning_validator.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ void PlanningValidator::validate(const Trajectory & trajectory)
247247

248248
s.is_valid_finite_value = checkValidFiniteValue(trajectory);
249249
s.is_valid_interval = checkValidInterval(trajectory);
250-
s.is_valid_lateral_acc = checkValidLateralAcceleration(trajectory);
251250
s.is_valid_longitudinal_max_acc = checkValidMaxLongitudinalAcceleration(trajectory);
252251
s.is_valid_longitudinal_min_acc = checkValidMinLongitudinalAcceleration(trajectory);
253252
s.is_valid_velocity_deviation = checkValidVelocityDeviation(trajectory);
@@ -260,6 +259,7 @@ void PlanningValidator::validate(const Trajectory & trajectory)
260259

261260
s.is_valid_relative_angle = checkValidRelativeAngle(resampled);
262261
s.is_valid_curvature = checkValidCurvature(resampled);
262+
s.is_valid_lateral_acc = checkValidLateralAcceleration(resampled);
263263
s.is_valid_steering = checkValidSteering(resampled);
264264
s.is_valid_steering_rate = checkValidSteeringRate(resampled);
265265

planning/planning_validator/src/utils.cpp

+55-22
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,68 @@ Trajectory resampleTrajectory(const Trajectory & trajectory, const double min_in
8989
return resampled;
9090
}
9191

92-
void calcCurvature(const Trajectory & trajectory, std::vector<double> & curvature_arr)
92+
// calculate curvature from three points with curvature_distance
93+
void calcCurvature(
94+
const Trajectory & trajectory, std::vector<double> & curvature_arr,
95+
const double curvature_distance)
9396
{
9497
if (trajectory.points.size() < 3) {
9598
curvature_arr = std::vector<double>(trajectory.points.size(), 0.0);
9699
return;
97100
}
98101

99-
curvature_arr.push_back(0.0);
102+
// calc arc length array: arc_length(3) - arc_length(0) is distance from point(3) to point(0)
103+
std::vector<double> arc_length(trajectory.points.size(), 0.0);
104+
for (size_t i = 1; i < trajectory.points.size(); ++i) {
105+
arc_length.at(i) =
106+
arc_length.at(i - 1) + calcDistance2d(trajectory.points.at(i - 1), trajectory.points.at(i));
107+
}
108+
109+
// initialize with 0 curvature
110+
curvature_arr = std::vector<double>(trajectory.points.size(), 0.0);
111+
112+
size_t first_distant_index = 0;
113+
size_t last_distant_index = trajectory.points.size() - 1;
100114
for (size_t i = 1; i < trajectory.points.size() - 1; ++i) {
101-
const auto p1 = getPoint(trajectory.points.at(i - 1));
115+
// find the previous point
116+
size_t prev_idx = 0;
117+
for (size_t j = i - 1; j > 0; --j) {
118+
if (arc_length.at(i) - arc_length.at(j) > curvature_distance) {
119+
if (first_distant_index == 0) {
120+
first_distant_index = i; // save first index that meets distance requirement
121+
}
122+
prev_idx = j;
123+
break;
124+
}
125+
}
126+
127+
// find the next point
128+
size_t next_idx = trajectory.points.size() - 1;
129+
for (size_t j = i + 1; j < trajectory.points.size(); ++j) {
130+
if (arc_length.at(j) - arc_length.at(i) > curvature_distance) {
131+
last_distant_index = i; // save last index that meets distance requirement
132+
next_idx = j;
133+
break;
134+
}
135+
}
136+
137+
const auto p1 = getPoint(trajectory.points.at(prev_idx));
102138
const auto p2 = getPoint(trajectory.points.at(i));
103-
const auto p3 = getPoint(trajectory.points.at(i + 1));
139+
const auto p3 = getPoint(trajectory.points.at(next_idx));
104140
try {
105-
curvature_arr.push_back(tier4_autoware_utils::calcCurvature(p1, p2, p3));
141+
curvature_arr.at(i) = tier4_autoware_utils::calcCurvature(p1, p2, p3);
106142
} catch (...) {
107-
// maybe distance is too close
108-
curvature_arr.push_back(0.0);
143+
curvature_arr.at(i) = 0.0; // maybe distance is too close
109144
}
110145
}
111-
curvature_arr.push_back(0.0);
146+
147+
// use previous or last curvature where the distance is not enough
148+
for (size_t i = first_distant_index; i > 0; --i) {
149+
curvature_arr.at(i - 1) = curvature_arr.at(i);
150+
}
151+
for (size_t i = last_distant_index; i < curvature_arr.size() - 1; ++i) {
152+
curvature_arr.at(i + 1) = curvature_arr.at(i);
153+
}
112154
}
113155

114156
std::pair<double, size_t> calcMaxCurvature(const Trajectory & trajectory)
@@ -117,22 +159,13 @@ std::pair<double, size_t> calcMaxCurvature(const Trajectory & trajectory)
117159
return {0.0, 0};
118160
}
119161

120-
double max_curvature = 0.0;
121-
size_t max_index = 0;
122-
for (size_t i = 1; i < trajectory.points.size() - 1; ++i) {
123-
const auto p1 = getPoint(trajectory.points.at(i - 1));
124-
const auto p2 = getPoint(trajectory.points.at(i));
125-
const auto p3 = getPoint(trajectory.points.at(i + 1));
162+
std::vector<double> curvature_arr;
163+
calcCurvature(trajectory, curvature_arr);
126164

127-
try {
128-
const auto k = tier4_autoware_utils::calcCurvature(p1, p2, p3);
129-
takeBigger(max_curvature, max_index, std::abs(k), i);
130-
} catch (...) {
131-
// maybe distance is too close
132-
}
133-
}
165+
const auto max_curvature_it = std::max_element(curvature_arr.begin(), curvature_arr.end());
166+
const size_t index = std::distance(curvature_arr.begin(), max_curvature_it);
134167

135-
return {max_curvature, max_index};
168+
return {*max_curvature_it, index};
136169
}
137170

138171
std::pair<double, size_t> calcMaxIntervalDistance(const Trajectory & trajectory)

0 commit comments

Comments
 (0)