106 new_object->boostup_need_history_size =
110 new_object->update_quality = 1.0;
111 new_object->selected_measured_velocity = Eigen::Vector3d::Zero();
112 new_object->selected_measured_acceleration = Eigen::Vector3d::Zero();
113 new_object->belief_anchor_point = new_object->anchor_point;
114 new_object->belief_velocity = Eigen::Vector3d::Zero();
115 new_object->belief_acceleration = Eigen::Vector3d::Zero();
116 new_object->belief_velocity_gain = Eigen::Vector3d::Zero();
117 new_object->state = Eigen::Vector4d::Zero();
118 new_object->measurement_covariance = Eigen::Matrix4d();
119 new_object->state_covariance = Eigen::Matrix4d();
122 new_object->velocity_covariance =
124 new_object->belief_velocity_online_covariance =
125 new_object->velocity_covariance;
127 new_object->state_covariance = Eigen::Matrix4d::Identity();
138 double range = new_object->object_ptr->center.norm();
140 const Eigen::Vector4d& last_state = latest_object->state;
141 const Eigen::Matrix4d& last_state_covariance =
142 latest_object->state_covariance;
144 double time_diff = new_object->object_ptr->latest_tracked_time -
145 latest_object->object_ptr->latest_tracked_time;
149 Eigen::Matrix4d transition = Eigen::Matrix4d::Identity();
150 transition(0, 2) = transition(1, 3) = time_diff;
155 Eigen::Vector2d cur_dir = new_object->direction.head<2>();
156 Eigen::Vector2d pre_dir = latest_object->direction.head<2>();
159 double cos_theta = cur_dir.dot(pre_dir);
160 double sin_theta = pre_dir(0) * cur_dir(1) - pre_dir(1) * cur_dir(0);
162 rot << cos_theta, -sin_theta, sin_theta, cos_theta;
163 Eigen::Matrix4d rot_extend = Eigen::Matrix4d::Zero();
164 rot_extend.block<2, 2>(0, 0) = rot;
165 rot_extend.block<2, 2>(2, 2) = rot;
166 transition = rot_extend * transition;
169 auto& state = new_object->state;
170 auto& state_covariance = new_object->state_covariance;
171 auto measurement_covariance =
172 new_object->measurement_covariance.block<2, 2>(0, 0);
174 Eigen::Matrix4d predict_covariance = Eigen::Matrix4d::Identity() *
176 time_diff * time_diff;
177 state = transition * last_state;
179 transition * last_state_covariance * transition.transpose() +
183 Eigen::Vector2d measurement;
184 measurement << new_object->selected_measured_velocity.head<2>();
186 Eigen::Vector2d direction = new_object->direction.head<2>();
187 direction.normalize();
188 Eigen::Vector2d odirection(direction(1), -direction(0));
191 measurement_covariance = Eigen::Matrix2d::Identity();
194 const double kVarianceAmplifier = 9.0;
195 measurement_covariance =
198 fabs(measurement.dot(odirection)) * kVarianceAmplifier) *
199 odirection * odirection.transpose();
202 float scale = pow(1 + new_object->association_score, 2) * 1.1;
203 measurement_covariance *= scale;
205 Eigen::Matrix<double, 2, 4> observation_transform;
206 observation_transform.block<2, 2>(0, 0).setIdentity();
207 observation_transform.block<2, 2>(0, 2).setZero();
208 Eigen::Matrix<double, 4, 2> kalman_gain_matrix =
209 static_cast<Eigen::Matrix<double, 4, 2, 0, 4, 2>
>(
210 state_covariance * observation_transform.transpose() *
211 (observation_transform * state_covariance *
212 observation_transform.transpose() +
213 measurement_covariance)
215 Eigen::Vector4d state_gain =
216 static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
217 kalman_gain_matrix * (measurement - observation_transform * state));
222 state = state + state_gain;
223 state_covariance = (Eigen::Matrix4d::Identity() -
224 kalman_gain_matrix * observation_transform) *
228 new_object->belief_velocity_gain << state_gain.head<2>(), 0;
237 *gain *= new_object->update_quality;
242 double velocity_breakdown_threshold = 10.0 - (track_data->age_ - 1) * 2;
243 velocity_breakdown_threshold = std::max(velocity_breakdown_threshold, 0.3);
244 double velocity_gain = gain->head<2>().norm();
245 if (velocity_gain > velocity_breakdown_threshold) {
246 gain->head<2>() *= velocity_breakdown_threshold / velocity_gain;
249 double acceleration_breakdown_threshold = 2.0;
250 double acceleration_gain = gain->tail<2>().norm();
251 if (acceleration_gain > acceleration_breakdown_threshold) {
252 gain->tail<2>() *= acceleration_breakdown_threshold / acceleration_gain;
279 object->belief_velocity_online_covariance = Eigen::Matrix3d::Zero();
280 size_t evaluate_window =
281 std::min(track_data->history_objects_.size(),
282 static_cast<size_t>(object->boostup_need_history_size));
283 if (evaluate_window == 0) {
285 object->belief_velocity_online_covariance = Eigen::Matrix3d::Identity() *
291 auto cur_obj_pair = track_data->history_objects_.rbegin();
292 for (
size_t i = 0; i < evaluate_window; ++i) {
293 Eigen::Vector3d velocity_resisual =
294 cur_obj_pair->second->selected_measured_velocity -
295 object->output_velocity;
296 if (velocity_resisual.head(2).norm() <
297 std::numeric_limits<double>::epsilon()) {
302 object->belief_velocity_online_covariance.block<2, 2>(0, 0) +=
303 velocity_resisual.head<2>() * velocity_resisual.head<2>().transpose();
305 object->belief_velocity_online_covariance /=
306 static_cast<double>(evaluate_window);
307 object->belief_velocity_online_covariance +=
309 object->output_velocity_uncertainty =
310 object->belief_velocity_online_covariance;
344 bool velocity_source_is_belief) {
346 std::vector<double> convergence_score_list;
347 int boostup_need_history_size = new_object->boostup_need_history_size;
348 auto& history_objects = track_data->history_objects_;
350 convergence_score_list.resize(boostup_need_history_size, 0.0);
354 Eigen::Vector3d velocity_residual =
355 new_object->selected_measured_velocity -
356 (velocity_source_is_belief ? new_object->belief_velocity
357 : new_object->output_velocity);
358 convergence_score_list[0] =
359 base_convergence_noise /
360 std::max(base_convergence_noise, velocity_residual.norm());
363 size_t visible_obj_idx = 1;
364 for (
auto cur_object_pair = history_objects.rbegin();
365 cur_object_pair != history_objects.rend(); ++cur_object_pair) {
367 if (visible_obj_idx >= convergence_score_list.size() ||
368 visible_obj_idx >= history_objects.size()) {
372 cur_object->selected_measured_velocity -
373 (velocity_source_is_belief ? new_object->belief_velocity
374 : new_object->output_velocity);
375 convergence_score_list[visible_obj_idx] =
376 base_convergence_noise /
377 std::max(base_convergence_noise, velocity_residual.norm());
381 if (!new_object->converged) {
382 double min_convergence_confidence_score = 1.0;
383 for (
size_t i = 0; i < static_cast<size_t>(boostup_need_history_size);
385 if (min_convergence_confidence_score > convergence_score_list[i]) {
386 min_convergence_confidence_score = convergence_score_list[i];
389 new_object->convergence_confidence =
390 static_cast<float>(min_convergence_confidence_score);
392 double mean_convergence_confidence_score = 0;
393 for (
size_t i = 0; i < static_cast<size_t>(boostup_need_history_size);
395 mean_convergence_confidence_score += convergence_score_list[i];
397 mean_convergence_confidence_score /= boostup_need_history_size;
398 new_object->convergence_confidence =
399 static_cast<float>(mean_convergence_confidence_score);
406 Eigen::Vector3d& new_obj_belief_velocity = new_object->belief_velocity;
407 Eigen::Vector3d min_boosted_velocity = new_obj_belief_velocity;
408 constexpr double kDoubleMax = std::numeric_limits<double>::max();
409 double min_boosted_velocity_norm = kDoubleMax;
410 Eigen::Vector3d max_boosted_velocity = new_obj_belief_velocity;
411 double max_boosted_velocity_norm = kDoubleMax;
412 Eigen::Vector3d project_dir = min_boosted_velocity;
413 project_dir(2) = 0.0;
414 project_dir.normalize();
416 int boostup_need_history_size = new_object->boostup_need_history_size;
417 int actual_boostup_history_size =
418 static_cast<size_t>(boostup_need_history_size) >
419 track_data->history_objects_.size()
420 ?
static_cast<int>(track_data->history_objects_.size())
421 : boostup_need_history_size;
422 int boostup_used_history_size = 0;
423 auto& history_objects = track_data->history_objects_;
424 auto cur_object_pair = history_objects.rbegin();
426 while (boostup_used_history_size < actual_boostup_history_size &&
427 cur_object_pair != history_objects.rend()) {
428 ++boostup_used_history_size;
429 Eigen::Vector3d measured_velocity = cur_object->selected_measured_velocity;
430 Eigen::Vector3d measured_velocity_on_project_dir =
431 algorithm::Calculate2DXYProjectVector<double>(measured_velocity,
432 new_obj_belief_velocity);
433 if (measured_velocity_on_project_dir.dot(new_obj_belief_velocity) <= 0) {
434 measured_velocity_on_project_dir = Eigen::Vector3d::Zero();
436 double measured_velocity_norm_on_project_dir =
437 measured_velocity_on_project_dir.norm();
438 if (measured_velocity_norm_on_project_dir < min_boosted_velocity_norm) {
439 min_boosted_velocity = measured_velocity_on_project_dir;
440 min_boosted_velocity_norm = measured_velocity_norm_on_project_dir;
442 if (measured_velocity_norm_on_project_dir > max_boosted_velocity_norm) {
443 max_boosted_velocity = measured_velocity_on_project_dir;
444 max_boosted_velocity_norm = measured_velocity_norm_on_project_dir;
446 if (boostup_used_history_size > 1) {
449 if (cur_object_pair != history_objects.rend()) {
450 cur_object = cur_object_pair->second;
456 if (min_boosted_velocity_norm > new_obj_belief_velocity.norm()) {
459 new_obj_belief_velocity = min_boosted_velocity;
460 }
else if (max_boosted_velocity_norm < new_obj_belief_velocity.norm()) {
463 new_obj_belief_velocity = max_boosted_velocity;
465 new_object->state.head<2>() = new_obj_belief_velocity.head<2>();