Apollo 11.0
自动驾驶开放平台
track.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 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 <limits>
19
20namespace apollo {
21namespace perception {
22namespace fusion {
23
24size_t Track::s_track_idx_ = 1;
25double Track::s_max_lidar_invisible_period_ = 0.25; // in second
26double Track::s_max_radar_invisible_period_ = 0.50; // in second
27double Track::s_max_camera_invisible_period_ = 0.75; // in second
28
30
31bool Track::Initialize(SensorObjectPtr obj, bool is_background) {
32 Reset();
33 int track_id = static_cast<int>(GenerateNewTrackId());
34 is_background_ = is_background;
35 std::shared_ptr<base::Object> fused_base_obj = fused_object_->GetBaseObject();
36 std::shared_ptr<const base::Object> sensor_base_obj = obj->GetBaseObject();
37 *fused_base_obj = *sensor_base_obj;
38 fused_base_obj->track_id = track_id;
40 return true;
41}
42
44 fused_object_->GetBaseObject()->track_id = 0;
45 lidar_objects_.clear();
46 radar_objects_.clear();
47 camera_objects_.clear();
48 tracking_period_ = 0.0;
49 is_background_ = false;
50 is_alive_ = true;
52 toic_prob_ = 0.0;
53}
54
56 const std::string& sensor_id) const {
57 auto lidar_it = lidar_objects_.find(sensor_id);
58 if (lidar_it != lidar_objects_.end()) {
59 return lidar_it->second;
60 }
61
62 auto radar_it = radar_objects_.find(sensor_id);
63 if (radar_it != radar_objects_.end()) {
64 return radar_it->second;
65 }
66
67 auto camera_it = camera_objects_.find(sensor_id);
68 if (camera_it != camera_objects_.end()) {
69 return camera_it->second;
70 }
71
72 return nullptr;
73}
74
78
82
86
88 const SensorId2ObjectMap& objects) const {
89 SensorObjectConstPtr obj = nullptr;
90 for (auto it = objects.begin(); it != objects.end(); ++it) {
91 if (obj == nullptr || obj->GetTimestamp() < it->second->GetTimestamp()) {
92 obj = it->second;
93 }
94 }
95 return obj;
96}
97
99 int ret_track_id = static_cast<int>(s_track_idx_);
100 if (s_track_idx_ == std::numeric_limits<unsigned int>::max()) {
101 s_track_idx_ = 1;
102 } else {
103 s_track_idx_++;
104 }
105 return ret_track_id;
106}
107
109 const SensorObjectPtr& obj) {
110 std::string sensor_id = obj->GetSensorId();
111 auto it = objects->find(sensor_id);
112 if (it == objects->end()) {
113 (*objects)[sensor_id] = obj;
114 } else {
115 it->second = obj;
116 }
117}
118
120 std::string sensor_id = obj->GetSensorId();
121 SensorId2ObjectMap* objects = nullptr;
122 if (IsLidar(obj)) {
123 objects = &lidar_objects_;
124 } else if (IsRadar(obj)) {
125 objects = &radar_objects_;
126 } else if (IsCamera(obj)) {
127 objects = &camera_objects_;
128 } else {
129 return;
130 }
131 UpdateSensorObject(objects, obj);
132 double time_diff = obj->GetTimestamp() - fused_object_->GetTimestamp();
133 tracking_period_ += time_diff;
134
136 obj->GetTimestamp(),
137 s_max_lidar_invisible_period_);
139 obj->GetTimestamp(),
140 s_max_radar_invisible_period_);
142 obj->GetTimestamp(),
143 s_max_camera_invisible_period_);
144
145 if (is_background_) {
147 }
148
149 fused_object_->GetBaseObject()->latest_tracked_time = obj->GetTimestamp();
152 is_alive_ = true;
153}
154
155void Track::UpdateWithoutSensorObject(const std::string& sensor_id,
156 double measurement_timestamp) {
158 measurement_timestamp,
159 s_max_lidar_invisible_period_);
161 measurement_timestamp,
162 s_max_radar_invisible_period_);
164 measurement_timestamp,
165 s_max_camera_invisible_period_);
166
168 is_alive_ = (!lidar_objects_.empty()) || (!radar_objects_.empty()) ||
169 (!camera_objects_.empty());
170}
171
173 const std::string& sensor_id,
174 double measurement_timestamp,
175 double max_invisible_period) {
176 for (auto it = objects->begin(); it != objects->end();) {
177 double period = measurement_timestamp - it->second->GetTimestamp();
178 if (it->first == sensor_id) {
179 it->second->SetInvisiblePeriod(period);
180 } else if (it->second->GetInvisiblePeriod() > 0.0) {
181 it->second->SetInvisiblePeriod(period);
182 }
183
184 if (period > max_invisible_period) {
185 it->second = nullptr;
186 it = objects->erase(it);
187 } else {
188 ++it;
189 }
190 }
191}
192
194 const std::string& sensor_id,
195 double measurement_timestamp,
196 double max_invisible_period) {
197 for (auto it = objects->begin(); it != objects->end();) {
198 if (it->first != sensor_id) {
199 double period = measurement_timestamp - it->second->GetTimestamp();
200 if (period > max_invisible_period) {
201 it->second = nullptr;
202 it = objects->erase(it);
203 } else {
204 ++it;
205 }
206 } else {
207 ++it;
208 }
209 }
210}
211
213 std::shared_ptr<base::Object> dst_obj = fused_object_->GetBaseObject();
214 if (src_object != nullptr) {
215 std::shared_ptr<const base::Object> src_obj = src_object->GetBaseObject();
216 if (IsLidar(src_object)) {
217 dst_obj->lidar_supplement = src_obj->lidar_supplement;
218 } else if (IsRadar(src_object)) {
219 dst_obj->radar_supplement = src_obj->radar_supplement;
220 } else if (IsCamera(src_object)) {
221 dst_obj->camera_supplement = src_obj->camera_supplement;
222 }
223 }
224
225 if (lidar_objects_.empty()) {
226 dst_obj->lidar_supplement.Reset();
227 }
228 if (radar_objects_.empty()) {
229 dst_obj->radar_supplement.Reset();
230 }
231 if (camera_objects_.empty()) {
232 dst_obj->camera_supplement.Reset();
233 }
234}
235
237 std::shared_ptr<base::Object> dst_obj = fused_object_->GetBaseObject();
238 std::shared_ptr<const base::Object> src_obj = src_object->GetBaseObject();
239 if (IsLidar(src_object)) {
240 dst_obj->confidence = src_obj->confidence;
241 dst_obj->velocity_converged = src_obj->velocity_converged;
242 } else if (IsRadar(src_object)) {
243 // update nothing temporarily
244 } else if (IsCamera(src_object)) {
245 dst_obj->confidence = src_obj->confidence;
246 }
247}
248
249bool Track::IsVisible(const std::string& sensor_id) const {
250 SensorObjectConstPtr sensor_obj = GetSensorObject(sensor_id);
251 return (sensor_obj != nullptr && sensor_obj->GetInvisiblePeriod() < 1.0e-6);
252}
253
255 for (auto it = lidar_objects_.begin(); it != lidar_objects_.end(); ++it) {
256 if (it->second->GetInvisiblePeriod() < 1.0e-6) {
257 return true;
258 }
259 }
260 return false;
261}
262
264 for (auto it = radar_objects_.begin(); it != radar_objects_.end(); ++it) {
265 if (it->second->GetInvisiblePeriod() < 1.0e-6) {
266 return true;
267 }
268 }
269 return false;
270}
271
273 for (auto it = camera_objects_.begin(); it != camera_objects_.end(); ++it) {
274 if (it->second->GetInvisiblePeriod() < 1.0e-6) {
275 return true;
276 }
277 }
278 return false;
279}
280
282 std::shared_ptr<base::Object> fused_base_object =
283 fused_object_->GetBaseObject();
284 std::shared_ptr<const base::Object> measurement_base_object =
285 obj->GetBaseObject();
286 int track_id = fused_base_object->track_id;
287 *fused_base_object = *measurement_base_object;
288 fused_base_object->track_id = track_id;
289}
290
292 const std::string& sensor_id, double measurement_timestamp) {}
293
294std::string Track::DebugString() const {
295 std::ostringstream oss;
296 oss << "fusion_track[id: " << this->GetTrackId() << ", fused_object("
297 << fused_object_->GetBaseObject()->ToString() << ")\n";
298
299 oss << "lidar_measurments[number: " << lidar_objects_.size() << ",";
300 for (auto it = lidar_objects_.begin(); it != lidar_objects_.end(); ++it) {
301 oss << "(sensor_id: " << it->first
302 << ", invisible_t: " << it->second->GetInvisiblePeriod()
303 << ", info: " << it->second->GetBaseObject()->ToString() << ")\n";
304 }
305 oss << "]\n";
306
307 oss << "radar_measurments[number: " << radar_objects_.size() << ",";
308 for (auto it = radar_objects_.begin(); it != radar_objects_.end(); ++it) {
309 oss << "(sensor_id: " << it->first
310 << ", invisible_t: " << it->second->GetInvisiblePeriod()
311 << ", info: " << it->second->GetBaseObject()->ToString() << ")\n";
312 }
313 oss << "]\n";
314
315 oss << "camera_measurments[number: " << camera_objects_.size() << ",";
316 for (auto it = camera_objects_.begin(); it != camera_objects_.end(); ++it) {
317 oss << "(sensor_id: " << it->first
318 << ", invisible_t: " << it->second->GetInvisiblePeriod()
319 << ", info: " << it->second->GetBaseObject()->ToString() << ")\n";
320 }
321 oss << "]\n";
322 return oss.str();
323}
324
325} // namespace fusion
326} // namespace perception
327} // namespace apollo
bool IsCameraVisible() const
Is camera visible
Definition track.cc:272
static size_t GenerateNewTrackId()
Generate new track id
Definition track.cc:98
void UpdateUnfusedState(const SensorObjectPtr &src_object)
update no fusion state
Definition track.cc:236
void UpdateWithSensorObjectForBackground(const SensorObjectPtr &obj)
Definition track.cc:281
int GetTrackId() const
Get the track id
Definition track.h:165
bool IsVisible(const std::string &sensor_id) const
Is visible
Definition track.cc:249
SensorObjectConstPtr GetSensorObject(const std::string &sensor_id) const
Get the sensor object object
Definition track.cc:55
void UpdateSensorObjectWithoutMeasurement(SensorId2ObjectMap *objects, const std::string &sensor_id, double measurement_timestamp, double max_invisible_period)
Definition track.cc:172
std::string DebugString() const
Debug information
Definition track.cc:294
bool IsRadarVisible() const
Is radar visible
Definition track.cc:263
SensorId2ObjectMap radar_objects_
Definition track.h:373
bool Initialize(SensorObjectPtr obj, bool is_background=false)
Initialize
Definition track.cc:31
SensorObjectConstPtr GetLatestRadarObject() const
Get the latest radar object object
Definition track.cc:79
void UpdateSupplementState(const SensorObjectPtr &src_object=nullptr)
Update supplement state
Definition track.cc:212
void UpdateSensorObject(SensorId2ObjectMap *objects, const SensorObjectPtr &obj)
Definition track.cc:108
SensorObjectConstPtr GetLatestSensorObject(const SensorId2ObjectMap &objects) const
Get the Latest Sensor Object object
Definition track.cc:87
void UpdateSensorObjectWithMeasurement(SensorId2ObjectMap *objects, const std::string &sensor_id, double measurement_timestamp, double max_invisible_period)
Definition track.cc:193
bool IsLidarVisible() const
Is lidar visible
Definition track.cc:254
void UpdateWithSensorObject(const SensorObjectPtr &obj)
Update by SensorObject
Definition track.cc:119
SensorId2ObjectMap lidar_objects_
Definition track.h:372
void UpdateWithoutSensorObject(const std::string &sensor_id, double measurement_timestamp)
Update without SensorObject
Definition track.cc:155
SensorObjectConstPtr GetLatestCameraObject() const
Get the latest camera object object
Definition track.cc:83
SensorObjectConstPtr GetLatestLidarObject() const
Get the latest lidar object object
Definition track.cc:75
void UpdateWithoutSensorObjectForBackground(const std::string &sensor_id, double measurement_timestamp)
Definition track.cc:291
SensorId2ObjectMap camera_objects_
Definition track.h:374
std::shared_ptr< const SensorObject > SensorObjectConstPtr
std::shared_ptr< SensorObject > SensorObjectPtr
bool IsCamera(const SensorObjectConstPtr &obj)
bool IsLidar(const SensorObjectConstPtr &obj)
bool IsRadar(const SensorObjectConstPtr &obj)
std::map< std::string, SensorObjectPtr > SensorId2ObjectMap
Definition track.h:30
class register implement
Definition arena_queue.h:37