21#include "modules/perception/radar_detection/proto/matcher_config.pb.h"
33 std::string config_file =
37 <<
"Failed to parse MatcherConfig config file.";
56 std::vector<TrackObjectPair> *assignments,
57 std::vector<size_t> *unassigned_tracks,
58 std::vector<size_t> *unassigned_objects) {
59 IDMatch(radar_tracks, radar_frame, assignments, unassigned_tracks,
61 TrackObjectPropertyMatch(radar_tracks, radar_frame, assignments,
62 unassigned_tracks, unassigned_objects);
67 double track_timestamp,
69 double radar_timestamp) {
70 double dist = 0.5 * DistanceBetweenObs(track_object, track_timestamp,
71 radar_object, radar_timestamp) +
72 0.5 * DistanceBetweenObs(radar_object, radar_timestamp,
73 track_object, track_timestamp);
78void HMMatcher::TrackObjectPropertyMatch(
79 const std::vector<RadarTrackPtr> &radar_tracks,
80 const base::Frame &radar_frame, std::vector<TrackObjectPair> *assignments,
81 std::vector<size_t> *unassigned_tracks,
82 std::vector<size_t> *unassigned_objects) {
83 if (unassigned_tracks->empty() || unassigned_objects->empty()) {
86 std::vector<std::vector<double>> association_mat(unassigned_tracks->size());
87 for (
size_t i = 0; i < association_mat.size(); ++i) {
88 association_mat[i].resize(unassigned_objects->size(), 0);
90 ComputeAssociationMat(radar_tracks, radar_frame, *unassigned_tracks,
91 *unassigned_objects, &association_mat);
94 algorithm::SecureMat<double> *global_costs =
96 global_costs->
Resize(unassigned_tracks->size(), unassigned_objects->size());
97 for (
size_t i = 0; i < unassigned_tracks->size(); ++i) {
98 for (
size_t j = 0; j < unassigned_objects->size(); ++j) {
99 (*global_costs)(i, j) = association_mat[i][j];
102 std::vector<TrackObjectPair> property_assignments;
103 std::vector<size_t> property_unassigned_tracks;
104 std::vector<size_t> property_unassigned_objects;
105 hungarian_matcher_.
Match(
108 &property_assignments, &property_unassigned_tracks,
109 &property_unassigned_objects);
111 for (
size_t i = 0; i < property_assignments.size(); ++i) {
112 size_t gt_idx = unassigned_tracks->at(property_assignments[i].first);
113 size_t go_idx = unassigned_objects->at(property_assignments[i].second);
114 assignments->push_back(std::pair<size_t, size_t>(gt_idx, go_idx));
116 std::vector<size_t> temp_unassigned_tracks;
117 std::vector<size_t> temp_unassigned_objects;
118 for (
size_t i = 0; i < property_unassigned_tracks.size(); ++i) {
119 size_t gt_idx = unassigned_tracks->at(property_unassigned_tracks[i]);
120 temp_unassigned_tracks.push_back(gt_idx);
122 for (
size_t i = 0; i < property_unassigned_objects.size(); ++i) {
123 size_t go_idx = unassigned_objects->at(property_unassigned_objects[i]);
124 temp_unassigned_objects.push_back(go_idx);
126 *unassigned_tracks = temp_unassigned_tracks;
127 *unassigned_objects = temp_unassigned_objects;
130void HMMatcher::ComputeAssociationMat(
131 const std::vector<RadarTrackPtr> &radar_tracks,
132 const base::Frame &radar_frame,
133 const std::vector<size_t> &unassigned_tracks,
134 const std::vector<size_t> &unassigned_objects,
135 std::vector<std::vector<double>> *association_mat) {
136 double frame_timestamp = radar_frame.timestamp;
137 for (
size_t i = 0; i < unassigned_tracks.size(); ++i) {
138 for (
size_t j = 0; j < unassigned_objects.size(); ++j) {
140 radar_tracks[unassigned_tracks[i]]->GetObs();
142 radar_frame.objects[unassigned_objects[j]];
143 double track_timestamp =
144 radar_tracks[unassigned_tracks[i]]->GetTimestamp();
145 double distance_forward = DistanceBetweenObs(
146 track_object, track_timestamp, frame_object, frame_timestamp);
147 double distance_backward = DistanceBetweenObs(
148 frame_object, frame_timestamp, track_object, track_timestamp);
149 association_mat->at(i).at(j) =
150 0.5 * distance_forward + 0.5 * distance_backward;
159 double time_diff = timestamp2 - timestamp1;
160 return (obs2->center - obs1->center -
161 obs1->velocity.cast<
double>() * time_diff)
#define PERCEPTION_REGISTER_MATCHER(name)
SecureMat< T > * mutable_global_costs()
void Match(T cost_thresh, OptimizeFlag opt_flag, std::vector< std::pair< size_t, size_t > > *assignments, std::vector< size_t > *unassigned_rows, std::vector< size_t > *unassigned_cols)
void Resize(const size_t resize_height, const size_t resize_width)
virtual void IDMatch(const std::vector< RadarTrackPtr > &radar_tracks, const base::Frame &radar_frame, std::vector< TrackObjectPair > *assignments, std::vector< size_t > *unassigned_tracks, std::vector< size_t > *unassigned_objects)
Target association by id.
static void SetBoundMatchDistance(double dist)
Set the Bound Match Distance
static double GetBoundMatchDistance()
Get the Bound Match Distance
static double GetMaxMatchDistance()
Get the Max Match Distance
static void SetMaxMatchDistance(double dist)
Set the Max Match Distance
bool Init(const MatcherInitOptions &options) override
Init HMMatcher config
bool Match(const std::vector< RadarTrackPtr > &radar_tracks, const base::Frame &radar_frame, const TrackObjectMatcherOptions &options, std::vector< TrackObjectPair > *assignments, std::vector< size_t > *unassigned_tracks, std::vector< size_t > *unassigned_objects) override
match radar objects to tracks
bool RefinedTrack(const base::ObjectPtr &track_object, double track_timestamp, const base::ObjectPtr &radar_object, double radar_timestamp) override
After the IDMatch, then track targets based on their features.
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
std::shared_ptr< Object > ObjectPtr
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
optional double max_match_distance
optional double bound_match_distance