Apollo  6.0
Open source self driving car software
track_object_distance.h
Go to the documentation of this file.
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 #include <vector>
20 
21 #include "Eigen/StdVector"
22 
33 
34 namespace apollo {
35 namespace perception {
36 namespace fusion {
37 
40 }; // struct TrackedObjectDistanceOptions
41 
43  public:
44  TrackObjectDistance() = default;
45  ~TrackObjectDistance() = default;
47  TrackObjectDistance operator=(const TrackObjectDistance&) = delete;
48 
49  void set_distance_thresh(const float distance_thresh) {
50  distance_thresh_ = distance_thresh;
51  }
52  void ResetProjectionCache(std::string sensor_id, double timestamp) {
53  projection_cache_.Reset(sensor_id, timestamp);
54  }
55 
56  // @brief: compute the distance between input fused track and sensor object
57  // @params [in] fused_track: maintained fused track
58  // @params [in] sensor_object: sensor observation
59  // @params [in] options: options of track object distanace computation
60  // @return track object distance
61  float Compute(const TrackPtr& fused_track,
62  const SensorObjectPtr& sensor_object,
63  const TrackObjectDistanceOptions& options);
64  // @brief: calculate the similarity between velodyne64 observation and
65  // camera observation
66  // @return the similarity which belongs to [0, 1]. When velodyne64
67  // observation is similar to the camera one, the similarity would
68  // close to 1. Otherwise, it would close to 0.
69  // @NOTE: original method name is compute_velodyne64_camera_dist_score
70  double ComputeLidarCameraSimilarity(const SensorObjectConstPtr& lidar,
71  const SensorObjectConstPtr& camera,
72  const bool measurement_is_lidar);
73  // @brief: calculate the similarity between radar observation and
74  // camera observation
75  // @retrun the similarity which belongs to [0, 1]. When radar
76  // observation is similar to the camera one, the similarity would
77  // close to 1. Otherwise, it would close to 0.
78  // @NOTE: original method name is compute_radar_camera_dist_score
79  double ComputeRadarCameraSimilarity(const SensorObjectConstPtr& radar,
80  const SensorObjectConstPtr& camera);
81 
82  protected:
83  // @brief: compute the distance between lidar observation and
84  // lidar observation
85  // @return distance of lidar vs. lidar
86  float ComputeLidarLidar(const SensorObjectConstPtr& fused_object,
87  const SensorObjectPtr& sensor_object,
88  const Eigen::Vector3d& ref_pos, int range = 3);
89  // @brief: compute the distance between lidar observation and
90  // radar observation
91  // @return distance of lidar vs. radar
92  float ComputeLidarRadar(const SensorObjectConstPtr& fused_object,
93  const SensorObjectPtr& sensor_object,
94  const Eigen::Vector3d& ref_pos, int range = 3);
95  // @brief: compute the distance between radar observation and
96  // radar observation
97  // @return distance of radar vs. radar
98  float ComputeRadarRadar(const SensorObjectPtr& fused_object,
99  const SensorObjectPtr& sensor_object,
100  const Eigen::Vector3d& ref_pos, int range = 3);
101  // @brief: compute the distance between lidar observation and
102  // camera observation
103  // @return distance of lidar vs. camera
104  float ComputeLidarCamera(const SensorObjectConstPtr& lidar,
105  const SensorObjectConstPtr& camera,
106  const bool measurement_is_lidar,
107  const bool is_track_id_consistent);
108  // @brief: compute the distance between radar observation and
109  // camera observation
110  // @return distance of radar vs. camera
111  float ComputeRadarCamera(const SensorObjectConstPtr& radar,
112  const SensorObjectConstPtr& camera);
113  // @brief: compute the distance between camera observation and
114  // camera observation
115  // @return distance of camera vs. camera
116  float ComputeCameraCamera(const SensorObjectPtr& fused_camera,
117  const SensorObjectPtr& sensor_camera);
118 
119  // @brief: compute 3d distance between fused object and sensor object
120  // @return 3d distance betwene fused object and sensor object
121  float ComputePolygonDistance3d(const SensorObjectConstPtr& fused_object,
122  const SensorObjectPtr& sensor_object,
123  const Eigen::Vector3d& ref_pos, int range);
124  // @brief: compute euclidean distance
125  // @return euclidean distance of input pts
126  float ComputeEuclideanDistance(const Eigen::Vector3d& des,
127  const Eigen::Vector3d& src);
128  // @brief: compute polygon center
129  // @params [out] center: center of input polygon
130  // @return true if get center successfully, otherwise return false
131  bool ComputePolygonCenter(const base::PolygonDType& polygon,
132  Eigen::Vector3d* center);
133  // @brief: compute polygon center
134  // @params [out] center: center of input polygon
135  // @return true if get center successfully, otherwise return false
136  bool ComputePolygonCenter(const base::PolygonDType& polygon,
137  const Eigen::Vector3d& ref_pos, int range,
138  Eigen::Vector3d* center);
139 
140  private:
141  base::BaseCameraModelPtr QueryCameraModel(const SensorObjectConstPtr& camera);
142  bool QueryWorld2CameraPose(const SensorObjectConstPtr& camera,
143  Eigen::Matrix4d* pose);
144  bool QueryLidar2WorldPose(const SensorObjectConstPtr& lidar,
145  Eigen::Matrix4d* pose);
146  void QueryProjectedVeloCtOnCamera(const SensorObjectConstPtr& velodyne64,
147  const SensorObjectConstPtr& camera,
148  const Eigen::Matrix4d& lidar2camera_pose,
149  Eigen::Vector3d* projected_ct);
150  bool QueryPolygonDCenter(const base::ObjectConstPtr& object,
151  const Eigen::Vector3d& ref_pos, const int range,
152  Eigen::Vector3d* polygon_ct);
153  void GetModified2DRadarBoxVertices(
154  const std::vector<Eigen::Vector3d>& radar_box_vertices,
155  const SensorObjectConstPtr& camera,
156  const base::BaseCameraModelPtr& camera_intrinsic,
157  const Eigen::Matrix4d& world2camera_pose,
158  std::vector<Eigen::Vector2d>* radar_box2d_vertices);
159  ProjectionCacheObject* BuildProjectionCacheObject(
160  const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera,
161  const base::BaseCameraModelPtr& camera_model,
162  const std::string& measurement_sensor_id, double measurement_timestamp,
163  const std::string& projection_sensor_id, double projection_timestamp);
164  ProjectionCacheObject* QueryProjectionCacheObject(
165  const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera,
166  const base::BaseCameraModelPtr& camera_model,
167  const bool measurement_is_lidar);
168  bool IsTrackIdConsistent(const SensorObjectConstPtr& object1,
169  const SensorObjectConstPtr& object2);
170  bool LidarCameraCenterDistanceExceedDynamicThreshold(
171  const SensorObjectConstPtr& lidar, const SensorObjectConstPtr& camera);
172 
173  ProjectionCache projection_cache_;
174  float distance_thresh_ = 4.0f;
175  const float vc_similarity2distance_penalize_thresh_ = 0.07f;
176  const float vc_diff2distance_scale_factor_ = 0.8f;
177  const float rc_similarity2distance_penalize_thresh_ = 0.1f;
178  const float rc_x_similarity_params_2_welsh_loss_scale_ = 0.5f;
179  const Eigen::Vector2d rc_min_box_size_ = Eigen::Vector2d(25, 25);
180 
181  XSimilarityParams rc_x_similarity_params_ = XSimilarityParams();
182  YSimilarityParams rc_y_similarity_params_ = YSimilarityParams();
183  HSimilarityParams rc_h_similarity_params_ = HSimilarityParams();
184  WSimilarityParams rc_w_similarity_params_ = WSimilarityParams();
185  LocSimilarityParams rc_loc_similarity_params_ = LocSimilarityParams();
186  XSimilarityParams rc_x_similarity_params_2_ = XSimilarityParams();
187 
188  private:
189  static double s_lidar2lidar_association_center_dist_threshold_;
190  static double s_lidar2radar_association_center_dist_threshold_;
191  static double s_radar2radar_association_center_dist_threshold_;
192  static size_t s_lidar2camera_projection_downsample_target_pts_num_;
193  static size_t s_lidar2camera_projection_vertices_check_pts_num_;
194 }; // class TrackObjectDistance
195 
196 } // namespace fusion
197 } // namespace perception
198 } // namespace apollo
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
Definition: track_object_similarity.h:53
Definition: projection_cache.h:30
Eigen::Vector2d Vector2d
Definition: base_map_fwd.h:36
Definition: track_object_similarity.h:30
Definition: track_object_distance.h:42
Eigen::Vector3d Vector3d
Definition: frame_transform.h:27
Eigen::Matrix4d Matrix4d
Definition: base_map_fwd.h:32
std::shared_ptr< SensorObject > SensorObjectPtr
Definition: sensor_object.h:68
Definition: projection_cache.h:89
Definition: track_object_distance.h:38
std::shared_ptr< Track > TrackPtr
Definition: track.h:160
Definition: track_object_similarity.h:42
Definition: track_object_similarity.h:36
void ResetProjectionCache(std::string sensor_id, double timestamp)
Definition: track_object_distance.h:52
std::shared_ptr< const Object > ObjectConstPtr
Definition: object.h:124
void set_distance_thresh(const float distance_thresh)
Definition: track_object_distance.h:49
Definition: track_object_similarity.h:48
Eigen::Vector3d * ref_point
Definition: track_object_distance.h:39
std::shared_ptr< BaseCameraModel > BaseCameraModelPtr
Definition: camera.h:75
std::shared_ptr< const SensorObject > SensorObjectConstPtr
Definition: sensor_object.h:69