Associate the obstacles measured by the sensor with the obstacles tracked in current scene
49 {
50 const std::vector<SensorObjectPtr>& sensor_objects =
51 sensor_measurements->GetForegroundObjects();
52 const std::vector<TrackPtr>& fusion_tracks = scene->GetForegroundTracks();
53 std::vector<std::vector<double>> association_mat;
54
55 if (fusion_tracks.empty() || sensor_objects.empty()) {
56 association_result->unassigned_tracks.resize(fusion_tracks.size());
57 association_result->unassigned_measurements.resize(sensor_objects.size());
58 std::iota(association_result->unassigned_tracks.begin(),
59 association_result->unassigned_tracks.end(), 0);
60 std::iota(association_result->unassigned_measurements.begin(),
61 association_result->unassigned_measurements.end(), 0);
62 return true;
63 }
64
65 std::string measurement_sensor_id = sensor_objects[0]->GetSensorId();
66 double measurement_timestamp = sensor_objects[0]->GetTimestamp();
68 measurement_timestamp);
69 bool do_nothing = (measurement_sensor_id == "radar_front" ||
70 measurement_sensor_id == "radar_rear");
71 IdAssign(fusion_tracks, sensor_objects, &association_result->assignments,
72 &association_result->unassigned_tracks,
73 &association_result->unassigned_measurements, do_nothing, false);
74
75 Eigen::Affine3d pose;
76 sensor_measurements->GetPose(&pose);
77 Eigen::Vector3d ref_point = pose.translation();
78
79 ADEBUG <<
"association_measurement_timestamp@" << measurement_timestamp;
80 ComputeAssociationDistanceMat(fusion_tracks, sensor_objects, ref_point,
81 association_result->unassigned_tracks,
82 association_result->unassigned_measurements,
83 &association_mat);
84
85 int num_track = static_cast<int>(fusion_tracks.size());
86 int num_measurement = static_cast<int>(sensor_objects.size());
87 association_result->track2measurements_dist.assign(num_track, 0);
88 association_result->measurement2track_dist.assign(num_measurement, 0);
89 std::vector<int> track_ind_g2l;
90 track_ind_g2l.resize(num_track, -1);
91 for (size_t i = 0; i < association_result->unassigned_tracks.size(); ++i) {
92 track_ind_g2l[association_result->unassigned_tracks[i]] =
93 static_cast<int>(i);
94 }
95 std::vector<int> measurement_ind_g2l;
96 measurement_ind_g2l.resize(num_measurement, -1);
97 std::vector<size_t> measurement_ind_l2g =
98 association_result->unassigned_measurements;
99 for (size_t i = 0; i < association_result->unassigned_measurements.size();
100 ++i) {
101 measurement_ind_g2l[association_result->unassigned_measurements[i]] =
102 static_cast<int>(i);
103 }
104 std::vector<size_t> track_ind_l2g = association_result->unassigned_tracks;
105
106 if (association_result->unassigned_tracks.empty() ||
107 association_result->unassigned_measurements.empty()) {
108 return true;
109 }
110
111 bool state = MinimizeAssignment(
112 association_mat, track_ind_l2g, measurement_ind_l2g,
113 &association_result->assignments, &association_result->unassigned_tracks,
114 &association_result->unassigned_measurements);
115
116
117 std::vector<TrackMeasurmentPair> post_assignments;
118 PostIdAssign(fusion_tracks, sensor_objects,
119 association_result->unassigned_tracks,
120 association_result->unassigned_measurements, &post_assignments);
121 association_result->assignments.insert(association_result->assignments.end(),
122 post_assignments.begin(),
123 post_assignments.end());
124
125 GenerateUnassignedData(fusion_tracks.size(), sensor_objects.size(),
126 association_result->assignments,
127 &association_result->unassigned_tracks,
128 &association_result->unassigned_measurements);
129
130 ComputeDistance(fusion_tracks, sensor_objects,
131 association_result->unassigned_tracks, track_ind_g2l,
132 measurement_ind_g2l, measurement_ind_l2g, association_mat,
133 association_result);
134
135 AINFO <<
"association: measurement_num = " << sensor_objects.size()
136 << ", track_num = " << fusion_tracks.size()
137 << ", assignments = " << association_result->assignments.size()
138 << ", unassigned_tracks = "
139 << association_result->unassigned_tracks.size()
140 << ", unassigned_measuremnets = "
141 << association_result->unassigned_measurements.size();
142
143 return state;
144}
void ResetProjectionCache(std::string sensor_id, double timestamp)