Skip to content

Commit 8bb0241

Browse files
committed
feat: replace measurements label when size is not proper
Signed-off-by: yoshiri <yoshiyoshidetteiu@gmail.com>
1 parent 705a70d commit 8bb0241

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
@@ -256,10 +256,16 @@ void MultiObjectTracker::onMeasurement(
256256
(*itr)->predict(measurement_time);
257257
}
258258

259+
/* filter by objects size before association */
260+
autoware_auto_perception_msgs::msg::DetectedObjects filtered_objects;
261+
autoware_auto_perception_msgs::msg::DetectedObjects unexpected_objects;
262+
data_association_->filterMeasurementsBySize(
263+
transformed_objects, filtered_objects, unexpected_objects);
264+
259265
/* global nearest neighbor */
260266
std::unordered_map<int, int> direct_assignment, reverse_assignment;
261267
Eigen::MatrixXd score_matrix = data_association_->calcScoreMatrix(
262-
transformed_objects, list_tracker_); // row : tracker, col : measurement
268+
filtered_objects, list_tracker_); // row : tracker, col : measurement
263269
data_association_->assign(score_matrix, direct_assignment, reverse_assignment);
264270

265271
/* tracker measurement update */
@@ -269,7 +275,7 @@ void MultiObjectTracker::onMeasurement(
269275
if (direct_assignment.find(tracker_idx) != direct_assignment.end()) { // found
270276
(*(tracker_itr))
271277
->updateWithMeasurement(
272-
transformed_objects.objects.at(direct_assignment.find(tracker_idx)->second),
278+
filtered_objects.objects.at(direct_assignment.find(tracker_idx)->second),
273279
measurement_time, *self_transform);
274280
} else { // not found
275281
(*(tracker_itr))->updateWithoutMeasurement();
@@ -282,12 +288,12 @@ void MultiObjectTracker::onMeasurement(
282288
sanitizeTracker(list_tracker_, measurement_time);
283289

284290
/* new tracker */
285-
for (size_t i = 0; i < transformed_objects.objects.size(); ++i) {
291+
for (size_t i = 0; i < filtered_objects.objects.size(); ++i) {
286292
if (reverse_assignment.find(i) != reverse_assignment.end()) { // found
287293
continue;
288294
}
289295
std::shared_ptr<Tracker> tracker =
290-
createNewTracker(transformed_objects.objects.at(i), measurement_time, *self_transform);
296+
createNewTracker(filtered_objects.objects.at(i), measurement_time, *self_transform);
291297
if (tracker) list_tracker_.push_back(tracker);
292298
}
293299

0 commit comments

Comments
 (0)