Skip to content

Commit 8afcbed

Browse files
committedFeb 1, 2024
feat: replace measurements label when size is not proper
Signed-off-by: yoshiri <yoshiyoshidetteiu@gmail.com>
1 parent ae3e758 commit 8afcbed

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed
 

‎perception/multi_object_tracker/include/multi_object_tracker/data_association/data_association.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ class DataAssociation
5454
void assign(
5555
const Eigen::MatrixXd & src, std::unordered_map<int, int> & direct_assignment,
5656
std::unordered_map<int, int> & reverse_assignment);
57+
void filterMeasurementsBySize(
58+
const autoware_auto_perception_msgs::msg::DetectedObjects & measurements,
59+
autoware_auto_perception_msgs::msg::DetectedObjects & filtered_measurements,
60+
autoware_auto_perception_msgs::msg::DetectedObjects & unexpected_measurements);
5761
Eigen::MatrixXd calcScoreMatrix(
5862
const autoware_auto_perception_msgs::msg::DetectedObjects & measurements,
5963
const std::list<std::shared_ptr<Tracker>> & trackers);

‎perception/multi_object_tracker/src/data_association/data_association.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,47 @@ void DataAssociation::assign(
146146
}
147147
}
148148

149+
/**
150+
* @brief filter measurements by its size, large/small objects are converted to UNKNOWN
151+
*
152+
* @param measurements
153+
* @param filtered_measurements
154+
* @param unexpected_measurements
155+
*/
156+
void DataAssociation::filterMeasurementsBySize(
157+
const autoware_auto_perception_msgs::msg::DetectedObjects & measurements,
158+
autoware_auto_perception_msgs::msg::DetectedObjects & filtered_measurements,
159+
autoware_auto_perception_msgs::msg::DetectedObjects & unexpected_measurements)
160+
{
161+
// copy header
162+
filtered_measurements.header = measurements.header;
163+
unexpected_measurements.header = measurements.header;
164+
filtered_measurements.objects.clear();
165+
unexpected_measurements.objects.clear();
166+
167+
// filter objects by its size
168+
const double max_unknown_area = max_area_matrix_(0, 0);
169+
const double min_unknown_area = min_area_matrix_(0, 0);
170+
const auto unknown_classifications =
171+
object_recognition_utils::toObjectClassifications("UNKNOWN", 1.0); // for label replace
172+
for (const auto & measurement : measurements.objects) {
173+
const std::uint8_t measurement_label =
174+
object_recognition_utils::getHighestProbLabel(measurement.classification);
175+
const double area = tier4_autoware_utils::getArea(measurement.shape);
176+
const double max_area = max_area_matrix_(measurement_label, measurement_label);
177+
const double min_area = min_area_matrix_(measurement_label, measurement_label);
178+
if (area > min_area && max_area > area) {
179+
filtered_measurements.objects.push_back(measurement);
180+
} else if (area > min_unknown_area && max_unknown_area > area) {
181+
auto label_fixed_measurement = measurement;
182+
label_fixed_measurement.classification = unknown_classifications;
183+
filtered_measurements.objects.push_back(label_fixed_measurement);
184+
} else {
185+
unexpected_measurements.objects.push_back(measurement);
186+
}
187+
}
188+
}
189+
149190
Eigen::MatrixXd DataAssociation::calcScoreMatrix(
150191
const autoware_auto_perception_msgs::msg::DetectedObjects & measurements,
151192
const std::list<std::shared_ptr<Tracker>> & trackers)

‎perception/multi_object_tracker/src/multi_object_tracker_core.cpp

+10-4
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,16 @@ void MultiObjectTracker::onMeasurement(
261261
(*itr)->predict(measurement_time);
262262
}
263263

264+
/* filter by objects size before association */
265+
autoware_auto_perception_msgs::msg::DetectedObjects filtered_objects;
266+
autoware_auto_perception_msgs::msg::DetectedObjects unexpected_objects;
267+
data_association_->filterMeasurementsBySize(
268+
transformed_objects, filtered_objects, unexpected_objects);
269+
264270
/* global nearest neighbor */
265271
std::unordered_map<int, int> direct_assignment, reverse_assignment;
266272
Eigen::MatrixXd score_matrix = data_association_->calcScoreMatrix(
267-
transformed_objects, list_tracker_); // row : tracker, col : measurement
273+
filtered_objects, list_tracker_); // row : tracker, col : measurement
268274
data_association_->assign(score_matrix, direct_assignment, reverse_assignment);
269275

270276
/* tracker measurement update */
@@ -274,7 +280,7 @@ void MultiObjectTracker::onMeasurement(
274280
if (direct_assignment.find(tracker_idx) != direct_assignment.end()) { // found
275281
(*(tracker_itr))
276282
->updateWithMeasurement(
277-
transformed_objects.objects.at(direct_assignment.find(tracker_idx)->second),
283+
filtered_objects.objects.at(direct_assignment.find(tracker_idx)->second),
278284
measurement_time, *self_transform);
279285
} else { // not found
280286
(*(tracker_itr))->updateWithoutMeasurement();
@@ -287,12 +293,12 @@ void MultiObjectTracker::onMeasurement(
287293
sanitizeTracker(list_tracker_, measurement_time);
288294

289295
/* new tracker */
290-
for (size_t i = 0; i < transformed_objects.objects.size(); ++i) {
296+
for (size_t i = 0; i < filtered_objects.objects.size(); ++i) {
291297
if (reverse_assignment.find(i) != reverse_assignment.end()) { // found
292298
continue;
293299
}
294300
std::shared_ptr<Tracker> tracker =
295-
createNewTracker(transformed_objects.objects.at(i), measurement_time, *self_transform);
301+
createNewTracker(filtered_objects.objects.at(i), measurement_time, *self_transform);
296302
if (tracker) list_tracker_.push_back(tracker);
297303
}
298304

0 commit comments

Comments
 (0)