24#include <boost/format.hpp>
37double TrackObjectDistance::s_lidar2lidar_association_center_dist_threshold_ =
39double TrackObjectDistance::s_lidar2radar_association_center_dist_threshold_ =
41double TrackObjectDistance::s_radar2radar_association_center_dist_threshold_ =
44 TrackObjectDistance::s_lidar2camera_projection_downsample_target_pts_num_ =
46size_t TrackObjectDistance::s_lidar2camera_projection_vertices_check_pts_num_ =
49void TrackObjectDistance::GetModified2DRadarBoxVertices(
50 const EigenVector<Eigen::Vector3d>& radar_box_vertices,
53 const Eigen::Matrix4d& world2camera_pose,
54 EigenVector<Eigen::Vector2d>* radar_box2d_vertices) {
55 const double camera_height = camera->GetBaseObject()->size(2);
56 EigenVector<Eigen::Vector3d> modified_radar_box_vertices = radar_box_vertices;
57 for (
size_t i = 0; i < 4; ++i) {
58 modified_radar_box_vertices[i + 4].z() =
59 modified_radar_box_vertices[i].z() + camera_height;
61 radar_box2d_vertices->reserve(radar_box_vertices.size());
62 for (
const auto& box_vertex_3d : modified_radar_box_vertices) {
63 Eigen::Vector4d local_box_vertex =
64 world2camera_pose * box_vertex_3d.homogeneous();
65 Eigen::Vector2f temp_vertex =
66 camera_intrinsic->Project(local_box_vertex.head(3).cast<
float>());
67 radar_box2d_vertices->push_back(temp_vertex.cast<
double>());
73 return SensorDataManager::Instance()->GetCameraIntrinsic(
74 camera->GetSensorId());
77bool TrackObjectDistance::QueryWorld2CameraPose(
79 Eigen::Affine3d camera2world_pose;
80 bool status = SensorDataManager::Instance()->GetPose(
81 camera->GetSensorId(), camera->GetTimestamp(), &camera2world_pose);
85 (*pose) = camera2world_pose.matrix().inverse();
89bool TrackObjectDistance::QueryLidar2WorldPose(
91 Eigen::Affine3d velo2world_pose;
92 if (!lidar->GetRelatedFramePose(&velo2world_pose)) {
95 (*pose) = velo2world_pose.matrix();
99ProjectionCacheObject* TrackObjectDistance::BuildProjectionCacheObject(
102 const std::string& measurement_sensor_id,
double measurement_timestamp,
103 const std::string& projection_sensor_id,
double projection_timestamp) {
105 Eigen::Matrix4d world2camera_pose;
106 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
109 Eigen::Matrix4d lidar2world_pose;
110 if (!QueryLidar2WorldPose(lidar, &lidar2world_pose)) {
113 Eigen::Matrix4d lidar2camera_pose =
114 static_cast<Eigen::Matrix<double, 4, 4, 0, 4, 4>
>(world2camera_pose *
117 double time_diff = camera->GetTimestamp() - lidar->GetTimestamp();
118 Eigen::Vector3d offset =
119 lidar->GetBaseObject()->velocity.cast<
double>() * time_diff;
122 lidar->GetBaseObject()->lidar_supplement.cloud;
123 double width =
static_cast<double>(camera_model->get_width());
124 double height =
static_cast<double>(camera_model->get_height());
125 const int lidar_object_id = lidar->GetBaseObject()->id;
126 ProjectionCacheObject* cache_object = projection_cache_.
BuildObject(
127 measurement_sensor_id, measurement_timestamp, projection_sensor_id,
128 projection_timestamp, lidar_object_id);
129 if (cache_object ==
nullptr) {
130 AERROR <<
"Failed to build projection cache object";
135 float xmin = std::numeric_limits<float>::max();
136 float ymin = std::numeric_limits<float>::max();
137 float xmax = -std::numeric_limits<float>::max();
138 float ymax = -std::numeric_limits<float>::max();
142 bool is_all_lidar_3d_vertices_outside_frustum =
false;
143 if (cloud.size() > s_lidar2camera_projection_vertices_check_pts_num_) {
144 is_all_lidar_3d_vertices_outside_frustum =
true;
145 EigenVector<Eigen::Vector3d> lidar_box_vertices;
147 for (
size_t i = 0; i < lidar_box_vertices.size(); ++i) {
148 Eigen::Vector3d& vt = lidar_box_vertices[i];
149 Eigen::Vector4d project_vt =
150 static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
151 world2camera_pose * Eigen::Vector4d(vt(0) + offset(0),
153 vt(2) + offset(2), 1.0));
154 if (project_vt(2) <= 0) {
157 Eigen::Vector2f project_vt2f = camera_model->Project(Eigen::Vector3f(
158 static_cast<float>(project_vt(0)),
static_cast<float>(project_vt(1)),
159 static_cast<float>(project_vt(2))));
163 is_all_lidar_3d_vertices_outside_frustum =
false;
169 if (!is_all_lidar_3d_vertices_outside_frustum) {
172 if (cloud.size() > s_lidar2camera_projection_downsample_target_pts_num_) {
174 cloud.size() / s_lidar2camera_projection_downsample_target_pts_num_;
176 for (
size_t i = 0; i < cloud.size(); ++i) {
177 if ((every_n > 1) && (i % every_n != 0)) {
181 Eigen::Vector4d project_pt =
182 static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
183 lidar2camera_pose * Eigen::Vector4d(pt.x + offset(0),
185 pt.z + offset(2), 1.0));
186 if (project_pt(2) <= 0) {
189 Eigen::Vector2f project_pt2f = camera_model->Project(Eigen::Vector3f(
190 static_cast<float>(project_pt(0)),
static_cast<float>(project_pt(1)),
191 static_cast<float>(project_pt(2))));
195 if (project_pt2f.x() < xmin) {
196 xmin = project_pt2f.
x();
198 if (project_pt2f.y() < ymin) {
199 ymin = project_pt2f.y();
201 if (project_pt2f.x() > xmax) {
202 xmax = project_pt2f.x();
204 if (project_pt2f.y() > ymax) {
205 ymax = project_pt2f.y();
207 projection_cache_.
AddPoint(project_pt2f);
211 cache_object->SetStartInd(start_ind);
212 cache_object->SetEndInd(end_ind);
214 cache_object->SetBox(box);
218ProjectionCacheObject* TrackObjectDistance::QueryProjectionCacheObject(
221 const bool measurement_is_lidar) {
223 const std::string& measurement_sensor_id =
224 measurement_is_lidar ? lidar->GetSensorId() : camera->GetSensorId();
225 const double measurement_timestamp =
226 measurement_is_lidar ? lidar->GetTimestamp() : camera->GetTimestamp();
227 const std::string& projection_sensor_id =
228 measurement_is_lidar ? camera->GetSensorId() : lidar->GetSensorId();
229 const double projection_timestamp =
230 measurement_is_lidar ? camera->GetTimestamp() : lidar->GetTimestamp();
231 const int lidar_object_id = lidar->GetBaseObject()->id;
232 ProjectionCacheObject* cache_object = projection_cache_.
QueryObject(
233 measurement_sensor_id, measurement_timestamp, projection_sensor_id,
234 projection_timestamp, lidar_object_id);
235 if (cache_object !=
nullptr) {
238 return BuildProjectionCacheObject(
239 lidar, camera, camera_model, measurement_sensor_id, measurement_timestamp,
240 projection_sensor_id, projection_timestamp);
243void TrackObjectDistance::QueryProjectedVeloCtOnCamera(
245 const Eigen::Matrix4d& lidar2camera_pose, Eigen::Vector3d* projected_ct) {
246 double time_diff = camera->GetTimestamp() - velodyne64->GetTimestamp();
247 Eigen::Vector3d offset =
248 velodyne64->GetBaseObject()->velocity.cast<
double>() * time_diff;
249 const Eigen::Vector3d& velo_ct = velodyne64->GetBaseObject()->center;
250 Eigen::Vector4d projected_ct_4d =
251 static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
252 lidar2camera_pose * Eigen::Vector4d(velo_ct[0] + offset[0],
253 velo_ct[1] + offset[1],
254 velo_ct[2] + offset[2], 1.0));
255 *projected_ct = projected_ct_4d.head(3);
258bool TrackObjectDistance::QueryPolygonDCenter(
260 const int range, Eigen::Vector3d* polygon_ct) {
261 if (
object ==
nullptr) {
271bool TrackObjectDistance::IsTrackIdConsistent(
273 if (object1 ==
nullptr || object2 ==
nullptr) {
276 if (object1->GetBaseObject()->track_id ==
277 object2->GetBaseObject()->track_id) {
283bool TrackObjectDistance::LidarCameraCenterDistanceExceedDynamicThreshold(
285 double center_distance =
286 (lidar->GetBaseObject()->center - camera->GetBaseObject()->center)
289 double local_distance = 60;
291 lidar->GetBaseObject()->lidar_supplement.cloud;
292 if (cloud.size() > 0) {
294 local_distance = std::sqrt(pt.x * pt.x + pt.y * pt.y);
296 double dynamic_threshold = 5 + 0.15 * local_distance;
297 if (center_distance > dynamic_threshold) {
309 if (fused_object ==
nullptr) {
310 AERROR <<
"fused object is nullptr";
311 return (std::numeric_limits<float>::max)();
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)();
318 float distance = (std::numeric_limits<float>::max)();
319 float min_distance = (std::numeric_limits<float>::max)();
324 if (lidar_object !=
nullptr) {
326 min_distance = std::min(distance, min_distance);
328 if (radar_object !=
nullptr) {
330 min_distance = std::min(distance, min_distance);
332 if (camera_object !=
nullptr) {
333 bool is_lidar_track_id_consistent =
334 IsTrackIdConsistent(lidar_object, sensor_object);
336 is_lidar_track_id_consistent);
337 min_distance = std::min(distance, min_distance);
339 }
else if (
IsRadar(sensor_object)) {
340 if (lidar_object !=
nullptr) {
342 min_distance = std::min(distance, min_distance);
344 if (radar_object !=
nullptr) {
346 min_distance = std::min(distance, min_distance);
348 if (camera_object !=
nullptr) {
350 min_distance = std::min(distance, min_distance);
352 }
else if (
IsCamera(sensor_object)) {
353 if (lidar_object !=
nullptr) {
354 bool is_camera_track_id_consistent =
355 IsTrackIdConsistent(camera_object, sensor_object);
357 is_camera_track_id_consistent);
358 min_distance = std::min(distance, min_distance);
361 AERROR <<
"fused sensor type is not support";
373 double center_distance = (sensor_object->GetBaseObject()->center -
374 fused_object->GetBaseObject()->center)
377 if (center_distance > s_lidar2lidar_association_center_dist_threshold_) {
378 ADEBUG <<
"center distance exceed lidar2lidar tight threshold: "
379 <<
"center_dist@" << center_distance <<
", "
381 << s_lidar2lidar_association_center_dist_threshold_;
382 return (std::numeric_limits<float>::max)();
386 ADEBUG <<
"ComputeLidarLidar distance: " << distance;
397 double center_distance = (sensor_object->GetBaseObject()->center -
398 fused_object->GetBaseObject()->center)
401 if (center_distance > s_lidar2radar_association_center_dist_threshold_) {
402 ADEBUG <<
"center distance exceed lidar2radar tight threshold: "
403 <<
"center_dist@" << center_distance <<
", "
405 << s_lidar2radar_association_center_dist_threshold_;
406 return (std::numeric_limits<float>::max)();
410 ADEBUG <<
"ComputeLidarRadar distance: " << distance;
421 double center_distance = (sensor_object->GetBaseObject()->center -
422 fused_object->GetBaseObject()->center)
425 if (center_distance > s_radar2radar_association_center_dist_threshold_) {
426 ADEBUG <<
"center distance exceed radar2radar tight threshold: "
427 <<
"center_dist@" << center_distance <<
", "
429 << s_radar2radar_association_center_dist_threshold_;
430 return (std::numeric_limits<float>::max)();
434 ADEBUG <<
"ComputeRadarRadar distance: " << distance;
443 const bool measurement_is_lidar,
const bool is_track_id_consistent) {
444 if (!is_track_id_consistent) {
445 if (LidarCameraCenterDistanceExceedDynamicThreshold(lidar, camera)) {
446 return distance_thresh_;
449 float distance = distance_thresh_;
452 if (camera_model ==
nullptr) {
453 AERROR <<
"Failed to get camera model for " << camera->GetSensorId();
456 Eigen::Matrix4d world2camera_pose;
457 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
458 AERROR <<
"Failed to query camera pose";
461 Eigen::Matrix4d lidar2world_pose;
462 if (!QueryLidar2WorldPose(lidar, &lidar2world_pose)) {
463 AERROR <<
"Failed to query lidar pose";
466 Eigen::Matrix4d lidar2camera_pose =
467 static_cast<Eigen::Matrix<double, 4, 4, 0, 4, 4>
>(world2camera_pose *
471 lidar->GetBaseObject()->lidar_supplement.cloud;
473 camera->GetBaseObject()->camera_supplement.box;
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) {
482 lidar, camera, camera_model, measurement_is_lidar);
483 if (cache_object ==
nullptr) {
484 AERROR <<
"Failed to query projection cached object";
490 distance_thresh_ * ((1.0f -
static_cast<float>(similarity)) /
491 (1.0f - vc_similarity2distance_penalize_thresh_));
494 Eigen::Vector3d projected_velo_ct;
495 QueryProjectedVeloCtOnCamera(lidar, camera, lidar2camera_pose,
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;
505 static_cast<float>(ct_diff.norm()) * vc_diff2distance_scale_factor_;
507 distance = std::numeric_limits<float>::max();
510 ADEBUG <<
"ComputeLidarCamera distance: " << distance;
519 float distance = distance_thresh_;
522 if (camera_model ==
nullptr) {
523 AERROR <<
"Failed to get camera model for " << camera->GetSensorId();
526 Eigen::Matrix4d world2camera_pose;
527 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
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(
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());
543 double time_diff = camera->GetTimestamp() - radar->GetTimestamp();
544 Eigen::Vector3d offset =
545 radar->GetBaseObject()->velocity.cast<
double>() * time_diff;
547 Eigen::Vector3d radar_ct = radar->GetBaseObject()->center + offset;
548 Eigen::Vector4d local_pt =
static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
550 Eigen::Vector4d(radar_ct[0], radar_ct[1], radar_ct[2], 1.0));
554 GetModified2DRadarBoxVertices(radar_box_vertices, camera, camera_model,
555 world2camera_pose, &radar_box2d_vertices);
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>();
568 pt3d.x(), box2d_ct.x(), box2d_size.x(), rc_x_similarity_params_);
571 pt3d.y(), box2d_ct.y(), box2d_size.y(), rc_y_similarity_params_);
575 radar, camera, box2d_size.y(), radar_box2d_vertices,
576 rc_h_similarity_params_);
579 radar, width, box2d_size.x(), radar_box2d_vertices,
580 rc_w_similarity_params_);
583 radar_ct, camera, world2camera_pose, rc_loc_similarity_params_);
585 double velocity_similarity =
588 std::vector<double> multiple_similarities = {
589 x_similarity, y_similarity, loc_similarity,
590 velocity_similarity, h_similarity, w_similarity};
594 distance = distance_thresh_ *
static_cast<float>(1.0 - fused_similarity) /
595 (1.0f - rc_similarity2distance_penalize_thresh_);
596 ADEBUG <<
"ComputeRadarCamera distance: " << distance;
605 return (std::numeric_limits<float>::max());
620 const bool measurement_is_lidar) {
621 double similarity = 0.0;
624 if (camera_model ==
nullptr) {
625 AERROR <<
"Failed to get camera model for " << camera->GetSensorId();
628 Eigen::Matrix4d world2camera_pose;
629 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
632 Eigen::Matrix4d lidar2world_pose;
633 if (!QueryLidar2WorldPose(lidar, &lidar2world_pose)) {
639 lidar->GetBaseObject()->lidar_supplement.cloud;
641 camera->GetBaseObject()->camera_supplement.box;
642 if (cloud.
size() > 0) {
644 lidar, camera, camera_model, measurement_is_lidar);
645 if (cache_object ==
nullptr) {
663 double similarity = 0.0;
666 if (camera_model ==
nullptr) {
667 AERROR <<
"Failed to get camera model for " << camera->GetSensorId();
670 Eigen::Matrix4d world2camera_pose;
671 if (!QueryWorld2CameraPose(camera, &world2camera_pose)) {
676 camera->GetBaseObject()->camera_supplement.box;
678 const Eigen::Vector2d box2d_ct =
679 Eigen::Vector2d(camera_bbox_ct.
x, camera_bbox_ct.
y);
680 Eigen::Vector2d box2d_size = Eigen::Vector2d(
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());
687 Eigen::Vector3d radar_ct = radar->GetBaseObject()->center;
688 Eigen::Vector4d local_pt =
static_cast<Eigen::Matrix<double, 4, 1, 0, 4, 1>
>(
690 Eigen::Vector4d(radar_ct[0], radar_ct[1], radar_ct[2], 1.0));
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>();
707 rc_x_similarity_params_2_welsh_loss_scale_;
710 pt3d.x(), box2d_ct.x(), box2d_size.x(), rc_x_similarity_params_2_);
713 pt3d.y(), box2d_ct.y(), box2d_size.y(), rc_x_similarity_params_2_);
714 std::vector<double> multiple_similarities = {x_similarity, y_similarity};
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());
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());
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;
750 const Eigen::Vector3d& des,
const Eigen::Vector3d& src) {
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()));
761 int size =
static_cast<int>(polygon.
size());
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;
779 int range, Eigen::Vector3d* center) {
781 std::map<double, int> distance2idx;
782 for (
size_t idx = 0; idx < polygon.
size(); ++idx) {
783 const auto& point = polygon.
at(idx);
785 sqrt(pow(point.x - ref_pos(0), 2) + pow(point.y - ref_pos(1), 2));
786 distance2idx.insert(std::make_pair(distance, idx));
788 int size =
static_cast<int>(distance2idx.size());
789 int nu = std::max(range, size / range + 1);
790 nu = std::min(nu, size);
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]);
const PointT * at(size_t col, size_t row) const
virtual void push_back(const PointT &point)
ProjectionCacheObject * BuildObject(const std::string &measurement_sensor_id, double measurement_timestamp, const std::string &projection_sensor_id, double projection_timestamp, int lidar_object_id)
void AddPoint(const Eigen::Vector2f &pt)
ProjectionCacheObject * QueryObject(const std::string &measurement_sensor_id, double measurement_timestamp, const std::string &projection_sensor_id, double projection_timestamp, int lidar_object_id)
size_t GetPoint2dsSize() const
float ComputePolygonDistance3d(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range)
float ComputeLidarLidar(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
float Compute(const TrackPtr &fused_track, const SensorObjectPtr &sensor_object, const TrackObjectDistanceOptions &options)
float ComputeEuclideanDistance(const Eigen::Vector3d &des, const Eigen::Vector3d &src)
apollo::common::EigenVector< EigenType > EigenVector
double ComputeRadarCameraSimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
float ComputeRadarRadar(const SensorObjectConstPtr &fused_object, const SensorObjectPtr &sensor_object, const Eigen::Vector3d &ref_pos, int range=3)
double ComputeLidarCameraSimilarity(const SensorObjectConstPtr &lidar, const SensorObjectConstPtr &camera, const bool measurement_is_lidar)
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 ComputeCameraCamera(const SensorObjectPtr &fused_camera, const SensorObjectPtr &sensor_camera)
float ComputeRadarCamera(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
bool ComputePolygonCenter(const base::PolygonDType &polygon, Eigen::Vector3d *center)
uint32_t height
Height of point cloud
uint32_t width
Width of point cloud
std::shared_ptr< BaseCameraModel > BaseCameraModelPtr
AttributePointCloud< PointF > PointFCloud
std::shared_ptr< const Object > ObjectConstPtr
PointCloud< PointD > PolygonDType
std::shared_ptr< const SensorObject > SensorObjectConstPtr
std::shared_ptr< SensorObject > SensorObjectPtr
double FuseMultipleProbabilities(const std::vector< double > &probs)
bool IsCamera(const SensorObjectConstPtr &obj)
double ComputePtsBoxSimilarity(const ProjectionCachePtr &cache, const ProjectionCacheObject *object, const base::BBox2DF &camera_bbox)
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
std::shared_ptr< Track > TrackPtr
std::shared_ptr< FusedObject > FusedObjectPtr
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)
bool IsLidar(const SensorObjectConstPtr &obj)
double ComputeRadarCameraVelocitySimilarity(const SensorObjectConstPtr &radar, const SensorObjectConstPtr &camera)
calculate the velocity similarity between radar and camera
bool IsRadar(const SensorObjectConstPtr &obj)
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
Point2D< T > Center() const
Eigen::Vector3d * ref_point