@@ -89,26 +89,68 @@ 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
+ // 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)
93
96
{
94
97
if (trajectory.points .size () < 3 ) {
95
98
curvature_arr = std::vector<double >(trajectory.points .size (), 0.0 );
96
99
return ;
97
100
}
98
101
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 ;
100
114
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));
102
138
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 ));
104
140
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);
106
142
} 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
109
144
}
110
145
}
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
+ }
112
154
}
113
155
114
156
std::pair<double , size_t > calcMaxCurvature (const Trajectory & trajectory)
@@ -117,22 +159,13 @@ std::pair<double, size_t> calcMaxCurvature(const Trajectory & trajectory)
117
159
return {0.0 , 0 };
118
160
}
119
161
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);
126
164
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);
134
167
135
- return {max_curvature, max_index };
168
+ return {*max_curvature_it, index };
136
169
}
137
170
138
171
std::pair<double , size_t > calcMaxIntervalDistance (const Trajectory & trajectory)
0 commit comments