Apollo 10.0
自动驾驶开放平台
camera_tracker.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
17
18#include "modules/perception/camera_detection_occupancy/proto/tracker_config.pb.h"
19
20#include "cyber/common/file.h"
21#include "cyber/common/log.h"
23
24namespace apollo {
25namespace perception {
26namespace camera {
27
28double CameraTracker::s_tracking_time_win_ = 0.06;
29
31 : BaseTracker(), matcher_(nullptr), track_manager_(nullptr) {
32 name_ = "CameraTracker";
33}
34
36 if (track_manager_ != nullptr) {
37 delete track_manager_;
38 }
39}
40
42 std::string config_file =
43 GetConfigFile(options.config_path, options.config_file);
44
45 TrackerConfig config;
46 ACHECK(cyber::common::GetProtoFromFile(config_file, &config));
47
48 s_tracking_time_win_ = config.tracking_time_window();
49
50 std::string chosen_filter = config.chosen_filter();
51 CameraTrack::SetChosenFilter(chosen_filter);
52
53 int tracked_times_threshold = config.tracked_times_threshold();
54 CameraTrack::SetTrackedTimesThreshold(tracked_times_threshold);
55
56 bool use_filter = config.use_filter();
57 CameraTrack::SetUseFilter(use_filter);
58
59 // Or use register class instead.
60 MatcherInitOptions matcher_init_options;
61 auto matcher_param = config.matcher_param();
62 matcher_init_options.config_path = matcher_param.config_path();
63 matcher_init_options.config_file = matcher_param.config_file();
64 BaseMatcher *matcher =
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.";
70
71 track_manager_ = new CameraTrackManager();
72 ACHECK(track_manager_ != nullptr)
73 << "Failed to get CameraTrackManager instance.";
74 return true;
75}
76
77bool CameraTracker::Track(const base::Frame &detected_frame,
78 base::FramePtr tracked_frame) {
79 TrackObjects(detected_frame);
80 CollectTrackedFrame(tracked_frame);
81 return true;
82}
83
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;
88 TrackObjectMatcherOptions matcher_options;
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);
94 DeleteLostTracks();
95 CreateNewTracks(camera_frame, unassigned_objects);
96}
97
98void CameraTracker::UpdateAssignedTracks(
99 const base::Frame &camera_frame, std::vector<TrackObjectPair> assignments) {
100 auto &camera_tracks = track_manager_->mutable_tracks();
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(
111 camera_frame.objects[assignments[i].second], camera_frame.timestamp);
112 }
113}
114
115void CameraTracker::MeasurementBboxCenterVelocity(
116 base::ObjectPtr new_object,
117 const base::ObjectPtr old_object,
118 double time_diff) {
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];
127}
128
129void CameraTracker::MeasureVelocityRefine(
130 base::ObjectPtr new_object,
131 const base::ObjectPtr old_object,
132 double time_diff) {
133 if (old_object->type == base::ObjectType::UNKNOWN
134 || old_object->type == base::ObjectType::UNKNOWN_MOVABLE
135 || old_object->type == base::ObjectType::UNKNOWN_UNMOVABLE) {
136 new_object->velocity[0] = 0.0;
137 new_object->velocity[1] = 0.0;
138 new_object->velocity[2] = 0.0;
139 }
140 if (old_object->type == base::ObjectType::VEHICLE) {
141 double vel = (new_object->velocity).norm();
142 if (vel < 2.0) {
143 new_object->velocity[0] = 0.0;
144 new_object->velocity[1] = 0.0;
145 new_object->velocity[2] = 0.0;
146 }
147 }
148 if (old_object->type == base::ObjectType::BICYCLE) {
149 double vel = (new_object->velocity).norm();
150 if (vel < 2.0) {
151 new_object->velocity[0] = 0.0;
152 new_object->velocity[1] = 0.0;
153 new_object->velocity[2] = 0.0;
154 }
155 }
156}
157
158void CameraTracker::UpdateUnassignedTracks(
159 const base::Frame &camera_frame,
160 const std::vector<size_t> &unassigned_tracks) {
161 double timestamp = camera_frame.timestamp;
162 auto &camera_tracks = track_manager_->mutable_tracks();
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();
169 }
170 } else {
171 camera_tracks[unassigned_tracks[i]]->SetDead();
172 }
173 camera_tracks[unassigned_tracks[i]]->SetUnAssigned();
174 }
175}
176
177void CameraTracker::DeleteLostTracks() { track_manager_->RemoveLostTracks(); }
178
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) {
183 CameraTrackPtr camera_track;
184 camera_track.reset(new CameraTrack(
185 camera_frame.objects[unassigned_objects[i]], camera_frame.timestamp));
186 track_manager_->AddTrack(camera_track);
187 }
188}
189
190void CameraTracker::CollectTrackedFrame(base::FramePtr tracked_frame) {
191 if (tracked_frame == nullptr) {
192 AERROR << "tracked_frame is nullptr";
193 return;
194 }
195 auto &objects = tracked_frame->objects;
196 objects.clear();
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()) {
200 base::ObjectPtr object = base::ObjectPtr(new base::Object());
201 const base::ObjectPtr &track_object = camera_tracks[i]->GetObs();
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);
207 }
208 }
209}
210
212
213} // namespace camera
214} // namespace perception
215} // namespace apollo
#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
#define ACHECK(cond)
Definition log.h:80
#define AERROR
Definition log.h:44
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,...
Definition file.cc:132
std::shared_ptr< Object > ObjectPtr
Definition object.h:127
std::shared_ptr< Frame > FramePtr
Definition frame.h:60
std::shared_ptr< CameraTrack > CameraTrackPtr
std::string GetConfigFile(const std::string &config_path, const std::string &config_file)
Definition util.cc:80
class register implement
Definition arena_queue.h:37
std::vector< std::shared_ptr< Object > > objects
Definition frame.h:48
optional perception::PluginParam matcher_param