518 {
519 float distance = distance_thresh_;
520
522 if (camera_model == nullptr) {
523 AERROR <<
"Failed to get camera model for " << camera->GetSensorId();
524 return distance;
525 }
526 Eigen::Matrix4d world2camera_pose;
527 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
528 return distance;
529 }
530
532 camera->GetBaseObject()->camera_supplement.box;
534 const Eigen::Vector2d box2d_ct =
535 Eigen::Vector2d(camera_bbox_ct.x, camera_bbox_ct.y);
536 Eigen::Vector2d box2d_size = Eigen::Vector2d(
537 camera_bbox.xmax - camera_bbox.xmin, camera_bbox.ymax - camera_bbox.ymin);
538 Eigen::Vector2d rc_min_box_size(rc_min_box_size_[0], rc_min_box_size_[1]);
539 box2d_size = box2d_size.cwiseMax(rc_min_box_size);
540 double width =
static_cast<double>(camera_model->get_width());
541 double height =
static_cast<double>(camera_model->get_height());
542
543 double time_diff = camera->GetTimestamp() - radar->GetTimestamp();
544 Eigen::Vector3d offset =
545 radar->GetBaseObject()->velocity.cast<double>() * time_diff;
546 offset.setZero();
547 Eigen::Vector3d radar_ct = radar->GetBaseObject()->center + offset;
548 Eigen::Vector4d local_pt = static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>>(
549 world2camera_pose *
550 Eigen::Vector4d(radar_ct[0], radar_ct[1], radar_ct[2], 1.0));
551 EigenVector<Eigen::Vector3d> radar_box_vertices;
553 EigenVector<Eigen::Vector2d> radar_box2d_vertices;
554 GetModified2DRadarBoxVertices(radar_box_vertices, camera, camera_model,
555 world2camera_pose, &radar_box2d_vertices);
556
557 double fused_similarity = 0.0;
558 if (local_pt[2] > 0) {
559 Eigen::Vector3f pt3f;
560 pt3f << camera_model->Project(Eigen::Vector3f(
561 static_cast<float>(local_pt[0]), static_cast<float>(local_pt[1]),
562 static_cast<float>(local_pt[2]))),
563 static_cast<float>(local_pt[2]);
564 Eigen::Vector3d pt3d = pt3f.cast<double>();
566
568 pt3d.x(), box2d_ct.x(), box2d_size.x(), rc_x_similarity_params_);
569
571 pt3d.y(), box2d_ct.y(), box2d_size.y(), rc_y_similarity_params_);
572
573
575 radar, camera, box2d_size.y(), radar_box2d_vertices,
576 rc_h_similarity_params_);
577
579 radar, width, box2d_size.x(), radar_box2d_vertices,
580 rc_w_similarity_params_);
581
583 radar_ct, camera, world2camera_pose, rc_loc_similarity_params_);
584
585 double velocity_similarity =
587
588 std::vector<double> multiple_similarities = {
589 x_similarity, y_similarity, loc_similarity,
590 velocity_similarity, h_similarity, w_similarity};
592 }
593 }
594 distance = distance_thresh_ * static_cast<float>(1.0 - fused_similarity) /
595 (1.0f - rc_similarity2distance_penalize_thresh_);
596 ADEBUG <<
"ComputeRadarCamera distance: " << distance;
597 return distance;
598}
uint32_t height
Height of point cloud
uint32_t width
Width of point cloud
double FuseMultipleProbabilities(const std::vector< double > &probs)
double ComputeRadarCameraWSimilarity(const SensorObjectConstPtr &radar, const double width, const double size_x, const EigenVector< Eigen::Vector2d > &radar_box2d_vertices, const WSimilarityParams ¶ms)
calculate the w similarity between radar and camera
double ComputeRadarCameraYSimilarity(const double velo_ct_y, const double camera_ct_y, const double size_y, const YSimilarityParams ¶ms)
calculate the y similarity between radar and camera
double ComputeRadarCameraXSimilarity(const double velo_ct_x, const double camera_ct_x, const double size_x, const XSimilarityParams ¶ms)
void GetObjectEightVertices(std::shared_ptr< const base::Object > obj, EigenVector< Eigen::Vector3d > *vertices)
double ComputeRadarCameraVelocitySimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
calculate the velocity similarity between radar and camera
double ComputeRadarCameraLocSimilarity(const Eigen::Vector3d &radar_ct, const SensorObjectConstPtr &camera, const Eigen::Matrix4d &world2camera_pose, const LocSimilarityParams ¶ms)
calculate the loc similarity between radar and camera
bool IsPtInFrustum(const VectorType &pt, double width, double height)
Is point lies in the frustum
double ComputeRadarCameraHSimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera, const double size_y, const EigenVector< Eigen::Vector2d > &radar_box2d_vertices, const HSimilarityParams ¶ms)
calculate the h similarity between radar and camera