32 const Eigen::VectorXf& track_predict,
34 const double time_diff) {
38 Eigen::Vector3f measured_anchor_point =
39 (new_object->anchor_point).cast<float>();
40 Eigen::Vector3f predicted_anchor_point = track_predict.head(3);
41 Eigen::Vector3f measure_predict_diff =
42 measured_anchor_point - predicted_anchor_point;
44 float location_dist =
static_cast<float>(sqrt(
45 (measure_predict_diff.head(2).cwiseProduct(measure_predict_diff.head(2)))
51 Eigen::Vector2d ref_dir = last_object->output_velocity.head(2);
52 double speed = ref_dir.norm();
59 Eigen::Vector2d ref_o_dir = Eigen::Vector2d(ref_dir[1], -ref_dir[0]);
60 double dx = ref_dir(0) * measure_predict_diff(0) +
61 ref_dir(1) * measure_predict_diff(1);
62 double dy = ref_o_dir(0) * measure_predict_diff(0) +
63 ref_o_dir(1) * measure_predict_diff(1);
64 location_dist =
static_cast<float>(sqrt(dx * dx * 0.5 + dy * dy * 2));
71 const Eigen::VectorXf& track_predict,
73 const double time_diff) {
77 Eigen::Vector3f old_anchor_point =
78 (last_object->belief_anchor_point).cast<float>();
79 Eigen::Vector3f new_anchor_point = (new_object->anchor_point).cast<float>();
80 Eigen::Vector3f anchor_point_shift_dir = new_anchor_point - old_anchor_point;
81 anchor_point_shift_dir[2] = 0.0;
83 Eigen::Vector3f track_motion_dir = track_predict.head(6).tail(3);
84 track_motion_dir[2] = 0.0;
86 double cos_theta = 0.994;
87 if (!track_motion_dir.head(2).isZero() &&
88 !anchor_point_shift_dir.head(2).isZero()) {
91 cos_theta = algorithm::CalculateCosTheta2DXY<float>(track_motion_dir,
92 anchor_point_shift_dir);
94 float direction_dist =
static_cast<float>(-cos_theta) + 1.0f;
96 return direction_dist;
100 const Eigen::VectorXf& track_predict,
102 const double time_diff) {
106 Eigen::Vector3f old_bbox_dir = last_object->output_direction.cast<
float>();
107 Eigen::Vector3f new_bbox_dir = new_object->direction.cast<
float>();
108 Eigen::Vector3f old_bbox_size = last_object->output_size.cast<
float>();
109 Eigen::Vector3f new_bbox_size = new_object->size.cast<
float>();
111 float size_dist = 0.0f;
112 double dot_val_00 = fabs(old_bbox_dir(0) * new_bbox_dir(0) +
113 old_bbox_dir(1) * new_bbox_dir(1));
114 double dot_val_01 = fabs(old_bbox_dir(0) * new_bbox_dir(1) -
115 old_bbox_dir(1) * new_bbox_dir(0));
116 float temp_val_0 = 0.0f;
117 float temp_val_1 = 0.0f;
118 if (dot_val_00 > dot_val_01) {
119 temp_val_0 =
static_cast<float>(fabs(old_bbox_size(0) - new_bbox_size(0))) /
120 std::max(old_bbox_size(0), new_bbox_size(0));
121 temp_val_1 =
static_cast<float>(fabs(old_bbox_size(1) - new_bbox_size(1))) /
122 std::max(old_bbox_size(1), new_bbox_size(1));
123 size_dist = std::min(temp_val_0, temp_val_1);
125 temp_val_0 =
static_cast<float>(fabs(old_bbox_size(0) - new_bbox_size(1))) /
126 std::max(old_bbox_size(0), new_bbox_size(1));
127 temp_val_1 =
static_cast<float>(fabs(old_bbox_size(1) - new_bbox_size(0))) /
128 std::max(old_bbox_size(1), new_bbox_size(0));
129 size_dist = std::min(temp_val_0, temp_val_1);
155 const Eigen::VectorXf& track_predict,
157 const double time_diff) {
161 const std::vector<float>& old_object_shape_features =
162 last_object->shape_features;
163 const std::vector<float>& new_object_shape_features =
164 new_object->shape_features;
166 if (old_object_shape_features.size() != new_object_shape_features.size()) {
167 AINFO <<
"sizes of compared features not matched. TrackObjectDistance";
171 float histogram_dist = 0.0f;
172 for (
size_t i = 0; i < old_object_shape_features.size(); ++i) {
174 std::fabs(old_object_shape_features[i] - new_object_shape_features[i]);
177 return histogram_dist;
191 const Eigen::VectorXf& track_predict,
193 const double time_diff,
double match_threshold) {
196 Eigen::Vector3f old_dir = last_object->output_direction.cast<
float>();
197 Eigen::Vector3f old_size = last_object->output_size.cast<
float>();
198 Eigen::Vector3d old_center = last_object->output_center;
199 Eigen::Vector3f new_dir = new_object->direction.cast<
float>();
200 Eigen::Vector3f new_size = new_object->size.cast<
float>();
201 Eigen::Vector3d new_center = new_object->center;
205 old_size(0) = old_size(0) > 0.3f ? old_size(0) : 0.3f;
206 old_size(1) = old_size(1) > 0.3f ? old_size(1) : 0.3f;
207 new_size(0) = new_size(0) > 0.3f ? new_size(0) : 0.3f;
208 new_size(1) = new_size(1) > 0.3f ? new_size(1) : 0.3f;
209 int last_object_num_pts =
static_cast<int>(
210 (last_object->object_ptr->radar4d_supplement).cloud_world.size());
211 int cur_obj_num_pts =
static_cast<int>(
212 (new_object->object_ptr->radar4d_supplement).cloud_world.size());
213 bool change_cur_obj_bbox = last_object_num_pts > cur_obj_num_pts;
214 float minimum_edge_length = 0.01f;
216 (new_object->object_ptr->radar4d_supplement).cloud_world;
217 if (change_cur_obj_bbox) {
220 cloud, new_dir, &new_size, &new_center, minimum_edge_length);
224 cloud, old_dir, &old_size, &old_center, minimum_edge_length);
227 Eigen::Matrix2d trans_mat;
228 trans_mat(0, 0) = (old_dir.cast<
double>())(0);
229 trans_mat(0, 1) = (old_dir.cast<
double>())(1);
230 trans_mat(1, 0) = -(old_dir.cast<
double>())(1);
231 trans_mat(1, 1) = (old_dir.cast<
double>())(0);
232 Eigen::Vector2d old_center_transformed_2d =
233 static_cast<Eigen::Matrix<double, 2, 1, 0, 2, 1>
>(trans_mat *
235 Eigen::Vector2d new_center_transformed_2d =
236 static_cast<Eigen::Matrix<double, 2, 1, 0, 2, 1>
>(trans_mat *
238 old_center(0) = old_center_transformed_2d(0);
239 old_center(1) = old_center_transformed_2d(1);
240 new_center(0) = new_center_transformed_2d(0);
241 new_center(1) = new_center_transformed_2d(1);
242 Eigen::Vector3d old_size_tmp = old_size.cast<
double>();
243 Eigen::Vector3d new_size_tmp = new_size.cast<
double>();
244 double iou = algorithm::CalculateIou2DXY<double>(old_center, old_size_tmp,
245 new_center, new_size_tmp);
247 double dist = (1 - iou) * match_threshold;
248 return static_cast<float>(dist);
float BboxIouDistance(const TrackedObjectConstPtr &last_object, const Eigen::VectorXf &track_predict, const TrackedObjectConstPtr &new_object, const double time_diff, double match_threshold)
Compute bbox iou distance for object and background match