27constexpr double kDoubleEpsilon = std::numeric_limits<double>::epsilon();
34int KalmanMotionFusion::s_eval_window_ = 3;
35size_t KalmanMotionFusion::s_history_size_maximum_ = 20;
41 if (
track_ref_->GetLatestLidarObject() !=
nullptr) {
42 filter_init_ = InitFilter(
track_ref_->GetLatestLidarObject());
43 }
else if (
track_ref_->GetLatestRadarObject() !=
nullptr) {
44 filter_init_ = InitFilter(
track_ref_->GetLatestRadarObject());
50 const std::vector<bool> gain_break_down = {0, 0, 0, 0, 1, 1};
51 const std::vector<bool> value_break_down = {0, 0, 1, 1, 0, 0};
52 const float gain_break_down_threshold = 2.0f;
53 const float value_break_down_threshold = 0.05f;
54 Eigen::MatrixXd global_uncertainty;
55 Eigen::VectorXd global_states;
57 global_uncertainty.setIdentity(6, 6);
58 global_states.setZero(6, 1);
61 sensor_object->GetBaseObject()->anchor_point.cast<
double>();
62 fused_velocity_ = sensor_object->GetBaseObject()->velocity.cast<
double>();
63 fused_acceleration_ = Eigen::Vector3d(0, 0, 0);
65 global_states(0) = sensor_object->GetBaseObject()->anchor_point(0);
66 global_states(1) = sensor_object->GetBaseObject()->anchor_point(1);
67 global_states(2) = sensor_object->GetBaseObject()->velocity(0);
68 global_states(3) = sensor_object->GetBaseObject()->velocity(1);
69 global_states(4) = 0.0;
70 global_states(5) = 0.0;
71 global_uncertainty.topLeftCorner(2, 2) =
72 sensor_object->GetBaseObject()
73 ->center_uncertainty.topLeftCorner(2, 2)
75 global_uncertainty.block<2, 2>(2, 2) =
76 sensor_object->GetBaseObject()
77 ->velocity_uncertainty.topLeftCorner(2, 2)
79 global_uncertainty.bottomRightCorner(2, 2) =
80 sensor_object->GetBaseObject()
81 ->velocity_uncertainty.topLeftCorner(2, 2)
84 if (sensor_object->GetBaseObject()->velocity_converged) {
85 UpdateSensorHistory(sensor_object->GetSensorType(),
86 sensor_object->GetBaseObject()->velocity.cast<
double>(),
87 sensor_object->GetTimestamp());
90 if (!kalman_filter_.
Init(global_states, global_uncertainty)) {
94 gain_break_down_threshold) ||
96 value_break_down_threshold)) {
104 Eigen::Vector3d* velocity) {
105 *anchor_point = fused_anchor_point_;
106 *velocity = fused_velocity_;
110 double measurement_timestamp,
111 double target_timestamp) {
116 (lidar_ptr !=
nullptr || radar_ptr !=
nullptr || camera_ptr !=
nullptr);
117 if (filter_init_ && is_alive) {
119 measurement_timestamp -
track_ref_->GetFusedObject()->GetTimestamp();
120 MotionFusionWithoutMeasurement(time_diff);
121 fused_anchor_point_(0) = kalman_filter_.
GetStates()(0);
122 fused_anchor_point_(1) = kalman_filter_.
GetStates()(1);
123 fused_velocity_(0) = kalman_filter_.
GetStates()(2);
124 fused_velocity_(1) = kalman_filter_.
GetStates()(3);
125 fused_acceleration_(0) = kalman_filter_.
GetStates()(4);
126 fused_acceleration_(1) = kalman_filter_.
GetStates()(5);
136 fused_anchor_point_ =
137 measurement->GetBaseObject()->anchor_point.cast<
double>();
138 fused_velocity_ = measurement->GetBaseObject()->velocity.cast<
double>();
139 fused_acceleration_ =
140 measurement->GetBaseObject()->acceleration.cast<
double>();
141 center_uncertainty_ = measurement->GetBaseObject()->center_uncertainty;
142 velo_uncertainty_ = measurement->GetBaseObject()->velocity_uncertainty;
143 acc_uncertainty_ = measurement->GetBaseObject()->acceleration_uncertainty;
145 double time_diff = measurement->GetTimestamp() -
147 bool is_lidar =
IsLidar(measurement);
148 bool is_radar =
IsRadar(measurement);
149 bool is_camera =
IsCamera(measurement);
154 if (is_lidar || is_radar || is_camera) {
156 MotionFusionWithMeasurement(measurement, time_diff);
158 filter_init_ = InitFilter(measurement);
168 if (is_lidar || is_radar) {
169 if (is_lidar || (is_radar && lidar_ptr ==
nullptr)) {
174 fused_velocity_(0) = kalman_filter_.
GetStates()(2);
175 fused_velocity_(1) = kalman_filter_.
GetStates()(3);
177 if (is_radar && lidar_ptr !=
nullptr) {
180 fused_anchor_point_(0) = kalman_filter_.
GetStates()(0);
181 fused_anchor_point_(1) = kalman_filter_.
GetStates()(1);
182 fused_velocity_(0) = kalman_filter_.
GetStates()(2);
183 fused_velocity_(1) = kalman_filter_.
GetStates()(3);
185 }
else if (is_camera) {
187 if (lidar_ptr !=
nullptr) {
190 fused_anchor_point_(0) = kalman_filter_.
GetStates()(0);
191 fused_anchor_point_(1) = kalman_filter_.
GetStates()(1);
192 fused_velocity_(0) = kalman_filter_.
GetStates()(2);
193 fused_velocity_(1) = kalman_filter_.
GetStates()(3);
194 }
else if (radar_ptr !=
nullptr) {
198 fused_anchor_point_ =
199 radar_ptr->GetBaseObject()->anchor_point.cast<
double>();
200 fused_velocity_(0) = kalman_filter_.
GetStates()(2);
201 fused_velocity_(1) = kalman_filter_.
GetStates()(3);
211 fused_acceleration_(0) = kalman_filter_.
GetStates()(4);
212 fused_acceleration_(1) = kalman_filter_.
GetStates()(5);
219void KalmanMotionFusion::MotionFusionWithoutMeasurement(
220 const double time_diff) {
221 Eigen::MatrixXd transform_matrix;
222 Eigen::MatrixXd env_uncertainty;
223 transform_matrix.setIdentity(6, 6);
224 transform_matrix(0, 2) = time_diff;
225 transform_matrix(1, 3) = time_diff;
226 env_uncertainty.setZero(6, 6);
227 kalman_filter_.
Predict(transform_matrix, env_uncertainty);
230void KalmanMotionFusion::MotionFusionWithMeasurement(
246 Eigen::MatrixXd transform_matrix;
247 Eigen::MatrixXd env_uncertainty;
249 transform_matrix.setIdentity(6, 6);
250 transform_matrix(0, 2) = time_diff;
251 transform_matrix(1, 3) = time_diff;
252 transform_matrix(2, 4) = time_diff;
253 transform_matrix(3, 5) = time_diff;
255 env_uncertainty.setIdentity(6, 6);
256 env_uncertainty *= 0.5;
258 kalman_filter_.
Predict(transform_matrix, env_uncertainty);
260 Eigen::Vector3d measured_acceleration = Eigen::Vector3d::Zero();
261 measured_acceleration = ComputeAccelerationMeasurement(
262 measurement->GetSensorType(),
263 measurement->GetBaseObject()->velocity.cast<
double>(),
264 measurement->GetTimestamp());
266 Eigen::VectorXd observation;
267 observation.setZero(6, 1);
268 observation(0) = measurement->GetBaseObject()->center(0);
269 observation(1) = measurement->GetBaseObject()->center(1);
270 observation(2) = measurement->GetBaseObject()->velocity(0);
271 observation(3) = measurement->GetBaseObject()->velocity(1);
272 observation(4) = measured_acceleration(0);
273 observation(5) = measured_acceleration(1);
275 Eigen::MatrixXd r_matrix;
276 r_matrix.setIdentity(6, 6);
277 r_matrix.topLeftCorner(2, 2) = measurement->GetBaseObject()
278 ->center_uncertainty.topLeftCorner(2, 2)
280 r_matrix.block<2, 2>(2, 2) = measurement->GetBaseObject()
281 ->velocity_uncertainty.topLeftCorner(2, 2)
284 ADEBUG <<
"fusion_original_measurement@(" << std::setprecision(10)
285 << observation(0) <<
"," << observation(1) <<
"," << observation(2)
286 <<
"," << observation(3) <<
")";
287 ADEBUG <<
"fusion_original_measurement_covariance@(" << r_matrix(0, 0) <<
","
288 << r_matrix(0, 1) <<
"," << r_matrix(1, 0) <<
"," << r_matrix(1, 1)
289 <<
"," << r_matrix(2, 2) <<
"," << r_matrix(2, 3) <<
","
290 << r_matrix(3, 2) <<
"," << r_matrix(3, 3) <<
")";
293 Eigen::Vector4d temp_observation = observation.head(4);
294 Eigen::Vector4d pseudo_measurement =
295 ComputePseudoMeasurement(temp_observation, measurement->GetSensorType());
296 observation.head(4) = pseudo_measurement;
298 if (measurement->GetBaseObject()->velocity_converged) {
299 UpdateSensorHistory(measurement->GetSensorType(),
300 measurement->GetBaseObject()->velocity.cast<
double>(),
301 measurement->GetTimestamp());
305 RewardRMatrix(measurement->GetSensorType(),
306 measurement->GetBaseObject()->velocity_converged, &r_matrix);
308 ADEBUG <<
"fusion_pseudo_measurement@(" << std::setprecision(10)
309 << observation(0) <<
"," << observation(1) <<
"," << observation(2)
310 <<
"," << observation(3) <<
")";
311 ADEBUG <<
"fusion_pseudo_measurement_covariance@(" << r_matrix(0, 0) <<
","
312 << r_matrix(0, 1) <<
"," << r_matrix(1, 0) <<
"," << r_matrix(1, 1)
313 <<
"," << r_matrix(2, 2) <<
"," << r_matrix(2, 3) <<
","
314 << r_matrix(3, 2) <<
"," << r_matrix(3, 3) <<
")";
317 kalman_filter_.
Correct(observation, r_matrix);
320 ADEBUG <<
"fusion_filter_belief@(" << std::setprecision(10)
325 ADEBUG <<
"fusion_filter_belief_covariance@("
336void KalmanMotionFusion::UpdateMotionState() {
338 obj->anchor_point = fused_anchor_point_.cast<
double>();
341 obj->center = obj->anchor_point;
342 obj->velocity = fused_velocity_.cast<
float>();
343 obj->acceleration = fused_acceleration_.cast<
float>();
352 obj->center_uncertainty = center_uncertainty_;
353 obj->velocity_uncertainty = velo_uncertainty_;
354 obj->acceleration_uncertainty = acc_uncertainty_;
357Eigen::VectorXd KalmanMotionFusion::ComputeAccelerationMeasurement(
359 const double& timestamp) {
360 Eigen::Vector3d acceleration_measurement = Eigen::Vector3d::Zero();
361 if (algorithm::SensorManager::Instance()->
IsCamera(sensor_type)) {
362 acceleration_measurement(0) = kalman_filter_.
GetStates()(4);
363 acceleration_measurement(1) = kalman_filter_.
GetStates()(5);
364 return acceleration_measurement;
366 if (GetSensorHistoryLength(sensor_type) >= s_eval_window_) {
367 size_t history_index = GetSensorHistoryIndex(sensor_type, s_eval_window_);
368 if (history_index >= history_velocity_.size()) {
369 AERROR <<
"illegal history index";
370 return Eigen::Vector3d::Zero();
372 acceleration_measurement = velocity - history_velocity_[history_index];
373 acceleration_measurement /= (
timestamp - history_timestamp_[history_index]);
375 return acceleration_measurement;
379 const bool& converged,
380 Eigen::MatrixXd* r_matrix) {
381 algorithm::SensorManager* sensor_manager =
382 algorithm::SensorManager::Instance();
383 const float converged_scale = 0.01f;
384 const float unconverged_scale = 1000.0f;
385 if (sensor_manager->IsLidar(sensor_type)) {
387 r_matrix->setIdentity();
388 r_matrix->block<4, 4>(0, 0) *= converged_scale;
390 r_matrix->setIdentity();
391 r_matrix->block<2, 2>(0, 0) *= converged_scale;
392 r_matrix->block<2, 2>(2, 2) *= unconverged_scale;
394 }
else if (sensor_manager->IsRadar(sensor_type) ||
395 sensor_manager->IsCamera(sensor_type)) {
396 r_matrix->block<4, 4>(0, 0) *= 2.0;
397 int lidar_history_length =
399 if (lidar_history_length > 0) {
400 r_matrix->block<2, 2>(2, 2).setIdentity();
401 r_matrix->block<2, 2>(2, 2) *= unconverged_scale;
404 r_matrix->block<2, 2>(4, 4) *= 0.5;
407Eigen::Vector4d KalmanMotionFusion::ComputePseudoMeasurement(
415 algorithm::SensorManager* sensor_manager =
416 algorithm::SensorManager::Instance();
417 if (sensor_manager->IsLidar(sensor_type)) {
418 return ComputePseudoLidarMeasurement(measurement);
420 if (sensor_manager->IsRadar(sensor_type)) {
421 return ComputePseudoRadarMeasurement(measurement);
423 if (sensor_manager->IsCamera(sensor_type)) {
424 return ComputePseudoCameraMeasurement(measurement);
426 AINFO <<
"unsupport sensor type for pseudo measurement computation!";
427 Eigen::Vector4d pseudo_measurement = measurement;
428 return pseudo_measurement;
431Eigen::Vector4d KalmanMotionFusion::ComputePseudoLidarMeasurement(
432 const Eigen::Vector4d& measurement) {
435 const float velocity_angle_change_thresh_ =
static_cast<float>(M_PI / 20.0);
436 const float acceleration_angle_change_thresh_ =
437 static_cast<float>(M_PI / 3.0);
438 Eigen::Vector4d pseudo_measurement = measurement;
439 Eigen::Vector3d lidar_velocity =
440 Eigen::Vector3d(measurement(2), measurement(3), 0);
441 Eigen::Vector3d fused_acceleration = Eigen::Vector3d::Zero();
442 fused_acceleration(0) = kalman_filter_.
GetStates()(4);
443 fused_acceleration(1) = kalman_filter_.
GetStates()(5);
445 double lidar_velocity_norm = lidar_velocity.norm();
446 if (lidar_velocity_norm < kDoubleEpsilon) {
447 return pseudo_measurement;
451 for (
size_t count = 1; count < history_sensor_type_.size(); ++count) {
452 size_t history_index = history_sensor_type_.size() - count;
454 if (algorithm::SensorManager::Instance()->IsRadar(history_type)) {
456 Eigen::Vector3d radar_velocity = history_velocity_[history_index];
457 double radar_velocity_norm = radar_velocity.norm();
459 if (fabs(radar_velocity_norm - lidar_velocity_norm) >
460 velocity_length_change_thresh_) {
464 double velocity_angle_change =
466 if (fabs(velocity_angle_change) > velocity_angle_change_thresh_) {
470 Eigen::Vector3d radar_velocity_project_on_lidar_velocity =
472 Eigen::Vector3d radar_velocity_project_on_lidar_velocity_gain =
473 radar_velocity_project_on_lidar_velocity - lidar_velocity;
475 fused_acceleration, radar_velocity_project_on_lidar_velocity_gain);
476 if (fabs(acceleration_angle_change) > acceleration_angle_change_thresh_) {
480 double normalized_radar_velocity_project_on_lidar_velocity_gain =
481 radar_velocity_project_on_lidar_velocity_gain.head(2).norm() /
482 std::max(radar_velocity_project_on_lidar_velocity.head(2).norm(),
483 lidar_velocity.head(2).norm());
485 double normalized_velocity_angle_change =
486 fabs(velocity_angle_change) / velocity_angle_change_thresh_;
488 if (normalized_radar_velocity_project_on_lidar_velocity_gain *
489 normalized_velocity_angle_change >
493 pseudo_measurement(2) = radar_velocity_project_on_lidar_velocity(0);
494 pseudo_measurement(3) = radar_velocity_project_on_lidar_velocity(1);
495 return pseudo_measurement;
497 if (trace_count == s_eval_window_) {
498 pseudo_measurement = measurement;
499 return pseudo_measurement;
502 pseudo_measurement = measurement;
503 return pseudo_measurement;
506Eigen::Vector4d KalmanMotionFusion::ComputePseudoCameraMeasurement(
507 const Eigen::Vector4d& measurement) {
510 const float velocity_angle_change_thresh_ =
static_cast<float>(M_PI / 10.0);
511 const float acceleration_angle_change_thresh_ =
512 static_cast<float>(M_PI / 3.0);
513 Eigen::Vector4d pseudo_measurement = measurement;
514 Eigen::Vector3d camera_velocity =
515 Eigen::Vector3d(measurement(2), measurement(3), 0);
516 Eigen::Vector3d fused_acceleration = Eigen::Vector3d::Zero();
517 fused_acceleration(0) = kalman_filter_.
GetStates()(4);
518 fused_acceleration(1) = kalman_filter_.
GetStates()(5);
520 double camera_velocity_norm = camera_velocity.norm();
521 if (camera_velocity_norm < kDoubleEpsilon) {
522 return pseudo_measurement;
526 for (
size_t count = 1; count < history_sensor_type_.size(); ++count) {
527 size_t history_index = history_sensor_type_.size() - count;
529 if (algorithm::SensorManager::Instance()->IsRadar(history_type)) {
531 Eigen::Vector3d radar_velocity = history_velocity_[history_index];
532 double radar_velocity_norm = radar_velocity.norm();
534 if (fabs(radar_velocity_norm - camera_velocity_norm) >
535 velocity_length_change_thresh_) {
539 double velocity_angle_change =
541 if (fabs(velocity_angle_change) > velocity_angle_change_thresh_) {
545 Eigen::Vector3d radar_velocity_project_on_camera_velocity =
548 Eigen::Vector3d radar_velocity_project_on_camera_velocity_gain =
549 radar_velocity_project_on_camera_velocity - camera_velocity;
551 fused_acceleration, radar_velocity_project_on_camera_velocity_gain);
552 if (fabs(acceleration_angle_change) > acceleration_angle_change_thresh_) {
556 double normalized_radar_velocity_project_on_camera_velocity_gain =
557 radar_velocity_project_on_camera_velocity_gain.head(2).norm() /
558 std::max(radar_velocity_project_on_camera_velocity.head(2).norm(),
559 camera_velocity.head(2).norm());
561 double normalized_velocity_angle_change =
562 fabs(velocity_angle_change) / velocity_angle_change_thresh_;
564 if (normalized_radar_velocity_project_on_camera_velocity_gain *
565 normalized_velocity_angle_change >
569 pseudo_measurement(2) = radar_velocity_project_on_camera_velocity(0);
570 pseudo_measurement(3) = radar_velocity_project_on_camera_velocity(1);
571 return pseudo_measurement;
573 if (trace_count == s_eval_window_) {
574 pseudo_measurement = measurement;
575 return pseudo_measurement;
578 pseudo_measurement = measurement;
579 return pseudo_measurement;
582Eigen::Vector4d KalmanMotionFusion::ComputePseudoRadarMeasurement(
583 const Eigen::Vector4d& measurement) {
585 int lidar_trace_count = 0;
586 int camera_trace_count = 0;
587 Eigen::Vector4d pseudo_measurement = measurement;
588 int lidar_camera_history_length =
592 if (lidar_camera_history_length == 0) {
593 pseudo_measurement(2) = kalman_filter_.
GetStates()(2);
594 pseudo_measurement(3) = kalman_filter_.
GetStates()(3);
595 return pseudo_measurement;
597 Eigen::Vector3d radar_velocity =
598 Eigen::Vector3d(measurement(2), measurement(3), 0);
599 Eigen::Vector3d fused_acceleration = Eigen::Vector3d::Zero();
600 fused_acceleration(0) = kalman_filter_.
GetStates()(4);
601 fused_acceleration(1) = kalman_filter_.
GetStates()(5);
602 algorithm::SensorManager* sensor_manager =
603 algorithm::SensorManager::Instance();
607 for (
size_t count = 1; count < history_sensor_type_.size(); ++count) {
608 size_t history_index = history_sensor_type_.size() - count;
610 if (!sensor_manager->IsLidar(history_type) &&
611 !sensor_manager->IsCamera(history_type)) {
615 if (lidar_trace_count == s_eval_window_ ||
616 camera_trace_count == s_eval_window_) {
617 pseudo_measurement(2) = kalman_filter_.
GetStates()(2);
618 pseudo_measurement(3) = kalman_filter_.
GetStates()(3);
619 return pseudo_measurement;
621 Eigen::Vector3d history_velocity = history_velocity_[history_index];
624 pseudo_measurement(2) = history_velocity(0);
625 pseudo_measurement(3) = history_velocity(1);
626 return pseudo_measurement;
629 double velocity_angle_change =
631 Eigen::Vector3d radar_velocity_project_on_history_velocity =
633 Eigen::Vector3d radar_velocity_project_on_history_velocity_gain =
634 radar_velocity_project_on_history_velocity - history_velocity;
636 fused_acceleration, radar_velocity_project_on_history_velocity_gain);
638 double normalized_radar_velocity_project_on_history_velocity_gain =
639 radar_velocity_project_on_history_velocity_gain.head(2).norm() /
640 std::max(radar_velocity_project_on_history_velocity.head(2).norm(),
641 history_velocity.head(2).norm());
643 if (sensor_manager->IsLidar(history_type)) {
646 if (fabs(velocity_angle_change) > M_PI / 20) {
651 if (fabs(acceleration_angle_change) > M_PI / 3) {
655 double normalized_velocity_angle_change =
656 fabs(velocity_angle_change) / (M_PI / 20);
658 if (normalized_radar_velocity_project_on_history_velocity_gain *
659 normalized_velocity_angle_change >
663 pseudo_measurement(2) = radar_velocity_project_on_history_velocity(0);
664 pseudo_measurement(3) = radar_velocity_project_on_history_velocity(1);
665 return pseudo_measurement;
667 ++camera_trace_count;
669 if (fabs(velocity_angle_change) > M_PI / 10) {
674 if (fabs(acceleration_angle_change) > M_PI / 3) {
678 double normalized_velocity_angle_change =
679 fabs(velocity_angle_change) / (M_PI / 10);
681 if (normalized_radar_velocity_project_on_history_velocity_gain *
682 normalized_velocity_angle_change >
686 pseudo_measurement(2) = radar_velocity_project_on_history_velocity(0);
687 pseudo_measurement(3) = radar_velocity_project_on_history_velocity(1);
688 return pseudo_measurement;
692 pseudo_measurement = measurement;
693 return pseudo_measurement;
696void KalmanMotionFusion::UpdateSensorHistory(
698 const double& timestamp) {
699 int lidar_history_length =
701 int radar_history_length =
703 if ((lidar_history_length >= s_eval_window_ &&
704 radar_history_length >= s_eval_window_) ||
705 history_velocity_.size() > s_history_size_maximum_) {
706 history_velocity_.pop_front();
707 history_timestamp_.pop_front();
708 history_sensor_type_.pop_front();
710 history_velocity_.push_back(velocity);
711 history_timestamp_.push_back(timestamp);
712 history_sensor_type_.push_back(sensor_type);
715int KalmanMotionFusion::GetSensorHistoryLength(
717 int sensor_history_length = 0;
718 for (
size_t i = 0; i < history_sensor_type_.size(); ++i) {
719 if (history_sensor_type_[i] == sensor_type) {
720 ++sensor_history_length;
723 return sensor_history_length;
726int KalmanMotionFusion::GetSensorHistoryIndex(
728 int history_index = 0;
729 int history_count = 0;
730 for (
size_t i = 1; i <= history_sensor_type_.size(); ++i) {
731 history_index =
static_cast<int>(history_sensor_type_.size() - i);
732 if (history_sensor_type_[history_index] == sensor_type) {
735 if (history_count == trace_length) {
736 return history_index;
bool DeCorrelation(int x, int y, int x_len, int y_len)
bool Predict(const Eigen::MatrixXd &transform_matrix, const Eigen::MatrixXd &env_uncertainty_matrix)
bool SetValueBreakdownThresh(const std::vector< bool > &break_down, const float threshold=0.05f)
bool Correct(const Eigen::VectorXd &cur_observation, const Eigen::MatrixXd &cur_observation_uncertainty)
bool SetGainBreakdownThresh(const std::vector< bool > &break_down, const float threshold=2.0f)
Eigen::VectorXd GetStates() const
bool Init(const Eigen::VectorXd &initial_belief_states, const Eigen::MatrixXd &initial_uncertainty)
void CorrectionBreakdown()
Eigen::MatrixXd GetUncertainty() const
void GetStates(Eigen::Vector3d *anchor_point, Eigen::Vector3d *velocity)
Get states
bool Init() override
Init base data association config
void UpdateWithMeasurement(const SensorObjectConstPtr &measurement, double target_timestamp) override
update track motion state with measurement
void UpdateWithoutMeasurement(const std::string &sensor_id, double measurement_timestamp, double target_timestamp) override
update track motion state without measurement
const double kDoubleEpsilon
Eigen::Matrix< T, 3, 1 > Calculate2DXYProjectVector(const Eigen::Matrix< T, 3, 1 > &projected_vector, const Eigen::Matrix< T, 3, 1 > &project_vector)
T CalculateTheta2DXY(const Eigen::Matrix< T, 3, 1 > &v1, const Eigen::Matrix< T, 3, 1 > &v2)
SensorType
Sensor types are set in the order of lidar, radar, camera, ultrasonic Please make sure SensorType has...
std::shared_ptr< Object > ObjectPtr
std::shared_ptr< const SensorObject > SensorObjectConstPtr
bool IsCamera(const SensorObjectConstPtr &obj)
bool IsLidar(const SensorObjectConstPtr &obj)
bool IsRadar(const SensorObjectConstPtr &obj)