Apollo 11.0
自动驾驶开放平台
track_object_distance.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16#pragma once
17
18#include <string>
19
20#include "cyber/common/macros.h"
32
33namespace apollo {
34namespace perception {
35namespace fusion {
36
38 Eigen::Vector3d* ref_point = nullptr;
39}; // struct TrackedObjectDistanceOptions
40
42 public:
43 template <class EigenType>
45
46 public:
49
55 void set_distance_thresh(const float distance_thresh) {
56 distance_thresh_ = distance_thresh;
57 }
58
65 void ResetProjectionCache(std::string sensor_id, double timestamp) {
66 projection_cache_.Reset(sensor_id, timestamp);
67 }
68
69 // @brief: compute the distance between input fused track and sensor object
70 // @params [in] fused_track: maintained fused track
71 // @params [in] sensor_object: sensor observation
72 // @params [in] options: options of track object distanace computation
73 // @return track object distance
74 float Compute(const TrackPtr& fused_track,
75 const SensorObjectPtr& sensor_object,
76 const TrackObjectDistanceOptions& options);
77 // @brief: calculate the similarity between velodyne64 observation and
78 // camera observation
79 // @return the similarity which belongs to [0, 1]. When velodyne64
80 // observation is similar to the camera one, the similarity would
81 // close to 1. Otherwise, it would close to 0.
82 // @NOTE: original method name is compute_velodyne64_camera_dist_score
84 const SensorObjectConstPtr& camera,
85 const bool measurement_is_lidar);
86 // @brief: calculate the similarity between radar observation and
87 // camera observation
88 // @retrun the similarity which belongs to [0, 1]. When radar
89 // observation is similar to the camera one, the similarity would
90 // close to 1. Otherwise, it would close to 0.
91 // @NOTE: original method name is compute_radar_camera_dist_score
93 const SensorObjectConstPtr& camera);
94
95 protected:
96 // @brief: compute the distance between lidar observation and
97 // lidar observation
98 // @return distance of lidar vs. lidar
99 float ComputeLidarLidar(const SensorObjectConstPtr& fused_object,
100 const SensorObjectPtr& sensor_object,
101 const Eigen::Vector3d& ref_pos, int range = 3);
102 // @brief: compute the distance between lidar observation and
103 // radar observation
104 // @return distance of lidar vs. radar
105 float ComputeLidarRadar(const SensorObjectConstPtr& fused_object,
106 const SensorObjectPtr& sensor_object,
107 const Eigen::Vector3d& ref_pos, int range = 3);
108 // @brief: compute the distance between radar observation and
109 // radar observation
110 // @return distance of radar vs. radar
111 float ComputeRadarRadar(const SensorObjectConstPtr& fused_object,
112 const SensorObjectPtr& sensor_object,
113 const Eigen::Vector3d& ref_pos, int range = 3);
114 // @brief: compute the distance between lidar observation and
115 // camera observation
116 // @return distance of lidar vs. camera
117 float ComputeLidarCamera(const SensorObjectConstPtr& lidar,
118 const SensorObjectConstPtr& camera,
119 const bool measurement_is_lidar,
120 const bool is_track_id_consistent);
121 // @brief: compute the distance between radar observation and
122 // camera observation
123 // @return distance of radar vs. camera
124 float ComputeRadarCamera(const SensorObjectConstPtr& radar,
125 const SensorObjectConstPtr& camera);
126 // @brief: compute the distance between camera observation and
127 // camera observation
128 // @return distance of camera vs. camera
129 float ComputeCameraCamera(const SensorObjectPtr& fused_camera,
130 const SensorObjectPtr& sensor_camera);
131
132 // @brief: compute 3d distance between fused object and sensor object
133 // @return 3d distance betwene fused object and sensor object
134 float ComputePolygonDistance3d(const SensorObjectConstPtr& fused_object,
135 const SensorObjectPtr& sensor_object,
136 const Eigen::Vector3d& ref_pos, int range);
137 // @brief: compute euclidean distance
138 // @return euclidean distance of input pts
139 float ComputeEuclideanDistance(const Eigen::Vector3d& des,
140 const Eigen::Vector3d& src);
141 // @brief: compute polygon center
142 // @params [out] center: center of input polygon
143 // @return true if get center successfully, otherwise return false
144 bool ComputePolygonCenter(const base::PolygonDType& polygon,
145 Eigen::Vector3d* center);
146 // @brief: compute polygon center
147 // @params [out] center: center of input polygon
148 // @return true if get center successfully, otherwise return false
149 bool ComputePolygonCenter(const base::PolygonDType& polygon,
150 const Eigen::Vector3d& ref_pos, int range,
151 Eigen::Vector3d* center);
152
153 private:
154 base::BaseCameraModelPtr QueryCameraModel(const SensorObjectConstPtr& camera);
155 bool QueryWorld2CameraPose(const SensorObjectConstPtr& camera,
156 Eigen::Matrix4d* pose);
157 bool QueryLidar2WorldPose(const SensorObjectConstPtr& lidar,
158 Eigen::Matrix4d* pose);
159 void QueryProjectedVeloCtOnCamera(const SensorObjectConstPtr& velodyne64,
160 const SensorObjectConstPtr& camera,
161 const Eigen::Matrix4d& lidar2camera_pose,
162 Eigen::Vector3d* projected_ct);
163 bool QueryPolygonDCenter(const base::ObjectConstPtr& object,
164 const Eigen::Vector3d& ref_pos, const int range,
165 Eigen::Vector3d* polygon_ct);
166 void GetModified2DRadarBoxVertices(
167 const EigenVector<Eigen::Vector3d>& radar_box_vertices,
168 const SensorObjectConstPtr& camera,
169 const base::BaseCameraModelPtr& camera_intrinsic,
170 const Eigen::Matrix4d& world2camera_pose,
171 EigenVector<Eigen::Vector2d>* radar_box2d_vertices);
172 ProjectionCacheObject* BuildProjectionCacheObject(
173 const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera,
174 const base::BaseCameraModelPtr& camera_model,
175 const std::string& measurement_sensor_id, double measurement_timestamp,
176 const std::string& projection_sensor_id, double projection_timestamp);
177 ProjectionCacheObject* QueryProjectionCacheObject(
178 const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera,
179 const base::BaseCameraModelPtr& camera_model,
180 const bool measurement_is_lidar);
181 bool IsTrackIdConsistent(const SensorObjectConstPtr& object1,
182 const SensorObjectConstPtr& object2);
183 bool LidarCameraCenterDistanceExceedDynamicThreshold(
184 const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera);
185
186 ProjectionCache projection_cache_;
187 float distance_thresh_ = 4.0f;
188 const float vc_similarity2distance_penalize_thresh_ = 0.07f;
189 const float vc_diff2distance_scale_factor_ = 0.8f;
190 const float rc_similarity2distance_penalize_thresh_ = 0.1f;
191 const float rc_x_similarity_params_2_welsh_loss_scale_ = 0.5f;
192 const double rc_min_box_size_[2] = {25, 25};
193
194 XSimilarityParams rc_x_similarity_params_ = XSimilarityParams();
195 YSimilarityParams rc_y_similarity_params_ = YSimilarityParams();
196 HSimilarityParams rc_h_similarity_params_ = HSimilarityParams();
197 WSimilarityParams rc_w_similarity_params_ = WSimilarityParams();
198 LocSimilarityParams rc_loc_similarity_params_ = LocSimilarityParams();
199 XSimilarityParams rc_x_similarity_params_2_ = XSimilarityParams();
200
201 private:
202 static double s_lidar2lidar_association_center_dist_threshold_;
203 static double s_lidar2radar_association_center_dist_threshold_;
204 static double s_radar2radar_association_center_dist_threshold_;
205 static size_t s_lidar2camera_projection_downsample_target_pts_num_;
206 static size_t s_lidar2camera_projection_vertices_check_pts_num_;
207
209}; // class TrackObjectDistance
210
211} // namespace fusion
212} // namespace perception
213} // namespace apollo
void Reset(std::string sensor_id, double timestamp)
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)
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)
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)
#define DISALLOW_COPY_AND_ASSIGN(classname)
Definition macros.h:48
std::vector< EigenType, Eigen::aligned_allocator< EigenType > > EigenVector
Definition eigen_defs.h:33
std::shared_ptr< BaseCameraModel > BaseCameraModelPtr
Definition camera.h:75
std::shared_ptr< const Object > ObjectConstPtr
Definition object.h:128
std::shared_ptr< const SensorObject > SensorObjectConstPtr
std::shared_ptr< SensorObject > SensorObjectPtr
std::shared_ptr< Track > TrackPtr
Definition track.h:397
class register implement
Definition arena_queue.h:37