Skip to content

Commit 2b02648

Browse files
committed
fix(planning_validator): cherry-pick numerically safe calculation of max lateral acceleration
Signed-off-by: kaigohirao <kaigo.hirao@proxima-ai-tech.com>
1 parent 747d701 commit 2b02648

File tree

3 files changed

+54
-11
lines changed

3 files changed

+54
-11
lines changed

planning/planning_validator/include/planning_validator/utils.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ 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);
40-
39+
void calcCurvature(
40+
const Trajectory & trajectory, std::vector<double> & curvatures,
41+
const double curvature_distance = 1.0);
42+
4143
void calcSteeringAngles(
4244
const Trajectory & trajectory, const double wheelbase, std::vector<double> & steering_array);
4345

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

+49-8
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,67 @@ 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+
void calcCurvature(
93+
const Trajectory & trajectory, std::vector<double> & curvature_arr,
94+
const double curvature_distance)
9395
{
9496
if (trajectory.points.size() < 3) {
9597
curvature_arr = std::vector<double>(trajectory.points.size(), 0.0);
9698
return;
9799
}
98100

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

114155
std::pair<double, size_t> calcMaxCurvature(const Trajectory & trajectory)

0 commit comments

Comments
 (0)