Apollo 10.0
自动驾驶开放平台
mlf_track_data.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 *****************************************************************************/
16
18
19#include "cyber/common/log.h"
21
22namespace apollo {
23namespace perception {
24namespace lidar {
25
26const double MlfTrackData::kMaxHistoryTime = 2.0;
27
30 duration_ = 0.0;
39 cached_objects_.clear();
41// feature_.reset();
42}
43
44void MlfTrackData::Reset(TrackedObjectPtr obj, int track_id) {
45 Reset();
46 track_id_ = track_id;
48}
49
51 // double timestamp = obj->object_ptr->latest_tracked_time;
52 double timestamp = obj->timestamp;
53 if (history_objects_.find(timestamp) == history_objects_.end()) {
54 auto pair = std::make_pair(timestamp, obj);
55 history_objects_.insert(pair);
56 sensor_history_objects_[obj->sensor_info.name].insert(pair);
57 age_++;
58 if (age_ == 1) { // the first timestamp
59 if (obj->is_fake) {
60 AERROR << "obj is fake";
61 return;
62 }
63 latest_visible_time_ = timestamp;
64 first_tracked_time_ = timestamp;
65 }
66 obj->track_id = track_id_;
67 obj->tracking_time = timestamp - first_tracked_time_;
68 duration_ = obj->tracking_time;
69 if (obj->is_fake) {
72 } else {
76 latest_visible_time_ = timestamp;
77 }
79 } else {
80 AINFO << "Push object timestamp " << timestamp << " from sensor "
81 << obj->sensor_info.name << " already exist in track, ignore push.";
82 }
83}
84
86 double timestamp = obj->object_ptr->latest_tracked_time;
87 if (cached_objects_.find(timestamp) == cached_objects_.end()) {
88 cached_objects_.insert(std::make_pair(timestamp, obj));
89 latest_cached_time_ = timestamp;
90 } else {
91 AINFO << "Push object timestamp " << timestamp << " from sensor "
92 << obj->sensor_info.name << " already exist in cache, ignore push.";
93 }
94}
95
96bool MlfTrackData::ToObject(const Eigen::Vector3d& local_to_global_offset,
97 double timestamp, base::ObjectPtr object, bool update_time) const {
98 if (history_objects_.empty()) {
99 return false;
100 }
101 auto latest_iter = history_objects_.rbegin();
102 const double latest_time = latest_iter->first;
103 const auto& latest_object = latest_iter->second;
104 latest_object->ToObject(object);
105 // predict object
106 double time_diff = timestamp - latest_time;
107 double offset_x = time_diff * object->velocity(0) + local_to_global_offset(0);
108 double offset_y = time_diff * object->velocity(1) + local_to_global_offset(1);
109 double offset_z = time_diff * object->velocity(2) + local_to_global_offset(2);
110 // a). update polygon
111 for (auto& pt : object->polygon) {
112 pt.x += offset_x;
113 pt.y += offset_y;
114 pt.z += offset_z;
115 }
116
117 // b). update center
118 object->center(0) += offset_x;
119 object->center(1) += offset_y;
120 object->center(2) += offset_z;
121 // c). update anchor point
122 object->anchor_point(0) += offset_x;
123 object->anchor_point(1) += offset_y;
124 object->anchor_point(2) += offset_z;
125 if (update_time) {
126 // d). update tracking timestamp
127 object->tracking_time += time_diff;
128 // e). update latest track timestamp
129 object->latest_tracked_time += time_diff;
130 }
131 // f). update cloud world in lidar supplement
132 for (auto& pt : object->lidar_supplement.cloud_world) {
133 pt.x += offset_x;
134 pt.y += offset_y;
135 pt.z += offset_z;
136 }
137 return true;
138}
139
140void MlfTrackData::PredictState(double timestamp) const {
141 if (history_objects_.empty()) {
142 return;
143 }
144 auto latest_iter = history_objects_.rbegin();
145 const double latest_time = latest_iter->first;
146 const auto& latest_object = latest_iter->second;
147 double time_diff = timestamp - latest_time;
148
149 const Eigen::Vector3d& latest_anchor_point =
150 latest_object->belief_anchor_point;
151 const Eigen::Vector3d& latest_velocity = latest_object->output_velocity;
152
153 predict_.state.resize(6);
154 predict_.state(0) = static_cast<float>(latest_anchor_point(0) +
155 latest_velocity(0) * time_diff);
156 predict_.state(1) = static_cast<float>(latest_anchor_point(1) +
157 latest_velocity(1) * time_diff);
158 predict_.state(2) = static_cast<float>(latest_anchor_point(2) +
159 latest_velocity(2) * time_diff);
160 predict_.state(3) = static_cast<float>(latest_velocity(0));
161 predict_.state(4) = static_cast<float>(latest_velocity(1));
162 predict_.state(5) = static_cast<float>(latest_velocity(2));
163
164 predict_.timestamp = timestamp;
165 // TODO(.): predict cloud and polygon if needed in future.
166}
167
169 std::vector<TrackedObjectPtr>* objects) {
170 objects->clear();
171 auto iter = cached_objects_.begin();
172 while (iter != cached_objects_.end()) {
173 const auto& timestamp = iter->first;
174 if (timestamp <= latest_visible_time_) {
175 cached_objects_.erase(iter++);
176 } else if (timestamp <= latest_cached_time_) {
177 objects->push_back(iter->second);
178 cached_objects_.erase(iter++);
179 } else {
180 break;
181 }
182 }
183}
184
185void RemoveStaleDataFromMap(double timestamp,
186 std::map<double, TrackedObjectPtr>* data) {
187 auto iter = data->begin();
188 while (iter != data->end()) {
189 if (iter->first < timestamp) {
190 data->erase(iter++);
191 } else {
192 break;
193 }
194 }
195}
196
197void MlfTrackData::RemoveStaleHistory(double timestamp) {
199 for (auto& map : sensor_history_objects_) {
200 RemoveStaleDataFromMap(timestamp, &map.second);
201 }
202}
203
205 std::vector<TrackedObjectPtr>* objects) {
206 objects->clear();
207 size_t i = 0;
208 for (auto obj_it = history_objects_.rbegin();
209 obj_it != history_objects_.rend(); ++obj_it) {
210 if (i < k) {
211 objects->push_back(obj_it->second);
212 ++i;
213 } else {
214 break;
215 }
216 }
217}
218
220 std::vector<TrackedObjectConstPtr>* objects) const {
221 objects->clear();
222 size_t i = 0;
223 for (auto obj_it = history_objects_.rbegin();
224 obj_it != history_objects_.rend(); ++obj_it) {
225 if (i < k) {
226 objects->push_back(obj_it->second);
227 ++i;
228 } else {
229 break;
230 }
231 }
232}
233
235 std::vector<TrackedObjectConstPtr>* objects) {
236 for (auto obj_it = history_objects_.begin();
237 obj_it != history_objects_.end(); ++obj_it) {
238 if (obj_it->second->timestamp >= time) {
239 objects->push_back(obj_it->second);
240 }
241 }
242}
243
245 std::vector<TrackedObjectConstPtr>* objects) const {
246 for (auto obj_it = history_objects_.begin();
247 obj_it != history_objects_.end(); ++obj_it) {
248 if (obj_it->second->timestamp >= time) {
249 objects->push_back(obj_it->second);
250 }
251 }
252}
253
254} // namespace lidar
255} // namespace perception
256} // namespace apollo
void GetObjectsInIntervalByOrder(double time, std::vector< TrackedObjectConstPtr > *objects)
void PushTrackedObjectToTrack(TrackedObjectPtr obj)
Push tracked object to track
void RemoveStaleHistory(double timestamp)
Remove stale history data
void GetLatestKObjects(size_t k, std::vector< TrackedObjectPtr > *objects)
void PredictState(double timestamp) const
Predict state
std::map< std::string, TimedObjects > sensor_history_objects_
bool ToObject(const Eigen::Vector3d &local_to_global_offset, double timestamp, base::ObjectPtr object, bool update_time=true) const
Convert tracked object to base object
void PushTrackedObjectToCache(TrackedObjectPtr obj)
Push tracked object to cache
void GetAndCleanCachedObjectsInTimeInterval(std::vector< TrackedObjectPtr > *objects)
Get and clean cached objects in time interval
std::map< double, TrackedObjectPtr > history_objects_
Definition track_data.h:134
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
std::shared_ptr< Object > ObjectPtr
Definition object.h:127
void RemoveStaleDataFromMap(double timestamp, std::map< double, TrackedObjectPtr > *data)
std::shared_ptr< TrackedObject > TrackedObjectPtr
class register implement
Definition arena_queue.h:37