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) {
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 <<
"Object Outside Hdmap. Set velocity to zero. track_id: ";
136 obj->velocity = Eigen::Vector3f::Zero();
137 obj->acceleration = Eigen::Vector3f::Zero();
138 sstr << obj->track_id <<
", ";
144 <<
" at timestamp: " << frame->
timestamp;
149 const std::vector<base::ObjectPtr>& objects,
151 std::vector<TrackedObjectPtr> tracked_objects;
155 for (
size_t i = 0; i < objects.size(); ++i) {
156 double tracked_time = objects[i]->latest_tracked_time;
160 if (!objects[i]->lidar_supplement.is_background &&
163 tracked_objects[i]->ComputeShapeFeatures();
165 if (objects[i]->lidar_supplement.is_background) {
171 AINFO <<
"MlfEngine: " << sensor_info.
name
178 const std::vector<TrackedObjectPtr>& objects,
const std::string& name,
179 std::vector<MlfTrackDataPtr>* tracks) {
180 std::vector<std::pair<size_t, size_t>> assignments;
181 std::vector<size_t> unassigned_tracks;
182 std::vector<size_t> unassigned_objects;
183 matcher_->Match(match_options, objects, *tracks, &assignments,
184 &unassigned_tracks, &unassigned_objects);
185 AINFO <<
"MlfEngine: " + name +
" assignments " << assignments.size()
186 <<
" unassigned_tracks " << unassigned_tracks.size()
187 <<
" unassigned_objects " << unassigned_objects.size();
189 for (
auto& pair : assignments) {
190 const size_t track_id = pair.first;
191 const size_t object_id = pair.second;
192 tracks->at(track_id)->PushTrackedObjectToCache(objects[object_id]);
195 for (
auto&
id : unassigned_objects) {
197 tracker_->InitializeTrack(track_data, objects[
id]);
198 tracks->push_back(track_data);
203 double frame_timestamp) {
204 std::vector<TrackedObjectPtr> objects;
205 for (
auto& track_data : tracks) {
206 track_data->GetAndCleanCachedObjectsInTimeInterval(&objects);
207 for (
auto& obj : objects) {
208 tracker_->UpdateTrackDataWithObject(track_data, obj);
210 if (objects.empty()) {
211 tracker_->UpdateTrackDataWithoutObject(frame_timestamp, track_data);
218 tracked_objects.clear();
221 base::ObjectPool::Instance().BatchGet(num_objects, &tracked_objects);
223 size_t num_predict = 0;
224 size_t num_delay_output = 0;
225 size_t num_front_critical_reserve = 0;
226 size_t num_blind_trafficcone = 0;
227 auto collect = [&](std::vector<MlfTrackDataPtr>* tracks) {
228 for (
auto& track_data : *tracks) {
241 if (track_data->is_front_critical_track_) {
242 ADEBUG <<
"[DelayOutput] track_id: " << track_data->track_id_
243 <<
" time is " << std::to_string(frame->
timestamp)
249 track_data->is_reserve_blind_cone_ =
false;
251 if (!track_data->is_current_state_predicted_) {
253 frame->
timestamp, tracked_objects[pos],
true)) {
254 AERROR <<
"Tracking failed";
258 ADEBUG <<
"track_id: " << track_data->track_id_
259 <<
" detetcted, obj-time is "
260 << std::to_string(frame->
timestamp) <<
" and output";
266 frame->
timestamp, tracked_objects[pos],
true)) {
267 AERROR <<
"Tracking failed";
276 track_data->GetLatestObject().second;
278 if (latest_object !=
nullptr &&
279 track_data->is_front_critical_track_ &&
280 latest_object->output_velocity.head<2>().norm() < 0.01 &&
283 ++num_front_critical_reserve;
284 AINFO <<
"track_id: " << track_data->track_id_
285 <<
" missed, obj-time is "
286 << std::to_string(track_data->GetLatestObject().first)
287 <<
" and predict output";
289 frame->
timestamp, tracked_objects[pos],
false)) {
290 AERROR <<
"Tracking failed";
298 ++num_blind_trafficcone;
300 frame->
timestamp, tracked_objects[pos],
false)) {
301 AERROR <<
"Tracking failed";
304 track_data->is_reserve_blind_cone_ =
true;
318 AINFO <<
"MlfEngine, num_predict: " << num_predict
319 <<
" num delay_output: " << num_delay_output
320 <<
" num front_critical: " << num_front_critical_reserve
321 <<
" num blind trafficcone: " << num_blind_trafficcone
322 <<
" num_objects: " << num_objects;
323 if (num_predict > num_objects) {
324 AERROR <<
"num_predict > num_objects";
327 tracked_objects.resize(num_objects - num_predict - num_delay_output);
331 std::vector<MlfTrackDataPtr>* tracks) {
333 for (
size_t i = 0; i < tracks->size(); ++i) {
335 if (tracks->at(i)->is_front_critical_track_ &&
339 if (tracks->at(i)->latest_visible_time_ + reserve_time >= timestamp ||
340 tracks->at(i)->is_reserve_blind_cone_) {
342 tracks->at(pos) = tracks->at(i);
347 AINFO <<
"MlfEngine: " << name <<
" remove stale tracks, from "
348 << tracks->size() <<
" to " << pos;
355 if (foreground_log && !obj->lidar_supplement.is_background) {
358 if (!foreground_log && obj->lidar_supplement.is_background) {
362 std::stringstream ssstr;
363 if (foreground_log) {
364 ssstr <<
"[Foreground-objects] timestamp: "
365 << std::to_string(frame->
timestamp) <<
" objs: " << objcnt
368 ssstr <<
"[Background-objects] timestamp: "
369 << std::to_string(frame->
timestamp) <<
" objs: " << objcnt
373 if (foreground_log && obj->lidar_supplement.is_background) {
376 if (!foreground_log && !obj->lidar_supplement.is_background) {
379 ssstr <<
"id = " << obj->id <<
": " << obj->center(0) <<
", "
380 << obj->center(1) <<
", " << obj->center(2) <<
", "
381 << obj->size(0) <<
", " << obj->size(1) <<
", "
382 << obj->size(2) <<
", " << obj->theta <<
", "
383 <<
static_cast<int>(obj->type) << std::endl;
385 AINFO << ssstr.str();
389 std::stringstream sstr;
390 sstr <<
"[This frame TrackDataDebugInfo]: timestamp: "
391 << std::to_string(frame->
timestamp) <<
" tracks: "
408 auto debug_info = [&](std::vector<MlfTrackDataPtr>* tracks) {
409 for (
auto& track_data : *tracks) {
411 track_data->GetLatestObject().second;
412 sstr <<
" track_id = " << track_data->track_id_ <<
": "
413 << latest_obj->center(0) <<
", " << latest_obj->center(1)
414 <<
", " << latest_obj->center(2) <<
", "
415 << latest_obj->size(0) <<
", " << latest_obj->size(1) <<
", "
416 << latest_obj->size(2) <<
", "
417 << latest_obj->output_direction(0) <<
", "
418 << latest_obj->output_direction(1) <<
", "
419 << latest_obj->output_direction(2) <<
", "
420 <<
static_cast<int>(latest_obj->type) <<
", "
421 << 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
bool set_static_outside_hdmap_
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_
#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 uint32 pub_track_times
optional bool use_frame_timestamp
optional bool output_predict_objects
optional bool use_histogram_for_match
optional bool set_static_outside_hdmap
optional bool print_debug_log