20#include "Eigen/Geometry"
22#include "modules/common_msgs/localization_msgs/localization.pb.h"
23#include "modules/common_msgs/prediction_msgs/feature.pb.h"
24#include "modules/perception/radar4d_detection/lib/tracker/multi_radar_fusion/proto/mrf_config.pb.h"
52 for (
int i = 0; i < config.main_sensor_size(); ++i) {
84 object->latest_tracked_time = frame->
timestamp;
103 bool is_main_sensor =
105 if (is_main_sensor) {
111 if (is_main_sensor) {
120 <<
" at timestamp: " << frame->
timestamp;
125 const std::vector<base::ObjectPtr>& objects,
127 std::vector<TrackedObjectPtr> tracked_objects;
131 for (
size_t i = 0; i < objects.size(); ++i) {
134 if (!objects[i]->radar4d_supplement.is_background &&
137 tracked_objects[i]->ComputeShapeFeatures();
139 if (objects[i]->radar4d_supplement.is_background) {
145 AINFO <<
"MrfEngine: " << sensor_info.
name
152 const std::vector<TrackedObjectPtr>& objects,
const std::string& name,
153 std::vector<MrfTrackDataPtr>* tracks) {
154 std::vector<std::pair<size_t, size_t>> assignments;
155 std::vector<size_t> unassigned_tracks;
156 std::vector<size_t> unassigned_objects;
157 matcher_->Match(match_options, objects, *tracks, &assignments,
158 &unassigned_tracks, &unassigned_objects);
159 AINFO <<
"MrfEngine: " + name +
" assignments " << assignments.size()
160 <<
" unassigned_tracks " << unassigned_tracks.size()
161 <<
" unassigned_objects " << unassigned_objects.size();
163 for (
auto& pair : assignments) {
164 const size_t track_id = pair.first;
165 const size_t object_id = pair.second;
166 tracks->at(track_id)->PushTrackedObjectToCache(objects[object_id]);
169 for (
auto&
id : unassigned_objects) {
171 tracker_->InitializeTrack(track_data, objects[
id]);
172 tracks->push_back(track_data);
177 double frame_timestamp) {
178 std::vector<TrackedObjectPtr> objects;
179 for (
auto& track_data : tracks) {
180 track_data->GetAndCleanCachedObjectsInTimeInterval(&objects);
181 for (
auto& obj : objects) {
182 tracker_->UpdateTrackDataWithObject(track_data, obj);
184 if (objects.empty()) {
185 tracker_->UpdateTrackDataWithoutObject(frame_timestamp, track_data);
192 ADEBUG <<
"translation x y z " << pose.translation()[0] <<
" "
193 << pose.translation()[1] <<
" " << pose.translation()[2];
194 localization->mutable_pose()->mutable_position()->set_x(
195 pose.translation()[0]);
196 localization->mutable_pose()->mutable_position()->set_y(
197 pose.translation()[1]);
198 localization->mutable_pose()->mutable_position()->set_z(
199 pose.translation()[2]);
200 Eigen::Quaterniond p(pose.rotation());
201 localization->mutable_pose()->mutable_orientation()->set_qx(p.x());
202 localization->mutable_pose()->mutable_orientation()->set_qy(p.y());
203 localization->mutable_pose()->mutable_orientation()->set_qz(p.z());
204 localization->mutable_pose()->mutable_orientation()->set_qw(p.w());
245 tracked_objects.clear();
248 base::ObjectPool::Instance().BatchGet(num_objects, &tracked_objects);
250 size_t num_predict = 0;
251 auto collect = [&](std::vector<MrfTrackDataPtr>* tracks) {
252 for (
auto& track_data : *tracks) {
257 tracked_objects[pos])) {
258 AERROR <<
"Tracking failed";
295 if (num_predict != 0) {
296 AINFO <<
"MrfEngine, num_predict: " << num_predict
297 <<
" num_objects: " << num_objects;
298 if (num_predict > num_objects) {
299 AERROR <<
"num_predict > num_objects";
302 tracked_objects.resize(num_objects - num_predict);
307 std::vector<MrfTrackDataPtr>* tracks) {
309 for (
size_t i = 0; i < tracks->size(); ++i) {
313 tracks->at(pos) = tracks->at(i);
318 AINFO <<
"MrfEngine: " << name <<
" remove stale tracks, from "
319 << tracks->size() <<
" to " << pos;
void BatchGet(size_t num, std::vector< std::shared_ptr< ObjectType > > *data) override
static ConcurrentObjectPool & Instance()
std::shared_ptr< ObjectType > Get() override
void SplitAndTransformToTrackedObjects(const std::vector< base::ObjectPtr > &objects, const base::SensorInfo &sensor_info)
Split foreground/background objects and attach to tracked objects
Eigen::Affine3d sensor_to_local_pose_
bool use_frame_timestamp_
void TrackObjectMatchAndAssign(const MrfTrackObjectMatcherOptions &match_options, const std::vector< TrackedObjectPtr > &objects, const std::string &name, std::vector< MrfTrackDataPtr > *tracks)
Match tracks and objets and object-track assignment
Eigen::Vector3d global_to_local_offset_
std::vector< TrackedObjectPtr > foreground_objects_
std::set< std::string > main_sensors_
std::unique_ptr< MrfTracker > tracker_
std::vector< TrackedObjectPtr > background_objects_
bool Track(const MultiTargetTrackerOptions &options, RadarFrame *frame) override
Track segmented objects from multiple radar sensors
void Clear()
Clear all data
std::vector< MrfTrackDataPtr > background_track_data_
double reserved_invisible_time_
void CollectTrackedResult(RadarFrame *frame)
Collect track results and store in frame tracked objects
bool use_histogram_for_match_
size_t histogram_bin_size_
void TrackStateFilter(const std::vector< MrfTrackDataPtr > &tracks, double frame_timestamp)
Filter tracks
void RemoveStaleTrackData(const std::string &name, double timestamp, std::vector< MrfTrackDataPtr > *tracks)
Remove stale track data for memory management
std::unique_ptr< MrfTrackObjectMatcher > matcher_
std::vector< MrfTrackDataPtr > foreground_track_data_
bool Init(const MultiTargetTrackerInitOptions &options=MultiTargetTrackerInitOptions()) override
Init mrf engine
bool output_predict_objects_
#define PERCEPTION_REGISTER_MULTITARGET_TRACKER(name)
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< MrfTrackData > MrfTrackDataPtr
void convertPoseToLoc(const Eigen::Affine3d &pose, localization::LocalizationEstimate *localization)
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
optional bool use_frame_timestamp
optional bool use_histogram_for_match
optional bool output_predict_objects
optional double reserved_invisible_time
optional uint32 histogram_bin_size
repeated string main_sensor
std::vector< std::shared_ptr< base::Object > > tracked_objects
std::vector< std::shared_ptr< base::Object > > segmented_objects
base::SensorInfo sensor_info
Eigen::Affine3d radar2world_pose