Apollo 11.0
自动驾驶开放平台
measurement_collection.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#include <limits>
18
20
23
24namespace apollo {
25namespace perception {
26namespace lidar {
27
29 const TrackedObjectConstPtr& old_object,
30 const double& time_diff) {
31 // Compute 2D anchor point velocity measurement
32 Eigen::Vector3d measured_anchor_point_velocity =
33 new_object->anchor_point - old_object->belief_anchor_point;
34 measured_anchor_point_velocity /= time_diff;
35 measured_anchor_point_velocity(2) = 0.0;
36 new_object->measured_barycenter_velocity = measured_anchor_point_velocity;
37}
38
40 const TrackedObjectConstPtr& old_object,
41 const double& time_diff) {
42 // Compute 2D bbox center velocity measurement
43 Eigen::Vector3f old_dir_tmp = old_object->output_direction.cast<float>();
44 // Eigen::Vector3d old_size = old_object->output_size;
45 Eigen::Vector3d old_center = old_object->output_center;
46 Eigen::Vector3f new_size_tmp;
47 Eigen::Vector3d new_center;
48 float minimum_edge_length = 0.01f;
49 base::PointDCloud& cloud =
50 (new_object->object_ptr->lidar_supplement).cloud_world;
51 algorithm::CalculateBBoxSizeCenter2DXY(cloud, old_dir_tmp, &new_size_tmp,
52 &new_center, minimum_edge_length);
53 // Eigen::Vector3d old_dir = old_dir_tmp.cast<double>();
54 // Eigen::Vector3d new_size = new_size_tmp.cast<double>();
55 Eigen::Vector3d measured_bbox_center_velocity_with_old_dir =
56 (new_center - old_center);
57 measured_bbox_center_velocity_with_old_dir /= time_diff;
58 measured_bbox_center_velocity_with_old_dir(2) = 0.0;
59 Eigen::Vector3d measured_bbox_center_velocity =
60 measured_bbox_center_velocity_with_old_dir;
61 Eigen::Vector3d project_dir =
62 new_object->anchor_point - old_object->belief_anchor_point;
63 if (measured_bbox_center_velocity.dot(project_dir) <= 0) {
64 measured_bbox_center_velocity = Eigen::Vector3d::Zero();
65 }
66 new_object->measured_center_velocity = measured_bbox_center_velocity;
67}
68
70 TrackedObjectPtr new_object) {
71 const int history_size = 10;
72 auto history_objs = track_data->GetHistoryObjects();
73 if (history_objs.empty() || history_objs.size() == 1) {
74 new_object->measured_history_center_velocity = Eigen::Vector3d::Zero();
75 return;
76 }
77 if (history_objs.size() <= history_size) {
78 auto new_obj = history_objs.rbegin();
79 auto old_obj = history_objs.cbegin();
80 double time_diff = new_obj->first - old_obj->first;
81 if (time_diff < std::numeric_limits<double>::epsilon()) {
82 return;
83 }
84 if (new_obj->second == nullptr || old_obj->second == nullptr) {
85 return;
86 }
87 new_object->measured_history_center_velocity =
88 (new_obj->second->center - old_obj->second->center) / time_diff;
89 return;
90 }
91 auto new_obj = history_objs.rbegin();
92 auto old_obj = track_data->GetHistoryObject(1 - history_size);
93 double time_diff = new_obj->first - old_obj.first;
94 if (time_diff < std::numeric_limits<double>::epsilon()) {
95 return;
96 }
97 if (new_obj->second == nullptr || old_obj.second == nullptr) {
98 return;
99 }
100 new_object->measured_history_center_velocity =
101 (new_obj->second->center - old_obj.second->center) / time_diff;
102}
103
105 const TrackedObjectConstPtr& old_object,
106 const double& time_diff) {
107 // Compute 2D bbxo corner velocity measurement
108 Eigen::Vector3f old_dir_tmp = old_object->output_direction.cast<float>();
109 Eigen::Vector3d old_size = old_object->output_size;
110 Eigen::Vector3d old_center = old_object->output_center;
111 Eigen::Vector3f new_size_tmp;
112 Eigen::Vector3d new_center;
113 float minimum_edge_length = 0.01f;
114 base::PointDCloud& cloud =
115 (new_object->object_ptr->lidar_supplement).cloud_world;
116 algorithm::CalculateBBoxSizeCenter2DXY(cloud, old_dir_tmp, &new_size_tmp,
117 &new_center, minimum_edge_length);
118 Eigen::Vector3d old_dir = old_dir_tmp.cast<double>();
119 Eigen::Vector3d new_size = new_size_tmp.cast<double>();
120 Eigen::Vector3d ortho_old_dir(-old_dir(1), old_dir(0), 0.0);
121 Eigen::Vector3d old_bbox_corner_list[4];
122 Eigen::Vector3d new_bbox_corner_list[4];
123 Eigen::Vector3d old_bbox_corner = old_center + old_dir * old_size(0) * 0.5 +
124 ortho_old_dir * old_size(1) * 0.5;
125 Eigen::Vector3d new_bbox_corner = new_center + old_dir * new_size(0) * 0.5 +
126 ortho_old_dir * new_size(1) * 0.5;
127 old_bbox_corner_list[0] = old_bbox_corner;
128 new_bbox_corner_list[0] = new_bbox_corner;
129 old_bbox_corner = old_center - old_dir * old_size(0) * 0.5 +
130 ortho_old_dir * old_size(1) * 0.5;
131 new_bbox_corner = new_center - old_dir * new_size(0) * 0.5 +
132 ortho_old_dir * new_size(1) * 0.5;
133 old_bbox_corner_list[1] = old_bbox_corner;
134 new_bbox_corner_list[1] = new_bbox_corner;
135 old_bbox_corner = old_center + old_dir * old_size(0) * 0.5 -
136 ortho_old_dir * old_size(1) * 0.5;
137 new_bbox_corner = new_center + old_dir * new_size(0) * 0.5 -
138 ortho_old_dir * new_size(1) * 0.5;
139 old_bbox_corner_list[2] = old_bbox_corner;
140 new_bbox_corner_list[2] = new_bbox_corner;
141 old_bbox_corner = old_center - old_dir * old_size(0) * 0.5 -
142 ortho_old_dir * old_size(1) * 0.5;
143 new_bbox_corner = new_center - old_dir * new_size(0) * 0.5 -
144 ortho_old_dir * new_size(1) * 0.5;
145 old_bbox_corner_list[3] = old_bbox_corner;
146 new_bbox_corner_list[3] = new_bbox_corner;
147
148 // calculate the nearest corner
149 Eigen::Vector3d ref_location = new_object->sensor_to_local_pose.translation();
150 Eigen::Vector3d nearest_old_bbox_corner = old_bbox_corner_list[0];
151 Eigen::Vector3d nearest_new_bbox_corner = new_bbox_corner_list[0];
152 double min_center_distance = (ref_location - nearest_new_bbox_corner).norm();
153 for (size_t i = 1; i < 4; ++i) {
154 double center_distance = (ref_location - new_bbox_corner_list[i]).norm();
155 if (center_distance < min_center_distance) {
156 min_center_distance = center_distance;
157 nearest_old_bbox_corner = old_bbox_corner_list[i];
158 nearest_new_bbox_corner = new_bbox_corner_list[i];
159 }
160 }
161 // no projection
162 new_object->measured_nearest_corner_velocity =
163 (nearest_new_bbox_corner - nearest_old_bbox_corner) / time_diff;
164
165 // select project_dir by change of size
166 Eigen::Vector3d direct_old_size = old_object->size;
167 Eigen::Vector3d direct_new_size = new_object->size;
168 double length_change =
169 fabs(direct_old_size(0) - direct_new_size(0)) / direct_old_size(0);
170 double width_change =
171 fabs(direct_old_size(1) - direct_new_size(1)) / direct_old_size(1);
172
173 const double max_change_thresh = 0.1;
174 Eigen::Vector3d project_dir;
175 if (length_change < max_change_thresh && width_change < max_change_thresh) {
176 project_dir = new_object->center - old_object->center;
177 } else {
178 project_dir = new_object->anchor_point - old_object->belief_anchor_point;
179 }
180
181 for (size_t i = 0; i < 4; ++i) {
182 old_bbox_corner = old_bbox_corner_list[i];
183 new_bbox_corner = new_bbox_corner_list[i];
184 new_object->corners[i] = new_bbox_corner_list[i];
185 Eigen::Vector3d bbox_corner_velocity =
186 ((new_bbox_corner - old_bbox_corner) / time_diff);
187 Eigen::Vector3d bbox_corner_velocity_on_project_dir =
188 algorithm::Calculate2DXYProjectVector<double>(bbox_corner_velocity,
189 project_dir);
190 // set velocity as 0 when conflict
191 if (bbox_corner_velocity_on_project_dir.dot(project_dir) <= 0) {
192 bbox_corner_velocity_on_project_dir = Eigen::Vector3d::Zero();
193 }
194 new_object->measured_corners_velocity[i] =
195 bbox_corner_velocity_on_project_dir;
196 }
197}
198
200 TrackedObjectPtr new_object) {
201 const int history_size = 10;
202 auto history_objs = track_data->GetHistoryObjects();
203 if (history_objs.empty() || history_objs.size() == 1) {
204 for (size_t i = 0; i < 4; ++i) {
205 new_object->measured_history_corners_velocity[i] =
206 Eigen::Vector3d::Zero();
207 }
208 return;
209 }
210 if (history_objs.size() <= history_size) {
211 auto new_obj = history_objs.rbegin();
212 auto old_obj = history_objs.cbegin();
213 double time_diff = new_obj->first - old_obj->first;
214 if (time_diff < std::numeric_limits<double>::epsilon()) {
215 return;
216 }
217 if (new_obj->second == nullptr || old_obj->second == nullptr) {
218 return;
219 }
221 new_obj->second, old_obj->second, time_diff, new_object);
222 return;
223 }
224 auto new_obj = history_objs.rbegin();
225 auto old_obj = track_data->GetHistoryObject(1 - history_size);
226 double time_diff = new_obj->first - old_obj.first;
227 if (time_diff < std::numeric_limits<double>::epsilon()) {
228 return;
229 }
230 if (new_obj->second == nullptr || old_obj.second == nullptr) {
231 return;
232 }
234 new_obj->second, old_obj.second, time_diff, new_object);
235}
236
238 const TrackedObjectConstPtr& old_object, const double& time_diff,
239 TrackedObjectPtr curr_object) {
240 // Compute 2D bbxo corner velocity measurement
241 Eigen::Vector3f old_dir_tmp = old_object->output_direction.cast<float>();
242 Eigen::Vector3d old_size = old_object->output_size;
243 Eigen::Vector3d old_center = old_object->output_center;
244 Eigen::Vector3f new_size_tmp;
245 Eigen::Vector3d new_center;
246 float minimum_edge_length = 0.01f;
247 base::PointDCloud& cloud =
248 (new_object->object_ptr->lidar_supplement).cloud_world;
250 cloud, old_dir_tmp, &new_size_tmp, &new_center, minimum_edge_length);
251 Eigen::Vector3d old_dir = old_dir_tmp.cast<double>();
252 Eigen::Vector3d new_size = new_size_tmp.cast<double>();
253 Eigen::Vector3d ortho_old_dir(-old_dir(1), old_dir(0), 0.0);
254 Eigen::Vector3d old_bbox_corner_list[4];
255 Eigen::Vector3d new_bbox_corner_list[4];
256 Eigen::Vector3d old_bbox_corner = old_center + old_dir * old_size(0) * 0.5
257 + ortho_old_dir * old_size(1) * 0.5;
258 Eigen::Vector3d new_bbox_corner = new_center + old_dir * new_size(0) * 0.5
259 + ortho_old_dir * new_size(1) * 0.5;
260 old_bbox_corner_list[0] = old_bbox_corner;
261 new_bbox_corner_list[0] = new_bbox_corner;
262 old_bbox_corner = old_center - old_dir * old_size(0) * 0.5 +
263 ortho_old_dir * old_size(1) * 0.5;
264 new_bbox_corner = new_center - old_dir * new_size(0) * 0.5 +
265 ortho_old_dir * new_size(1) * 0.5;
266 old_bbox_corner_list[1] = old_bbox_corner;
267 new_bbox_corner_list[1] = new_bbox_corner;
268 old_bbox_corner = old_center + old_dir * old_size(0) * 0.5 -
269 ortho_old_dir * old_size(1) * 0.5;
270 new_bbox_corner = new_center + old_dir * new_size(0) * 0.5 -
271 ortho_old_dir * new_size(1) * 0.5;
272 old_bbox_corner_list[2] = old_bbox_corner;
273 new_bbox_corner_list[2] = new_bbox_corner;
274 old_bbox_corner = old_center - old_dir * old_size(0) * 0.5 -
275 ortho_old_dir * old_size(1) * 0.5;
276 new_bbox_corner = new_center - old_dir * new_size(0) * 0.5 -
277 ortho_old_dir * new_size(1) * 0.5;
278 old_bbox_corner_list[3] = old_bbox_corner;
279 new_bbox_corner_list[3] = new_bbox_corner;
280
281 // select project_dir by change of size
282 Eigen::Vector3d direct_old_size = old_object->size;
283 Eigen::Vector3d direct_new_size = new_object->size;
284 double length_change =
285 fabs(direct_old_size(0) - direct_new_size(0)) / direct_old_size(0);
286 double width_change =
287 fabs(direct_old_size(1) - direct_new_size(1)) / direct_old_size(1);
288
289 const double max_change_thres = 0.1;
290 Eigen::Vector3d project_dir;
291 if (length_change < max_change_thres && width_change < max_change_thres) {
292 project_dir = new_object->center - old_object->center;
293 } else {
294 project_dir = new_object->anchor_point - old_object->belief_anchor_point;
295 }
296 for (size_t i = 0; i < 4; ++i) {
297 old_bbox_corner = old_bbox_corner_list[i];
298 new_bbox_corner = new_bbox_corner_list[i];
299 Eigen::Vector3d bbox_corner_velocity =
300 ((new_bbox_corner - old_bbox_corner) / time_diff);
301 Eigen::Vector3d bbox_corner_velocity_on_project_dir =
302 algorithm::Calculate2DXYProjectVector<double>(bbox_corner_velocity,
303 project_dir);
304 // set velocity as 0 when conflict
305 if (bbox_corner_velocity_on_project_dir.dot(project_dir) <= 0) {
306 bbox_corner_velocity_on_project_dir = Eigen::Vector3d::Zero();
307 }
308 curr_object->measured_history_corners_velocity[i] =
309 bbox_corner_velocity_on_project_dir;
310 }
311}
312
314 const TrackedObjectConstPtr& old_object, const double& time_diff) {
315 Eigen::Vector3d mea_single_model_velocity =
316 new_object->detection_center - old_object->detection_center;
317 mea_single_model_velocity /= time_diff;
318 mea_single_model_velocity(2) = 0.0;
319 new_object->measured_detection_center_velocity = mea_single_model_velocity;
320}
321
323 const MlfTrackDataConstPtr& track_data, TrackedObjectPtr new_object) {
324 const int history_size = 10;
325 auto history_objs = track_data->GetHistoryObjects();
326 if (history_objs.empty() || history_objs.size() == 1) {
327 for (size_t i = 0; i < 4; i++) {
328 new_object->measured_detection_history_corners_velocity[i] =
329 Eigen::Vector3d::Zero();
330 }
331 new_object->measured_detection_history_center_velocity =
332 Eigen::Vector3d::Zero();
333 return;
334 }
335 if (history_objs.size() <= history_size) {
336 auto new_obj = history_objs.rbegin();
337 auto old_obj = history_objs.cbegin();
338 double time_diff = new_obj->first - old_obj->first;
339 if (time_diff < std::numeric_limits<double>::epsilon()) {
340 return;
341 }
342 if (new_obj->second == nullptr || old_obj->second == nullptr) {
343 return;
344 }
345 Eigen::Vector3d center_diff = new_obj->second->detection_center
346 - old_obj->second->detection_center;
347 new_object->measured_detection_history_center_velocity =
348 center_diff / time_diff;
349 for (size_t i = 0; i < 4; i++) {
350 Eigen::Vector3d corner_diff = new_obj->second->detection_corners[i]
351 - old_obj->second->detection_corners[i];
352 new_object->measured_detection_history_corners_velocity[i] =
353 corner_diff / time_diff;
354 }
355 return;
356 }
357 auto new_obj = history_objs.rbegin();
358 auto old_obj = track_data->GetHistoryObject(1 - history_size);
359 double time_diff = new_obj->first - old_obj.first;
360 if (time_diff < std::numeric_limits<double>::epsilon()) {
361 return;
362 }
363 if (new_obj->second == nullptr || old_obj.second == nullptr) {
364 return;
365 }
366 Eigen::Vector3d center_diff =
367 new_obj->second->detection_center - old_obj.second->detection_center;
368 new_object->measured_detection_history_center_velocity =
369 center_diff / time_diff;
370 for (size_t i = 0; i < 4; i++) {
371 Eigen::Vector3d cor_diff = new_obj->second->detection_corners[i]
372 - old_obj.second->detection_corners[i];
373 new_object->measured_detection_history_corners_velocity[i] =
374 cor_diff / time_diff;
375 }
376}
377
378} // namespace lidar
379} // namespace perception
380} // namespace apollo
void CalculateBBoxSizeCenter2DXY(const PointCloudT &cloud, const Eigen::Vector3f &dir, Eigen::Vector3f *size, Eigen::Vector3d *center, float minimum_edge_length=std::numeric_limits< float >::epsilon())
Definition common.h:117
std::shared_ptr< const MlfTrackData > MlfTrackDataConstPtr
std::shared_ptr< const TrackedObject > TrackedObjectConstPtr
void ComputeBboxCornerHistoryVelocity(TrackedObjectPtr new_object, const TrackedObjectConstPtr &old_object, const double &time_diff, TrackedObjectPtr curr_object)
void MeasureBboxCornerVelocity(TrackedObjectPtr new_object, const TrackedObjectConstPtr &old_object, const double &time_diff)
Measure bbox corner velocity
void MeasureBboxCornerHistoryVelocity(const MlfTrackDataConstPtr &track_data, TrackedObjectPtr new_object)
void MeasureBboxCenterHistoryVelocity(const MlfTrackDataConstPtr &track_data, TrackedObjectPtr new_object)
void MeasureObjectDetectionHistoryVelocity(const MlfTrackDataConstPtr &track_data, TrackedObjectPtr new_object)
void MeasureObjectDetectionVelocity(TrackedObjectPtr new_object, const TrackedObjectConstPtr &old_object, const double &time_diff)
Measure object-detection center and corner velocity
void MeasureAnchorPointVelocity(TrackedObjectPtr new_object, const TrackedObjectConstPtr &old_object, const double &time_diff)
Measure anchor point velocity
std::shared_ptr< TrackedObject > TrackedObjectPtr
void MeasureBboxCenterVelocity(TrackedObjectPtr new_object, const TrackedObjectConstPtr &old_object, const double &time_diff)
Measure bbox center velocity
class register implement
Definition arena_queue.h:37