@@ -89,26 +89,67 @@ Trajectory resampleTrajectory(const Trajectory & trajectory, const double min_in
89
89
return resampled;
90
90
}
91
91
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)
93
95
{
94
96
if (trajectory.points .size () < 3 ) {
95
97
curvature_arr = std::vector<double >(trajectory.points .size (), 0.0 );
96
98
return ;
97
99
}
98
100
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 ;
100
113
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));
102
137
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 ));
104
139
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);
106
141
} 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
109
143
}
110
144
}
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
+ }
112
153
}
113
154
114
155
std::pair<double , size_t > calcMaxCurvature (const Trajectory & trajectory)
0 commit comments