66 if (track_data->age_ == 0) {
70 if (new_object->is_background) {
71 new_object->output_velocity.setZero();
72 new_object->output_velocity_uncertainty = Eigen::Matrix3d::Identity();
78 new_object->update_quality = 1.0;
107 new_object->boostup_need_history_size =
111 new_object->update_quality = 1.0;
112 new_object->selected_measured_velocity = Eigen::Vector3d::Zero();
113 new_object->selected_measured_acceleration = Eigen::Vector3d::Zero();
114 new_object->belief_anchor_point = new_object->anchor_point;
115 new_object->belief_velocity = Eigen::Vector3d::Zero();
116 new_object->belief_acceleration = Eigen::Vector3d::Zero();
117 new_object->belief_velocity_gain = Eigen::Vector3d::Zero();
118 new_object->state = Eigen::Vector4d::Zero();
119 new_object->measurement_covariance = Eigen::Matrix4d();
120 new_object->state_covariance = Eigen::Matrix4d();
123 new_object->velocity_covariance =
125 new_object->belief_velocity_online_covariance =
126 new_object->velocity_covariance;
128 new_object->state_covariance = Eigen::Matrix4d::Identity();
139 double range = new_object->object_ptr->center.norm();
141 const Eigen::Vector4d& last_state = latest_object->state;
142 const Eigen::Matrix4d& last_state_covariance =
143 latest_object->state_covariance;
145 double time_diff = new_object->object_ptr->latest_tracked_time -
146 latest_object->object_ptr->latest_tracked_time;
150 Eigen::Matrix4d transition = Eigen::Matrix4d::Identity();
151 transition(0, 2) = transition(1, 3) = time_diff;
156 Eigen::Vector2d cur_dir = new_object->direction.head<2>();
157 Eigen::Vector2d pre_dir = latest_object->direction.head<2>();
160 double cos_theta = cur_dir.dot(pre_dir);
161 double sin_theta = pre_dir(0) * cur_dir(1) - pre_dir(1) * cur_dir(0);
163 rot << cos_theta, -sin_theta, sin_theta, cos_theta;
164 Eigen::Matrix4d rot_extend = Eigen::Matrix4d::Zero();
165 rot_extend.block<2, 2>(0, 0) = rot;
166 rot_extend.block<2, 2>(2, 2) = rot;
167 transition = rot_extend * transition;
170 auto& state = new_object->state;
171 auto& state_covariance = new_object->state_covariance;
172 auto measurement_covariance =
173 new_object->measurement_covariance.block<2, 2>(0, 0);
175 Eigen::Matrix4d predict_covariance = Eigen::Matrix4d::Identity() *
177 time_diff * time_diff;
178 state = transition * last_state;
180 transition * last_state_covariance * transition.transpose() +
184 Eigen::Vector2d measurement;
185 measurement << new_object->selected_measured_velocity.head<2>();
187 Eigen::Vector2d direction = new_object->direction.head<2>();
188 direction.normalize();
189 Eigen::Vector2d odirection(direction(1), -direction(0));
192 measurement_covariance = Eigen::Matrix2d::Identity();
195 const double kVarianceAmplifier = 9.0;
196 measurement_covariance =
199 fabs(measurement.dot(odirection)) * kVarianceAmplifier) *
200 odirection * odirection.transpose();
203 Eigen::Matrix<double, 2, 4> observation_transform;
204 observation_transform.block<2, 2>(0, 0).setIdentity();
205 observation_transform.block<2, 2>(0, 2).setZero();
206 Eigen::Matrix<double, 4, 2> kalman_gain_matrix =
207 static_cast<Eigen::Matrix<double, 4, 2, 0, 4, 2>
>(
208 state_covariance * observation_transform.transpose() *
209 (observation_transform * state_covariance *
210 observation_transform.transpose() +
211 measurement_covariance)
213 Eigen::Vector4d state_gain =
214 static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
215 kalman_gain_matrix * (measurement - observation_transform * state));
220 state = state + state_gain;
221 state_covariance = (Eigen::Matrix4d::Identity() -
222 kalman_gain_matrix * observation_transform) *
226 new_object->belief_velocity_gain << state_gain.head<2>(), 0;
235 *gain *= new_object->update_quality;
240 double velocity_breakdown_threshold = 10.0 - (track_data->age_ - 1) * 2;
241 velocity_breakdown_threshold = std::max(velocity_breakdown_threshold, 0.3);
242 double velocity_gain = gain->head<2>().norm();
243 if (velocity_gain > velocity_breakdown_threshold) {
244 gain->head<2>() *= velocity_breakdown_threshold / velocity_gain;
247 double acceleration_breakdown_threshold = 2.0;
248 double acceleration_gain = gain->tail<2>().norm();
249 if (acceleration_gain > acceleration_breakdown_threshold) {
250 gain->tail<2>() *= acceleration_breakdown_threshold / acceleration_gain;
277 object->belief_velocity_online_covariance = Eigen::Matrix3d::Zero();
278 size_t evaluate_window =
279 std::min(track_data->history_objects_.size(),
280 static_cast<size_t>(object->boostup_need_history_size));
281 if (evaluate_window == 0) {
283 object->belief_velocity_online_covariance = Eigen::Matrix3d::Identity() *
289 auto cur_obj_pair = track_data->history_objects_.rbegin();
290 for (
size_t i = 0; i < evaluate_window; ++i) {
291 Eigen::Vector3d velocity_resisual =
292 cur_obj_pair->second->selected_measured_velocity -
293 object->output_velocity;
294 if (velocity_resisual.head(2).norm() <
295 std::numeric_limits<double>::epsilon()) {
300 object->belief_velocity_online_covariance.block<2, 2>(0, 0) +=
301 velocity_resisual.head<2>() * velocity_resisual.head<2>().transpose();
303 object->belief_velocity_online_covariance /=
304 static_cast<double>(evaluate_window);
305 object->belief_velocity_online_covariance +=
307 object->output_velocity_uncertainty =
308 object->belief_velocity_online_covariance;
342 bool velocity_source_is_belief) {
344 std::vector<double> convergence_score_list;
345 int boostup_need_history_size = new_object->boostup_need_history_size;
346 auto& history_objects = track_data->history_objects_;
348 convergence_score_list.resize(boostup_need_history_size, 0.0);
352 Eigen::Vector3d velocity_residual =
353 new_object->selected_measured_velocity -
354 (velocity_source_is_belief ? new_object->belief_velocity
355 : new_object->output_velocity);
356 convergence_score_list[0] =
357 base_convergence_noise /
358 std::max(base_convergence_noise, velocity_residual.norm());
361 size_t visible_obj_idx = 1;
362 for (
auto cur_object_pair = history_objects.rbegin();
363 cur_object_pair != history_objects.rend(); ++cur_object_pair) {
365 if (visible_obj_idx >= convergence_score_list.size() ||
366 visible_obj_idx >= history_objects.size()) {
370 cur_object->selected_measured_velocity -
371 (velocity_source_is_belief ? new_object->belief_velocity
372 : new_object->output_velocity);
373 convergence_score_list[visible_obj_idx] =
374 base_convergence_noise /
375 std::max(base_convergence_noise, velocity_residual.norm());
379 if (!new_object->converged) {
380 double min_convergence_confidence_score = 1.0;
381 for (
size_t i = 0; i < static_cast<size_t>(boostup_need_history_size);
383 if (min_convergence_confidence_score > convergence_score_list[i]) {
384 min_convergence_confidence_score = convergence_score_list[i];
387 new_object->convergence_confidence =
388 static_cast<float>(min_convergence_confidence_score);
390 double mean_convergence_confidence_score = 0;
391 for (
size_t i = 0; i < static_cast<size_t>(boostup_need_history_size);
393 mean_convergence_confidence_score += convergence_score_list[i];
395 mean_convergence_confidence_score /= boostup_need_history_size;
396 new_object->convergence_confidence =
397 static_cast<float>(mean_convergence_confidence_score);
404 Eigen::Vector3d& new_obj_belief_velocity = new_object->belief_velocity;
405 Eigen::Vector3d min_boosted_velocity = new_obj_belief_velocity;
406 constexpr double kDoubleMax = std::numeric_limits<double>::max();
407 double min_boosted_velocity_norm = kDoubleMax;
408 Eigen::Vector3d max_boosted_velocity = new_obj_belief_velocity;
409 double max_boosted_velocity_norm = kDoubleMax;
410 Eigen::Vector3d project_dir = min_boosted_velocity;
411 project_dir(2) = 0.0;
412 project_dir.normalize();
414 int boostup_need_history_size = new_object->boostup_need_history_size;
415 int actual_boostup_history_size =
416 static_cast<size_t>(boostup_need_history_size) >
417 track_data->history_objects_.size()
418 ?
static_cast<int>(track_data->history_objects_.size())
419 : boostup_need_history_size;
420 int boostup_used_history_size = 0;
421 auto& history_objects = track_data->history_objects_;
422 auto cur_object_pair = history_objects.rbegin();
424 while (boostup_used_history_size < actual_boostup_history_size &&
425 cur_object_pair != history_objects.rend()) {
426 ++boostup_used_history_size;
427 Eigen::Vector3d measured_velocity = cur_object->selected_measured_velocity;
428 Eigen::Vector3d measured_velocity_on_project_dir =
429 algorithm::Calculate2DXYProjectVector<double>(measured_velocity,
430 new_obj_belief_velocity);
431 if (measured_velocity_on_project_dir.dot(new_obj_belief_velocity) <= 0) {
432 measured_velocity_on_project_dir = Eigen::Vector3d::Zero();
434 double measured_velocity_norm_on_project_dir =
435 measured_velocity_on_project_dir.norm();
436 if (measured_velocity_norm_on_project_dir < min_boosted_velocity_norm) {
437 min_boosted_velocity = measured_velocity_on_project_dir;
438 min_boosted_velocity_norm = measured_velocity_norm_on_project_dir;
440 if (measured_velocity_norm_on_project_dir > max_boosted_velocity_norm) {
441 max_boosted_velocity = measured_velocity_on_project_dir;
442 max_boosted_velocity_norm = measured_velocity_norm_on_project_dir;
444 if (boostup_used_history_size > 1) {
447 if (cur_object_pair != history_objects.rend()) {
448 cur_object = cur_object_pair->second;
454 if (min_boosted_velocity_norm > new_obj_belief_velocity.norm()) {
457 new_obj_belief_velocity = min_boosted_velocity;
458 }
else if (max_boosted_velocity_norm < new_obj_belief_velocity.norm()) {
461 new_obj_belief_velocity = max_boosted_velocity;
463 new_object->state.head<2>() = new_obj_belief_velocity.head<2>();