36 std::string sensor_name = new_object->sensor_info.name;
38 track_data->GetLatestSensorObject(sensor_name).second;
39 if (latest_object ==
nullptr) {
40 latest_object = track_data->GetLatestObject().second;
42 if (latest_object.get() ==
nullptr) {
43 AERROR <<
"latest_object is not available";
47 double latest_time = latest_object->object_ptr->latest_tracked_time;
48 double current_time = new_object->object_ptr->latest_tracked_time;
49 double time_diff = current_time - latest_time;
50 if (fabs(time_diff) < EPSILON_TIME) {
51 time_diff = DEFAULT_FPS;
74 int64_t corner_index = 0;
75 float corner_velocity_gain = 0.0f;
76 std::vector<float> corner_velocity_gain_norms(4);
77 for (
int i = 0; i < 4; ++i) {
78 corner_velocity_gain_norms[i] =
79 static_cast<float>((new_object->measured_corners_velocity[i] -
80 latest_object->belief_velocity)
83 std::vector<float>::iterator corener_min_gain =
84 std::min_element(std::begin(corner_velocity_gain_norms),
85 std::end(corner_velocity_gain_norms));
86 corner_velocity_gain = *corener_min_gain;
87 corner_index = corener_min_gain - corner_velocity_gain_norms.begin();
89 std::vector<float> velocity_gain_norms(4);
90 velocity_gain_norms[0] = corner_velocity_gain;
91 velocity_gain_norms[1] =
92 static_cast<float>((new_object->measured_barycenter_velocity -
93 latest_object->belief_velocity)
95 velocity_gain_norms[2] =
static_cast<float>(
96 (new_object->measured_center_velocity - latest_object->belief_velocity)
98 velocity_gain_norms[3] =
static_cast<float>(
99 (new_object->measured_history_center_velocity -
100 latest_object->belief_velocity).norm());
101 std::vector<float>::iterator min_gain = std::min_element(
102 std::begin(velocity_gain_norms), std::end(velocity_gain_norms));
103 int64_t min_gain_pos = min_gain - velocity_gain_norms.begin();
104 if (min_gain_pos == 0) {
105 new_object->selected_measured_velocity =
106 new_object->measured_corners_velocity[corner_index];
108 if (min_gain_pos == 1) {
109 new_object->selected_measured_velocity =
110 new_object->measured_barycenter_velocity;
112 if (min_gain_pos == 2) {
113 new_object->selected_measured_velocity =
114 new_object->measured_center_velocity;
116 if (min_gain_pos == 3) {
117 new_object->selected_measured_velocity =
118 new_object->measured_history_center_velocity;
122 std::vector<float> condition_velocity_norm(10);
123 for (
int i = 0; i < 4; ++i) {
124 condition_velocity_norm[i] =
static_cast<float>(
125 (new_object->measured_detection_history_corners_velocity[i] -
126 latest_object->belief_velocity).norm());
129 condition_velocity_norm[4] =
static_cast<float>(
130 (new_object->measured_detection_history_center_velocity -
131 latest_object->belief_velocity).norm());
132 condition_velocity_norm[5] =
static_cast<float>(
133 (new_object->measured_detection_center_velocity -
134 latest_object->belief_velocity).norm());
136 for (
int i = 0; i < 4; ++i) {
137 condition_velocity_norm[i + 6] =
static_cast<float>(
138 (new_object->measured_history_corners_velocity[i] -
139 latest_object->belief_velocity).norm());
141 std::vector<float>::iterator condition_min_diff =
142 std::min_element(std::begin(condition_velocity_norm),
143 std::end(condition_velocity_norm));
144 int min_pos = condition_min_diff - condition_velocity_norm.begin();
145 if (*condition_min_diff < *min_gain) {
146 if (min_pos <= 3 && min_pos >= 0) {
147 new_object->selected_measured_velocity =
148 new_object->measured_detection_history_corners_velocity[min_pos];
151 new_object->selected_measured_velocity =
152 new_object->measured_detection_history_center_velocity;
155 new_object->selected_measured_velocity =
156 new_object->measured_detection_center_velocity;
158 if (min_pos <= 9 && min_pos >= 6) {
159 new_object->selected_measured_velocity =
160 new_object->measured_history_corners_velocity[min_pos - 6];
164 ADEBUG <<
"[Measurement] track_id: " << track_data->track_id_
165 <<
" belief_velocity: " << latest_object->belief_velocity(0)
166 <<
", " << latest_object->belief_velocity(1)
167 <<
" corner_velocity[0]: " << new_object->measured_corners_velocity[0](0)
168 <<
", " << new_object->measured_corners_velocity[0](1)
169 <<
" corner_velocity[1]: " << new_object->measured_corners_velocity[1](0)
170 <<
", " << new_object->measured_corners_velocity[1](1)
171 <<
" corner_velocity[2]: " << new_object->measured_corners_velocity[2](0)
172 <<
", " << new_object->measured_corners_velocity[2](1)
173 <<
" corner_velocity[3]: " << new_object->measured_corners_velocity[3](0)
174 <<
", " << new_object->measured_corners_velocity[3](1)
175 <<
" barycenter_velocity: " << new_object->measured_barycenter_velocity(0)
176 <<
", " << new_object->measured_barycenter_velocity(1)
177 <<
" center_velocity: " << new_object->measured_center_velocity(0)
178 <<
", " << new_object->measured_center_velocity(1)
179 <<
" history_velocity: "<< new_object->measured_history_center_velocity(0)
180 <<
", " << new_object->measured_history_center_velocity(1)
181 <<
" detection_history_corner_velocity[0]: "
182 << new_object->measured_detection_history_corners_velocity[0](0) <<
", "
183 << new_object->measured_detection_history_corners_velocity[0](1)
184 <<
" detection_history_corner_velocity[1]: "
185 << new_object->measured_detection_history_corners_velocity[1](0) <<
", "
186 << new_object->measured_detection_history_corners_velocity[1](1)
187 <<
" detection_history_corner_velocity[2]: "
188 << new_object->measured_detection_history_corners_velocity[2](0) <<
", "
189 << new_object->measured_detection_history_corners_velocity[2](1)
190 <<
" detection_history_corner_velocity[3]: "
191 << new_object->measured_detection_history_corners_velocity[3](0) <<
", "
192 << new_object->measured_detection_history_corners_velocity[3](1)
193 <<
" detection_center_velocity: "
194 << new_object->measured_detection_center_velocity(0) <<
", "
195 << new_object->measured_detection_center_velocity(1)
196 <<
" detection_history_center_velocity: "
197 << new_object->measured_detection_history_center_velocity(0) <<
", "
198 << new_object->measured_detection_history_center_velocity(1)
199 <<
" history_corner_velocity[0]: "
200 << new_object->measured_history_corners_velocity[0](0) <<
", "
201 << new_object->measured_history_corners_velocity[0](1)
202 <<
" history_corner_velocity[1]: "
203 << new_object->measured_history_corners_velocity[1](0) <<
", "
204 << new_object->measured_history_corners_velocity[1](1)
205 <<
" history_corner_velocity[2]: "
206 << new_object->measured_history_corners_velocity[2](0) <<
", "
207 << new_object->measured_history_corners_velocity[2](1)
208 <<
" history_corner_velocity[3]: "
209 << new_object->measured_history_corners_velocity[3](0) <<
", "
210 << new_object->measured_history_corners_velocity[3](1)
211 <<
" selected: " << new_object->selected_measured_velocity(0) <<
", "
212 << new_object->selected_measured_velocity(1);
237 const double& time_diff) {
238 const Eigen::Vector3d cur_vel = new_object->selected_measured_velocity;
239 const int get_history_size = 4;
241 std::vector<TrackedObjectConstPtr> history_objects;
242 track_data->GetLatestKObjects(get_history_size, &history_objects);
243 if (!history_objects.size()) {
244 AWARN <<
"No history objects find. Unreasonable";
248 float velocity_threshold = 2.0;
252 float small_velocity_threshold = 2.0;
253 small_velocity_threshold =
255 if (cur_vel.head<2>().norm() > velocity_threshold) {
256 ++new_object->measured_big_velocity_age;
258 if (cur_vel.head<2>().norm() < small_velocity_threshold) {
259 new_object->measured_big_velocity_age = 0;
263 if (history_objects.size() < get_history_size) {
265 && cur_vel.head<2>().norm() > velocity_threshold) {
268 new_object->selected_measured_velocity =
269 latest_object->output_velocity;
270 AINFO <<
"[Velocity-Measurement] track_id: "
271 << track_data->track_id_
272 <<
" history small and current BIG. Keep Lastest Output";
281 bool keep_small_velocity =
true;
282 for (
auto& obj : history_objects) {
283 if (obj->output_velocity.head<2>().norm() > 0.1) {
284 keep_small_velocity =
false;
287 if (new_object->measured_big_velocity_age >= get_history_size) {
288 AINFO <<
"[Velocity-Measurement] Continuous big velocity. track_id: "
289 << track_data->track_id_;
292 if (keep_small_velocity && cur_vel.head<2>().norm() > velocity_threshold) {
295 new_object->selected_measured_velocity =
296 latest_object->output_velocity;
297 AINFO <<
"[Velocity-Measurement] track_id: " << track_data->track_id_
298 <<
" history static and current BIG. Keep Lastest Output";
303 size_t ori_size = history_objects.size();
304 size_t new_size = ori_size + 1;
305 Eigen::Vector3d old_ave = Eigen::Vector3d::Zero();
306 Eigen::Vector3d old_var = Eigen::Vector3d::Zero();
307 Eigen::Vector3d new_ave = Eigen::Vector3d::Zero();
308 Eigen::Vector3d new_var = Eigen::Vector3d::Zero();
310 for (
auto& obj : history_objects) {
311 old_ave += obj->output_velocity;
314 for (
auto& obj : history_objects) {
315 old_var(0) += ((obj->output_velocity(0) - old_ave(0)) *
316 (obj->output_velocity(0) - old_ave(0)));
317 old_var(1) += ((obj->output_velocity(1) - old_ave(1)) *
318 (obj->output_velocity(1) - old_ave(1)));
323 new_ave = old_ave + (cur_vel - old_ave) * 1.0 / ori_size;
324 new_var(0) = (cur_vel(0) - old_ave(0)) * (cur_vel(0) - old_ave(0)) * 1.0 *
325 ori_size / (new_size * new_size)
326 + old_var(0) * 1.0 * ori_size / new_size;
327 new_var(1) = (cur_vel(1) - old_ave(1)) * (cur_vel(1) - old_ave(1)) * 1.0 *
328 ori_size / (new_size * new_size)
329 + old_var(1) * 1.0 * ori_size / new_size;
331 float ave_change = fabs(new_ave.head<2>().norm() -
332 old_ave.head<2>().norm());
333 float var_change = fabs(new_var.head<2>().norm() -
334 old_var.head<2>().norm());
335 if (ave_change > 2.0 && var_change > 2.0) {
338 new_object->selected_measured_velocity =
339 latest_object->output_velocity;
340 AINFO <<
"[Velocity-Measurement] track_id: " << track_data->track_id_
341 <<
" old_ave: " << old_ave(0) <<
", " << old_ave(1)
342 <<
" old_var: " << old_var(0) <<
", " << old_var(1)
343 <<
" new_ave: " << new_ave(0) <<
", " << new_ave(1)
344 <<
" new_var: " << new_var(0) <<
", " << new_var(1)
345 <<
" Change Bigger. Keep Lastest Output";
350 double cur_time = new_object->object_ptr->latest_tracked_time;
351 Eigen::Vector2d expected_velocity =
353 bool ratio_flag = cur_vel.head<2>().norm() / expected_velocity.norm() > 20;
357 new_object->selected_measured_velocity =
358 latest_object->output_velocity;
359 AINFO <<
"[Velocity-Measurement] track_id: " << track_data->track_id_
360 <<
" Expected velocity CHANGE big. Keep Lastest Output";
380 std::vector<TrackedObjectConstPtr> history_objects,
382 if (history_objects.size() == 1) {
383 return Eigen::Vector2d(0, 0);
386 double velocity_sum_x = 0.0, velocity_sum_y = 0.0;
387 for (
size_t i = 0; i < history_objects.size(); i++) {
388 auto after_obj = history_objects[i];
389 for (
size_t j = i + 1; j < history_objects.size(); j++) {
391 if (i == j || j >= history_objects.size()) {
394 auto pre_obj = history_objects[j];
400 double time_ratio = after_obj->object_ptr->latest_tracked_time -
401 pre_obj->object_ptr->latest_tracked_time;
402 double ratio_x = (after_obj->output_velocity(0) -
403 pre_obj->output_velocity(0)) / (time_ratio);
404 double ratio_y = (after_obj->output_velocity(1) -
405 pre_obj->output_velocity(1)) / (time_ratio);
407 double expected_time_diff = cur_time -
408 after_obj->object_ptr->latest_tracked_time;
409 velocity_sum_x += ratio_x * expected_time_diff +
410 after_obj->output_velocity(0);
411 velocity_sum_y += ratio_y * expected_time_diff +
412 after_obj->output_velocity(1);
416 return Eigen::Vector2d(0, 0);
418 velocity_sum_x /= valid;
419 velocity_sum_y /= valid;
420 return Eigen::Vector2d(velocity_sum_x, velocity_sum_y);