21#include "Eigen/Geometry"
23#include "modules/perception/lidar_tracking/tracker/multi_lidar_fusion/proto/multi_lidar_fusion_config.pb.h"
44 std::string config_file =
78 object->latest_tracked_time = frame->
timestamp;
101 bool is_main_sensor = algorithm::SensorManager::Instance()->IsMainSensor(
103 if (is_main_sensor) {
112 if (is_main_sensor) {
122 if (roi ==
nullptr ||
123 (roi->road_polygons.empty() && roi->junction_polygons.empty() &&
124 roi->road_boundary.empty())) {
127 <<
" at timestamp: " << frame->
timestamp;
130 std::stringstream sstr;
131 sstr <<
"Set objects velocity to zero. track_id: ";
142 obj->velocity = Eigen::Vector3f::Zero();
143 obj->acceleration = Eigen::Vector3f::Zero();
144 sstr << obj->track_id <<
", ";
150 <<
" at timestamp: " << std::to_string(frame->
timestamp);
155 const std::vector<base::ObjectPtr>& objects,
157 std::vector<TrackedObjectPtr> tracked_objects;
161 for (
size_t i = 0; i < objects.size(); ++i) {
162 double tracked_time = objects[i]->latest_tracked_time;
170 if (!objects[i]->lidar_supplement.is_clustered &&
173 tracked_objects[i]->ComputeShapeFeatures();
176 if (!objects[i]->lidar_supplement.is_clustered) {
183 AINFO <<
"MlfEngine: " << sensor_info.
name
190 const std::vector<TrackedObjectPtr>& objects,
const std::string& name,
191 std::vector<MlfTrackDataPtr>* tracks) {
192 std::vector<std::pair<size_t, size_t>> assignments;
193 std::vector<size_t> unassigned_tracks;
194 std::vector<size_t> unassigned_objects;
195 matcher_->Match(match_options, objects, *tracks, &assignments,
196 &unassigned_tracks, &unassigned_objects);
197 AINFO <<
"MlfEngine: " + name +
" assignments " << assignments.size()
198 <<
" unassigned_tracks " << unassigned_tracks.size()
199 <<
" unassigned_objects " << unassigned_objects.size();
201 for (
auto& pair : assignments) {
202 const size_t track_id = pair.first;
203 const size_t object_id = pair.second;
204 tracks->at(track_id)->PushTrackedObjectToCache(objects[object_id]);
207 for (
auto&
id : unassigned_objects) {
209 tracker_->InitializeTrack(track_data, objects[
id]);
210 tracks->push_back(track_data);
215 double frame_timestamp) {
216 std::vector<TrackedObjectPtr> objects;
217 for (
auto& track_data : tracks) {
218 track_data->GetAndCleanCachedObjectsInTimeInterval(&objects);
219 for (
auto& obj : objects) {
220 tracker_->UpdateTrackDataWithObject(track_data, obj);
222 if (objects.empty()) {
223 tracker_->UpdateTrackDataWithoutObject(frame_timestamp, track_data);
230 tracked_objects.clear();
233 base::ObjectPool::Instance().BatchGet(num_objects, &tracked_objects);
235 size_t num_predict = 0;
236 size_t num_delay_output = 0;
237 size_t num_front_critical_reserve = 0;
238 size_t num_blind_trafficcone = 0;
239 auto collect = [&](std::vector<MlfTrackDataPtr>* tracks) {
240 for (
auto& track_data : *tracks) {
253 if (track_data->is_front_critical_track_) {
254 ADEBUG <<
"[DelayOutput] track_id: " << track_data->track_id_
255 <<
" time is " << std::to_string(frame->
timestamp)
261 track_data->is_reserve_blind_cone_ =
false;
263 if (!track_data->is_current_state_predicted_) {
265 frame->
timestamp, tracked_objects[pos],
true)) {
266 AERROR <<
"Tracking failed";
270 ADEBUG <<
"track_id: " << track_data->track_id_
271 <<
" detetcted, obj-time is "
272 << std::to_string(frame->
timestamp) <<
" and output";
278 frame->
timestamp, tracked_objects[pos],
true)) {
279 AERROR <<
"Tracking failed";
288 track_data->GetLatestObject().second;
290 if (latest_object !=
nullptr &&
291 track_data->is_front_critical_track_ &&
292 latest_object->output_velocity.head<2>().norm() < 0.01 &&
295 ++num_front_critical_reserve;
296 AINFO <<
"track_id: " << track_data->track_id_
297 <<
" missed, obj-time is "
298 << std::to_string(track_data->GetLatestObject().first)
299 <<
" and predict output";
301 frame->
timestamp, tracked_objects[pos],
false)) {
302 AERROR <<
"Tracking failed";
310 ++num_blind_trafficcone;
312 frame->
timestamp, tracked_objects[pos],
false)) {
313 AERROR <<
"Tracking failed";
316 track_data->is_reserve_blind_cone_ =
true;
330 AINFO <<
"MlfEngine, num_predict: " << num_predict
331 <<
" num delay_output: " << num_delay_output
332 <<
" num front_critical: " << num_front_critical_reserve
333 <<
" num blind trafficcone: " << num_blind_trafficcone
334 <<
" num_objects: " << num_objects;
335 if (num_predict > num_objects) {
336 AERROR <<
"num_predict > num_objects";
339 tracked_objects.resize(num_objects - num_predict - num_delay_output);
343 std::vector<MlfTrackDataPtr>* tracks) {
345 for (
size_t i = 0; i < tracks->size(); ++i) {
347 if (tracks->at(i)->is_front_critical_track_ &&
351 if (tracks->at(i)->latest_visible_time_ + reserve_time >= timestamp ||
352 tracks->at(i)->is_reserve_blind_cone_) {
354 tracks->at(pos) = tracks->at(i);
359 AINFO <<
"MlfEngine: " << name <<
" remove stale tracks, from "
360 << tracks->size() <<
" to " << pos;
367 if (foreground_log && !obj->lidar_supplement.is_background) {
370 if (!foreground_log && obj->lidar_supplement.is_background) {
374 std::stringstream ssstr;
375 if (foreground_log) {
376 ssstr <<
"[Foreground-objects] timestamp: "
377 << std::to_string(frame->
timestamp) <<
" objs: " << objcnt
380 ssstr <<
"[Background-objects] timestamp: "
381 << std::to_string(frame->
timestamp) <<
" objs: " << objcnt
385 if (foreground_log && obj->lidar_supplement.is_background) {
388 if (!foreground_log && !obj->lidar_supplement.is_background) {
391 ssstr <<
"id = " << obj->id <<
": " << obj->center(0) <<
", "
392 << obj->center(1) <<
", " << obj->center(2) <<
", "
393 << obj->size(0) <<
", " << obj->size(1) <<
", "
394 << obj->size(2) <<
", " << obj->theta <<
", "
395 <<
static_cast<int>(obj->type) << std::endl;
397 AINFO << ssstr.str();
401 std::stringstream sstr;
402 sstr <<
"[This frame TrackDataDebugInfo]: timestamp: "
403 << std::to_string(frame->
timestamp) <<
" tracks: "
420 auto debug_info = [&](std::vector<MlfTrackDataPtr>* tracks) {
421 for (
auto& track_data : *tracks) {
423 track_data->GetLatestObject().second;
424 sstr <<
" track_id = " << track_data->track_id_ <<
": "
425 << latest_obj->center(0) <<
", " << latest_obj->center(1)
426 <<
", " << latest_obj->center(2) <<
", "
427 << latest_obj->size(0) <<
", " << latest_obj->size(1) <<
", "
428 << latest_obj->size(2) <<
", "
429 << latest_obj->output_direction(0) <<
", "
430 << latest_obj->output_direction(1) <<
", "
431 << latest_obj->output_direction(2) <<
", "
432 <<
static_cast<int>(latest_obj->type) <<
", "
433 << std::to_string(latest_obj->object_ptr->latest_tracked_time)
void BatchGet(size_t num, std::vector< std::shared_ptr< ObjectType > > *data) override
static ConcurrentObjectPool & Instance()
std::shared_ptr< ObjectType > Get() override
std::unique_ptr< MlfTracker > tracker_
std::vector< MlfTrackDataPtr > foreground_track_data_
double reserved_invisible_time_
bool use_histogram_for_match_
void RemoveStaleTrackData(const std::string &name, double timestamp, std::vector< MlfTrackDataPtr > *tracks)
Remove stale track data for memory management
void TrackDebugInfo(LidarFrame *frame)
bool Track(const MultiTargetTrackerOptions &options, LidarFrame *frame) override
Track segmented objects from multiple lidar sensors
std::unique_ptr< MlfTrackObjectMatcher > matcher_
Eigen::Vector3d global_to_local_offset_
std::vector< TrackedObjectPtr > foreground_objects_
void Clear()
Clear all data
void SplitAndTransformToTrackedObjects(const std::vector< base::ObjectPtr > &objects, const base::SensorInfo &sensor_info, double frame_timestamp)
Split foreground/background objects and attach to tracked objects
bool use_frame_timestamp_
std::vector< MlfTrackDataPtr > background_track_data_
void ObjectsDebugInfo(LidarFrame *frame, bool foreground_log=true)
Output object-detection-model results and latest track results
void TrackObjectMatchAndAssign(const MlfTrackObjectMatcherOptions &match_options, const std::vector< TrackedObjectPtr > &objects, const std::string &name, std::vector< MlfTrackDataPtr > *tracks)
Match tracks and objets and object-track assignment
size_t histogram_bin_size_
bool output_predict_objects_
void TrackStateFilter(const std::vector< MlfTrackDataPtr > &tracks, double frame_timestamp)
Filter tracks
std::vector< TrackedObjectPtr > background_objects_
bool Init(const MultiTargetTrackerInitOptions &options=MultiTargetTrackerInitOptions()) override
Init mlf engine
void CollectTrackedResult(LidarFrame *frame)
Collect track results and store in frame tracked objects
Eigen::Affine3d sensor_to_local_pose_
bool merge_foreground_background_
#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,...
bool IsObjectInRoi(const HdmapStructConstPtr roi, const ObjectConstPtr obj)
std::shared_ptr< const TrackedObject > TrackedObjectConstPtr
std::shared_ptr< MlfTrackData > MlfTrackDataPtr
bool JudgeBlindTrafficCone(const MlfTrackDataConstPtr &track_data, double frame_timestamp, const Eigen::Vector3d &local_to_global_offset, Eigen::Affine3d &lidar2world_pose, Eigen::Affine3d &lidar2novatel_pose)
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
base::SensorInfo sensor_info
Eigen::Affine3d lidar2world_pose
std::shared_ptr< base::HdmapStruct > hdmap_struct
std::vector< std::shared_ptr< base::Object > > segmented_objects
Eigen::Affine3d lidar2novatel_extrinsics
std::vector< std::shared_ptr< base::Object > > tracked_objects
optional double delay_time_output
optional double reserved_invisible_time
optional uint32 histogram_bin_size
optional bool merge_foreground_background
optional uint32 pub_track_times
optional bool use_frame_timestamp
optional bool output_predict_objects
optional bool use_histogram_for_match
optional bool print_debug_log