Apollo 11.0
自动驾驶开放平台
apollo::perception::fusion::TrackObjectDistance类 参考

#include <track_object_distance.h>

apollo::perception::fusion::TrackObjectDistance 的协作图:

Public 类型

template<class EigenType >
using EigenVector = apollo::common::EigenVector< EigenType >
 

Public 成员函数

 TrackObjectDistance ()=default
 
 ~TrackObjectDistance ()=default
 
void set_distance_thresh (const float distance_thresh)
 Set the distance thresh
 
void ResetProjectionCache (std::string sensor_id, double timestamp)
 
float Compute (const TrackPtr &fused_track, const SensorObjectPtr &sensor_object, const TrackObjectDistanceOptions &options)
 
double ComputeLidarCameraSimilarity (const SensorObjectConstPtr &lidar, const SensorObjectConstPtr &camera, const bool measurement_is_lidar)
 
double ComputeRadarCameraSimilarity (const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
 

Protected 成员函数

float ComputeLidarLidar (const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
 
float ComputeLidarRadar (const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
 
float ComputeRadarRadar (const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
 
float ComputeLidarCamera (const SensorObjectConstPtr &lidar, const SensorObjectConstPtr &camera, const bool measurement_is_lidar, const bool is_track_id_consistent)
 
float ComputeRadarCamera (const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
 
float ComputeCameraCamera (const SensorObjectPtr &fused_camera, const SensorObjectPtr &sensor_camera)
 
float ComputePolygonDistance3d (const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range)
 
float ComputeEuclideanDistance (const Eigen::Vector3d &des, const Eigen::Vector3d &src)
 
bool ComputePolygonCenter (const base::PolygonDType &polygon, Eigen::Vector3d *center)
 
bool ComputePolygonCenter (const base::PolygonDType &polygon, const Eigen::Vector3d &ref_pos, int range, Eigen::Vector3d *center)
 

详细描述

在文件 track_object_distance.h 第 41 行定义.

成员类型定义说明

◆ EigenVector

在文件 track_object_distance.h 第 44 行定义.

构造及析构函数说明

◆ TrackObjectDistance()

apollo::perception::fusion::TrackObjectDistance::TrackObjectDistance ( )
default

◆ ~TrackObjectDistance()

apollo::perception::fusion::TrackObjectDistance::~TrackObjectDistance ( )
default

成员函数说明

◆ Compute()

float apollo::perception::fusion::TrackObjectDistance::Compute ( const TrackPtr &  fused_track,
const SensorObjectPtr &  sensor_object,
const TrackObjectDistanceOptions &  options 
)

在文件 track_object_distance.cc 第 305 行定义.

307 {
308 FusedObjectPtr fused_object = fused_track->GetFusedObject();
309 if (fused_object == nullptr) {
310 AERROR << "fused object is nullptr";
311 return (std::numeric_limits<float>::max)();
312 }
313 Eigen::Vector3d* ref_point = options.ref_point;
314 if (ref_point == nullptr) {
315 AERROR << "reference point is nullptr";
316 return (std::numeric_limits<float>::max)();
317 }
318 float distance = (std::numeric_limits<float>::max)();
319 float min_distance = (std::numeric_limits<float>::max)();
320 SensorObjectConstPtr lidar_object = fused_track->GetLatestLidarObject();
321 SensorObjectConstPtr radar_object = fused_track->GetLatestRadarObject();
322 SensorObjectConstPtr camera_object = fused_track->GetLatestCameraObject();
323 if (IsLidar(sensor_object)) {
324 if (lidar_object != nullptr) {
325 distance = ComputeLidarLidar(lidar_object, sensor_object, *ref_point);
326 min_distance = std::min(distance, min_distance);
327 }
328 if (radar_object != nullptr) {
329 distance = ComputeLidarRadar(radar_object, sensor_object, *ref_point);
330 min_distance = std::min(distance, min_distance);
331 }
332 if (camera_object != nullptr) {
333 bool is_lidar_track_id_consistent =
334 IsTrackIdConsistent(lidar_object, sensor_object);
335 distance = ComputeLidarCamera(sensor_object, camera_object, true,
336 is_lidar_track_id_consistent);
337 min_distance = std::min(distance, min_distance);
338 }
339 } else if (IsRadar(sensor_object)) {
340 if (lidar_object != nullptr) {
341 distance = ComputeLidarRadar(lidar_object, sensor_object, *ref_point);
342 min_distance = std::min(distance, min_distance);
343 }
344 if (radar_object != nullptr) {
345 distance = ComputeRadarRadar(radar_object, sensor_object, *ref_point);
346 min_distance = std::min(distance, min_distance);
347 }
348 if (camera_object != nullptr) {
349 distance = ComputeRadarCamera(sensor_object, camera_object);
350 min_distance = std::min(distance, min_distance);
351 }
352 } else if (IsCamera(sensor_object)) {
353 if (lidar_object != nullptr) {
354 bool is_camera_track_id_consistent =
355 IsTrackIdConsistent(camera_object, sensor_object);
356 distance = ComputeLidarCamera(lidar_object, sensor_object, false,
357 is_camera_track_id_consistent);
358 min_distance = std::min(distance, min_distance);
359 }
360 } else {
361 AERROR << "fused sensor type is not support";
362 }
363 return min_distance;
364}
float ComputeLidarLidar(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
float ComputeRadarRadar(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
float ComputeLidarRadar(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
float ComputeLidarCamera(const SensorObjectConstPtr &lidar, const SensorObjectConstPtr &camera, const bool measurement_is_lidar, const bool is_track_id_consistent)
float ComputeRadarCamera(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
#define AERROR
Definition log.h:44
std::shared_ptr< const SensorObject > SensorObjectConstPtr
bool IsCamera(const SensorObjectConstPtr &obj)
std::shared_ptr< FusedObject > FusedObjectPtr
bool IsLidar(const SensorObjectConstPtr &obj)
bool IsRadar(const SensorObjectConstPtr &obj)

◆ ComputeCameraCamera()

float apollo::perception::fusion::TrackObjectDistance::ComputeCameraCamera ( const SensorObjectPtr &  fused_camera,
const SensorObjectPtr &  sensor_camera 
)
protected

在文件 track_object_distance.cc 第 603 行定义.

604 {
605 return (std::numeric_limits<float>::max());
606}

◆ ComputeEuclideanDistance()

float apollo::perception::fusion::TrackObjectDistance::ComputeEuclideanDistance ( const Eigen::Vector3d &  des,
const Eigen::Vector3d &  src 
)
protected

在文件 track_object_distance.cc 第 749 行定义.

750 {
751 Eigen::Vector3d diff_pos = des - src;
752 float distance = static_cast<float>(
753 std::sqrt(diff_pos.head(2).cwiseProduct(diff_pos.head(2)).sum()));
754 return distance;
755}

◆ ComputeLidarCamera()

float apollo::perception::fusion::TrackObjectDistance::ComputeLidarCamera ( const SensorObjectConstPtr &  lidar,
const SensorObjectConstPtr &  camera,
const bool  measurement_is_lidar,
const bool  is_track_id_consistent 
)
protected

在文件 track_object_distance.cc 第 441 行定义.

443 {
444 if (!is_track_id_consistent) {
445 if (LidarCameraCenterDistanceExceedDynamicThreshold(lidar, camera)) {
446 return distance_thresh_;
447 }
448 }
449 float distance = distance_thresh_;
450 // 1. get camera intrinsic and pose
451 base::BaseCameraModelPtr camera_model = QueryCameraModel(camera);
452 if (camera_model == nullptr) {
453 AERROR << "Failed to get camera model for " << camera->GetSensorId();
454 return distance;
455 }
456 Eigen::Matrix4d world2camera_pose;
457 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
458 AERROR << "Failed to query camera pose";
459 return distance;
460 }
461 Eigen::Matrix4d lidar2world_pose;
462 if (!QueryLidar2WorldPose(lidar, &lidar2world_pose)) {
463 AERROR << "Failed to query lidar pose";
464 return distance;
465 }
466 Eigen::Matrix4d lidar2camera_pose =
467 static_cast<Eigen::Matrix<double, 4, 4, 0, 4, 4>>(world2camera_pose *
468 lidar2world_pose);
469 // 2. compute distance of camera vs. lidar observation
470 const base::PointFCloud& cloud =
471 lidar->GetBaseObject()->lidar_supplement.cloud;
472 const base::BBox2DF& camera_bbox =
473 camera->GetBaseObject()->camera_supplement.box;
474 const base::Point2DF camera_bbox_ct = camera_bbox.Center();
475 const Eigen::Vector2d box2d_ct =
476 Eigen::Vector2d(camera_bbox_ct.x, camera_bbox_ct.y);
477 ADEBUG << "object cloud size : " << cloud.size();
478 if (cloud.size() > 0) {
479 // 2.1 if cloud is not empty, calculate distance according to pts box
480 // similarity
481 ProjectionCacheObject* cache_object = QueryProjectionCacheObject(
482 lidar, camera, camera_model, measurement_is_lidar);
483 if (cache_object == nullptr) {
484 AERROR << "Failed to query projection cached object";
485 return distance;
486 }
487 double similarity =
488 ComputePtsBoxSimilarity(&projection_cache_, cache_object, camera_bbox);
489 distance =
490 distance_thresh_ * ((1.0f - static_cast<float>(similarity)) /
491 (1.0f - vc_similarity2distance_penalize_thresh_));
492 } else {
493 // 2.2 if cloud is empty, calculate distance according to ct diff
494 Eigen::Vector3d projected_velo_ct;
495 QueryProjectedVeloCtOnCamera(lidar, camera, lidar2camera_pose,
496 &projected_velo_ct);
497 if (projected_velo_ct[2] > 0) {
498 Eigen::Vector2f project_pt2f = camera_model->Project(
499 Eigen::Vector3f(static_cast<float>(projected_velo_ct[0]),
500 static_cast<float>(projected_velo_ct[1]),
501 static_cast<float>(projected_velo_ct[2])));
502 Eigen::Vector2d project_pt2d = project_pt2f.cast<double>();
503 Eigen::Vector2d ct_diff = project_pt2d - box2d_ct;
504 distance =
505 static_cast<float>(ct_diff.norm()) * vc_diff2distance_scale_factor_;
506 } else {
507 distance = std::numeric_limits<float>::max();
508 }
509 }
510 ADEBUG << "ComputeLidarCamera distance: " << distance;
511 return distance;
512}
#define ADEBUG
Definition log.h:41
std::shared_ptr< BaseCameraModel > BaseCameraModelPtr
Definition camera.h:75
AttributePointCloud< PointF > PointFCloud
Point2D< float > Point2DF
Definition point.h:87
BBox2D< float > BBox2DF
Definition box.h:164
double ComputePtsBoxSimilarity(const ProjectionCachePtr &cache, const ProjectionCacheObject *object, const base::BBox2DF &camera_bbox)

◆ ComputeLidarCameraSimilarity()

double apollo::perception::fusion::TrackObjectDistance::ComputeLidarCameraSimilarity ( const SensorObjectConstPtr &  lidar,
const SensorObjectConstPtr &  camera,
const bool  measurement_is_lidar 
)

在文件 track_object_distance.cc 第 618 行定义.

620 {
621 double similarity = 0.0;
622 // 1. get camera intrinsic and pose
623 base::BaseCameraModelPtr camera_model = QueryCameraModel(camera);
624 if (camera_model == nullptr) {
625 AERROR << "Failed to get camera model for " << camera->GetSensorId();
626 return similarity;
627 }
628 Eigen::Matrix4d world2camera_pose;
629 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
630 return similarity;
631 }
632 Eigen::Matrix4d lidar2world_pose;
633 if (!QueryLidar2WorldPose(lidar, &lidar2world_pose)) {
634 return similarity;
635 }
636 // Eigen::Matrix4d lidar2camera_pose = world2camera_pose * lidar2world_pose;
637 // 2. compute similarity of camera vs. velodyne64 observation
638 const base::PointFCloud& cloud =
639 lidar->GetBaseObject()->lidar_supplement.cloud;
640 const base::BBox2DF& camera_bbox =
641 camera->GetBaseObject()->camera_supplement.box;
642 if (cloud.size() > 0) {
643 ProjectionCacheObject* cache_object = QueryProjectionCacheObject(
644 lidar, camera, camera_model, measurement_is_lidar);
645 if (cache_object == nullptr) {
646 return similarity;
647 }
648 similarity =
649 ComputePtsBoxSimilarity(&projection_cache_, cache_object, camera_bbox);
650 }
651 return similarity;
652}

◆ ComputeLidarLidar()

float apollo::perception::fusion::TrackObjectDistance::ComputeLidarLidar ( const SensorObjectConstPtr &  fused_object,
const SensorObjectPtr &  sensor_object,
const Eigen::Vector3d &  ref_pos,
int  range = 3 
)
protected

在文件 track_object_distance.cc 第 369 行定义.

372 {
373 double center_distance = (sensor_object->GetBaseObject()->center -
374 fused_object->GetBaseObject()->center)
375 .head(2)
376 .norm();
377 if (center_distance > s_lidar2lidar_association_center_dist_threshold_) {
378 ADEBUG << "center distance exceed lidar2lidar tight threshold: "
379 << "center_dist@" << center_distance << ", "
380 << "tight_threh@"
381 << s_lidar2lidar_association_center_dist_threshold_;
382 return (std::numeric_limits<float>::max)();
383 }
384 float distance =
385 ComputePolygonDistance3d(fused_object, sensor_object, ref_pos, range);
386 ADEBUG << "ComputeLidarLidar distance: " << distance;
387 return distance;
388}
float ComputePolygonDistance3d(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range)

◆ ComputeLidarRadar()

float apollo::perception::fusion::TrackObjectDistance::ComputeLidarRadar ( const SensorObjectConstPtr &  fused_object,
const SensorObjectPtr &  sensor_object,
const Eigen::Vector3d &  ref_pos,
int  range = 3 
)
protected

在文件 track_object_distance.cc 第 393 行定义.

396 {
397 double center_distance = (sensor_object->GetBaseObject()->center -
398 fused_object->GetBaseObject()->center)
399 .head(2)
400 .norm();
401 if (center_distance > s_lidar2radar_association_center_dist_threshold_) {
402 ADEBUG << "center distance exceed lidar2radar tight threshold: "
403 << "center_dist@" << center_distance << ", "
404 << "tight_threh@"
405 << s_lidar2radar_association_center_dist_threshold_;
406 return (std::numeric_limits<float>::max)();
407 }
408 float distance =
409 ComputePolygonDistance3d(fused_object, sensor_object, ref_pos, range);
410 ADEBUG << "ComputeLidarRadar distance: " << distance;
411 return distance;
412}

◆ ComputePolygonCenter() [1/2]

bool apollo::perception::fusion::TrackObjectDistance::ComputePolygonCenter ( const base::PolygonDType &  polygon,
const Eigen::Vector3d &  ref_pos,
int  range,
Eigen::Vector3d *  center 
)
protected

在文件 track_object_distance.cc 第 777 行定义.

779 {
780 base::PolygonDType polygon_part;
781 std::map<double, int> distance2idx;
782 for (size_t idx = 0; idx < polygon.size(); ++idx) {
783 const auto& point = polygon.at(idx);
784 double distance =
785 sqrt(pow(point.x - ref_pos(0), 2) + pow(point.y - ref_pos(1), 2));
786 distance2idx.insert(std::make_pair(distance, idx));
787 }
788 int size = static_cast<int>(distance2idx.size());
789 int nu = std::max(range, size / range + 1);
790 nu = std::min(nu, size);
791 int count = 0;
792 std::map<double, int>::iterator it = distance2idx.begin();
793 for (; it != distance2idx.end(), count < nu; ++it, ++count) {
794 polygon_part.push_back(polygon[it->second]);
795 }
796 bool state = ComputePolygonCenter(polygon_part, center);
797 return state;
798}
const PointT * at(size_t col, size_t row) const
Definition point_cloud.h:63
bool ComputePolygonCenter(const base::PolygonDType &polygon, Eigen::Vector3d *center)
PointCloud< PointD > PolygonDType

◆ ComputePolygonCenter() [2/2]

bool apollo::perception::fusion::TrackObjectDistance::ComputePolygonCenter ( const base::PolygonDType &  polygon,
Eigen::Vector3d *  center 
)
protected

在文件 track_object_distance.cc 第 759 行定义.

760 {
761 int size = static_cast<int>(polygon.size());
762 if (size == 0) {
763 return false;
764 }
765 *center = Eigen::Vector3d(0, 0, 0);
766 for (int i = 0; i < size; ++i) {
767 const auto& point = polygon.at(i);
768 (*center)[0] += point.x;
769 (*center)[1] += point.y;
770 }
771 (*center) /= size;
772 return true;
773}

◆ ComputePolygonDistance3d()

float apollo::perception::fusion::TrackObjectDistance::ComputePolygonDistance3d ( const SensorObjectConstPtr &  fused_object,
const SensorObjectPtr &  sensor_object,
const Eigen::Vector3d &  ref_pos,
int  range 
)
protected

在文件 track_object_distance.cc 第 723 行定义.

726 {
727 const base::ObjectConstPtr& obj_f = fused_object->GetBaseObject();
728 Eigen::Vector3d fused_poly_center(0, 0, 0);
729 if (!QueryPolygonDCenter(obj_f, ref_pos, range, &fused_poly_center)) {
730 return (std::numeric_limits<float>::max());
731 }
732 const base::ObjectConstPtr obj_s = sensor_object->GetBaseObject();
733 Eigen::Vector3d sensor_poly_center(0, 0, 0);
734 if (!QueryPolygonDCenter(obj_s, ref_pos, range, &sensor_poly_center)) {
735 return (std::numeric_limits<float>::max());
736 }
737 double fusion_timestamp = fused_object->GetTimestamp();
738 double sensor_timestamp = sensor_object->GetTimestamp();
739 double time_diff = sensor_timestamp - fusion_timestamp;
740 fused_poly_center(0) += obj_f->velocity(0) * time_diff;
741 fused_poly_center(1) += obj_f->velocity(1) * time_diff;
742 float distance =
743 ComputeEuclideanDistance(fused_poly_center, sensor_poly_center);
744 return distance;
745}
float ComputeEuclideanDistance(const Eigen::Vector3d &des, const Eigen::Vector3d &src)
std::shared_ptr< const Object > ObjectConstPtr
Definition object.h:128

◆ ComputeRadarCamera()

float apollo::perception::fusion::TrackObjectDistance::ComputeRadarCamera ( const SensorObjectConstPtr &  radar,
const SensorObjectConstPtr &  camera 
)
protected

在文件 track_object_distance.cc 第 517 行定义.

518 {
519 float distance = distance_thresh_;
520 // 1. get camera model and pose
521 base::BaseCameraModelPtr camera_model = QueryCameraModel(camera);
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 // get camera useful information
531 const base::BBox2DF& camera_bbox =
532 camera->GetBaseObject()->camera_supplement.box;
533 const base::Point2DF camera_bbox_ct = camera_bbox.Center();
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 // get radar useful information
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;
552 GetObjectEightVertices(radar->GetBaseObject(), &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 // compute similarity
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>();
565 if (IsPtInFrustum(pt3d, width, height)) {
566 // compute similarity on x direction
567 double x_similarity = ComputeRadarCameraXSimilarity(
568 pt3d.x(), box2d_ct.x(), box2d_size.x(), rc_x_similarity_params_);
569 // compute similarity on y direction
570 double y_similarity = ComputeRadarCameraYSimilarity(
571 pt3d.y(), box2d_ct.y(), box2d_size.y(), rc_y_similarity_params_);
572 // compute similarity on height
573 // use camera car height to modify the radar location
574 double h_similarity = ComputeRadarCameraHSimilarity(
575 radar, camera, box2d_size.y(), radar_box2d_vertices,
576 rc_h_similarity_params_);
577 // compute similarity on width
578 double w_similarity = ComputeRadarCameraWSimilarity(
579 radar, width, box2d_size.x(), radar_box2d_vertices,
580 rc_w_similarity_params_);
581 // compute similarity on offset 3d
582 double loc_similarity = ComputeRadarCameraLocSimilarity(
583 radar_ct, camera, world2camera_pose, rc_loc_similarity_params_);
584 // compute similarity on velocity
585 double velocity_similarity =
587 // fuse similarity
588 std::vector<double> multiple_similarities = {
589 x_similarity, y_similarity, loc_similarity,
590 velocity_similarity, h_similarity, w_similarity};
591 fused_similarity = FuseMultipleProbabilities(multiple_similarities);
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 &params)
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 &params)
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 &params)
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 &params)
calculate the loc similarity between radar and camera
bool IsPtInFrustum(const VectorType &pt, double width, double height)
Is point lies in the frustum
Definition camera_util.h:49
double ComputeRadarCameraHSimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera, const double size_y, const EigenVector< Eigen::Vector2d > &radar_box2d_vertices, const HSimilarityParams &params)
calculate the h similarity between radar and camera

◆ ComputeRadarCameraSimilarity()

double apollo::perception::fusion::TrackObjectDistance::ComputeRadarCameraSimilarity ( const SensorObjectConstPtr &  radar,
const SensorObjectConstPtr &  camera 
)

在文件 track_object_distance.cc 第 661 行定义.

662 {
663 double similarity = 0.0;
664 // 1. get camera intrinsic and pose
665 base::BaseCameraModelPtr camera_model = QueryCameraModel(camera);
666 if (camera_model == nullptr) {
667 AERROR << "Failed to get camera model for " << camera->GetSensorId();
668 return similarity;
669 }
670 Eigen::Matrix4d world2camera_pose;
671 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
672 return similarity;
673 }
674 // 2. get information of camera
675 const base::BBox2DF& camera_bbox =
676 camera->GetBaseObject()->camera_supplement.box;
677 const base::Point2DF camera_bbox_ct = camera_bbox.Center();
678 const Eigen::Vector2d box2d_ct =
679 Eigen::Vector2d(camera_bbox_ct.x, camera_bbox_ct.y);
680 Eigen::Vector2d box2d_size = Eigen::Vector2d(
681 camera_bbox.xmax - camera_bbox.xmin, camera_bbox.ymax - camera_bbox.ymin);
682 Eigen::Vector2d rc_min_box_size(rc_min_box_size_[0], rc_min_box_size_[1]);
683 box2d_size = box2d_size.cwiseMax(rc_min_box_size);
684 double width = static_cast<double>(camera_model->get_width());
685 double height = static_cast<double>(camera_model->get_height());
686 // 3. get information of radar
687 Eigen::Vector3d radar_ct = radar->GetBaseObject()->center;
688 Eigen::Vector4d local_pt = static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>>(
689 world2camera_pose *
690 Eigen::Vector4d(radar_ct[0], radar_ct[1], radar_ct[2], 1.0));
691 // 4. similarity computation
692 Eigen::Vector3d camera_ct = camera->GetBaseObject()->center;
693 Eigen::Vector3d camera_ct_c =
694 (world2camera_pose * camera_ct.homogeneous()).head(3);
695 double depth_diff = local_pt.z() - camera_ct_c.z();
696 const double depth_diff_th = 0.1;
697 depth_diff /= camera_ct_c.z();
698 if (local_pt[2] > 0 && depth_diff > -depth_diff_th) {
699 Eigen::Vector3f pt3f;
700 pt3f << camera_model->Project(Eigen::Vector3f(
701 static_cast<float>(local_pt[0]), static_cast<float>(local_pt[1]),
702 static_cast<float>(local_pt[2]))),
703 static_cast<float>(local_pt[2]);
704 Eigen::Vector3d pt3d = pt3f.cast<double>();
705 if (IsPtInFrustum(pt3d, width, height)) {
706 rc_x_similarity_params_2_.welsh_loss_scale_ =
707 rc_x_similarity_params_2_welsh_loss_scale_;
708 // compute similarity on x direction
709 double x_similarity = ComputeRadarCameraXSimilarity(
710 pt3d.x(), box2d_ct.x(), box2d_size.x(), rc_x_similarity_params_2_);
711 // compute similarity on y direction
712 double y_similarity = ComputeRadarCameraXSimilarity(
713 pt3d.y(), box2d_ct.y(), box2d_size.y(), rc_x_similarity_params_2_);
714 std::vector<double> multiple_similarities = {x_similarity, y_similarity};
715 similarity = FuseMultipleProbabilities(multiple_similarities);
716 }
717 }
718 return similarity;
719}

◆ ComputeRadarRadar()

float apollo::perception::fusion::TrackObjectDistance::ComputeRadarRadar ( const SensorObjectConstPtr &  fused_object,
const SensorObjectPtr &  sensor_object,
const Eigen::Vector3d &  ref_pos,
int  range = 3 
)
protected

在文件 track_object_distance.cc 第 417 行定义.

420 {
421 double center_distance = (sensor_object->GetBaseObject()->center -
422 fused_object->GetBaseObject()->center)
423 .head(2)
424 .norm();
425 if (center_distance > s_radar2radar_association_center_dist_threshold_) {
426 ADEBUG << "center distance exceed radar2radar tight threshold: "
427 << "center_dist@" << center_distance << ", "
428 << "tight_threh@"
429 << s_radar2radar_association_center_dist_threshold_;
430 return (std::numeric_limits<float>::max)();
431 }
432 float distance =
433 ComputePolygonDistance3d(fused_object, sensor_object, ref_pos, range);
434 ADEBUG << "ComputeRadarRadar distance: " << distance;
435 return distance;
436}

◆ ResetProjectionCache()

void apollo::perception::fusion::TrackObjectDistance::ResetProjectionCache ( std::string  sensor_id,
double  timestamp 
)
inline
参数
sensor_id
timestamp

在文件 track_object_distance.h 第 65 行定义.

65 {
66 projection_cache_.Reset(sensor_id, timestamp);
67 }
void Reset(std::string sensor_id, double timestamp)

◆ set_distance_thresh()

void apollo::perception::fusion::TrackObjectDistance::set_distance_thresh ( const float  distance_thresh)
inline

Set the distance thresh

参数
distance_thresh

在文件 track_object_distance.h 第 55 行定义.

55 {
56 distance_thresh_ = distance_thresh;
57 }

该类的文档由以下文件生成: