18#include "modules/perception/camera_detection_occupancy/proto/tracker_config.pb.h"
28double CameraTracker::s_tracking_time_win_ = 0.06;
31 :
BaseTracker(), matcher_(nullptr), track_manager_(nullptr) {
32 name_ =
"CameraTracker";
36 if (track_manager_ !=
nullptr) {
37 delete track_manager_;
42 std::string config_file =
62 matcher_init_options.
config_path = matcher_param.config_path();
63 matcher_init_options.
config_file = matcher_param.config_file();
65 BaseMatcherRegisterer::GetInstanceByName(matcher_param.name());
66 CHECK_NOTNULL(matcher);
67 matcher_.reset(matcher);
68 ACHECK(matcher_->Init(matcher_init_options))
69 <<
"Failed to init Camera preprocessor.";
72 ACHECK(track_manager_ !=
nullptr)
73 <<
"Failed to get CameraTrackManager instance.";
79 TrackObjects(detected_frame);
80 CollectTrackedFrame(tracked_frame);
84void CameraTracker::TrackObjects(
const base::Frame &camera_frame) {
85 std::vector<TrackObjectPair> assignments;
86 std::vector<size_t> unassigned_tracks;
87 std::vector<size_t> unassigned_objects;
89 const auto &camera_tracks = track_manager_->
GetTracks();
90 matcher_->Match(camera_tracks, camera_frame, matcher_options, &assignments,
91 &unassigned_tracks, &unassigned_objects);
92 UpdateAssignedTracks(camera_frame, assignments);
93 UpdateUnassignedTracks(camera_frame, unassigned_tracks);
95 CreateNewTracks(camera_frame, unassigned_objects);
98void CameraTracker::UpdateAssignedTracks(
99 const base::Frame &camera_frame, std::vector<TrackObjectPair> assignments) {
101 for (
size_t i = 0; i < assignments.size(); ++i) {
102 double time_diff = camera_frame.
timestamp -
103 camera_tracks[assignments[i].first]->GetTimestamp();
104 MeasurementBboxCenterVelocity(
105 camera_frame.
objects[assignments[i].second],
106 camera_tracks[assignments[i].first]->GetObs(), time_diff);
107 MeasureVelocityRefine(
108 camera_frame.
objects[assignments[i].second],
109 camera_tracks[assignments[i].first]->GetObs(), time_diff);
110 camera_tracks[assignments[i].first]->UpdataObsCamera(
115void CameraTracker::MeasurementBboxCenterVelocity(
119 Eigen::Vector3d old_center = old_object->center;
120 Eigen::Vector3d new_center = new_object->center;
121 Eigen::Vector3d measured_bbox_center_velocity = (new_center - old_center);
122 measured_bbox_center_velocity /= time_diff;
123 measured_bbox_center_velocity(2) = 0.0;
124 new_object->velocity[0] = measured_bbox_center_velocity[0];
125 new_object->velocity[1] = measured_bbox_center_velocity[1];
126 new_object->velocity[2] = measured_bbox_center_velocity[2];
129void CameraTracker::MeasureVelocityRefine(
136 new_object->velocity[0] = 0.0;
137 new_object->velocity[1] = 0.0;
138 new_object->velocity[2] = 0.0;
141 double vel = (new_object->velocity).norm();
143 new_object->velocity[0] = 0.0;
144 new_object->velocity[1] = 0.0;
145 new_object->velocity[2] = 0.0;
149 double vel = (new_object->velocity).norm();
151 new_object->velocity[0] = 0.0;
152 new_object->velocity[1] = 0.0;
153 new_object->velocity[2] = 0.0;
158void CameraTracker::UpdateUnassignedTracks(
159 const base::Frame &camera_frame,
160 const std::vector<size_t> &unassigned_tracks) {
161 double timestamp = camera_frame.timestamp;
163 for (
size_t i = 0; i < unassigned_tracks.size(); ++i) {
164 if (camera_tracks[unassigned_tracks[i]]->GetObs() !=
nullptr) {
165 double camera_time = camera_tracks[unassigned_tracks[i]]->GetTimestamp();
166 double time_diff = fabs(timestamp - camera_time);
167 if (time_diff > s_tracking_time_win_) {
168 camera_tracks[unassigned_tracks[i]]->SetDead();
171 camera_tracks[unassigned_tracks[i]]->SetDead();
173 camera_tracks[unassigned_tracks[i]]->SetUnAssigned();
177void CameraTracker::DeleteLostTracks() { track_manager_->
RemoveLostTracks(); }
179void CameraTracker::CreateNewTracks(
180 const base::Frame &camera_frame,
181 const std::vector<size_t> &unassigned_objects) {
182 for (
size_t i = 0; i < unassigned_objects.size(); ++i) {
184 camera_track.reset(
new CameraTrack(
185 camera_frame.objects[unassigned_objects[i]], camera_frame.timestamp));
186 track_manager_->
AddTrack(camera_track);
190void CameraTracker::CollectTrackedFrame(
base::FramePtr tracked_frame) {
191 if (tracked_frame ==
nullptr) {
192 AERROR <<
"tracked_frame is nullptr";
195 auto &objects = tracked_frame->objects;
197 const auto &camera_tracks = track_manager_->
GetTracks();
198 for (
size_t i = 0; i < camera_tracks.size(); ++i) {
199 if (camera_tracks[i]->ConfirmTrack() && camera_tracks[i]->IsAssigned()) {
202 *
object = *track_object;
203 object->tracking_time = camera_tracks[i]->GetTrackingTime();
204 object->track_id = camera_tracks[i]->GetObsId();
205 object->latest_tracked_time = camera_tracks[i]->GetTimestamp();
206 objects.push_back(
object);
#define PERCEPTION_REGISTER_TRACKER(name)
std::vector< CameraTrackPtr > & mutable_tracks()
Get tracked targets, which can modify data.
int RemoveLostTracks()
Remove already lost targets.
const std::vector< CameraTrackPtr > & GetTracks() const
Get the Tracks object
void AddTrack(const CameraTrackPtr &track)
Add Camera tracked object.
static void SetChosenFilter(const std::string &chosen_filter)
Set the Chosen Filter object
static void SetTrackedTimesThreshold(const int &threshold)
Set the Tracked Times Threshold object
static void SetUseFilter(bool use_filter)
Set the Use Filter object
bool Track(const base::Frame &detected_frame, base::FramePtr tracked_frame) override
Tracking objects.
bool Init(const TrackerInitOptions &options) override
Init CameraTracker config
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::shared_ptr< Frame > FramePtr
std::shared_ptr< CameraTrack > CameraTrackPtr
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
std::vector< std::shared_ptr< Object > > objects
optional perception::PluginParam matcher_param
optional double tracking_time_window
optional string chosen_filter
optional double tracked_times_threshold