Apollo 11.0
自动驾驶开放平台
mrf_track_data.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2023 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 radar4d {
25
26const double MrfTrackData::kMaxHistoryTime = 2.0;
27
30 duration_ = 0.0;
37 cached_objects_.clear();
39// feature_.reset();
40}
41
42void MrfTrackData::Reset(TrackedObjectPtr obj, int track_id) {
43 Reset();
44 track_id_ = track_id;
46}
47
49 double timestamp = obj->object_ptr->latest_tracked_time;
50 if (history_objects_.find(timestamp) == history_objects_.end()) {
51 auto pair = std::make_pair(timestamp, obj);
52 history_objects_.insert(pair);
53 sensor_history_objects_[obj->sensor_info.name].insert(pair);
54 age_++;
55 if (age_ == 1) { // the first timestamp
56 if (obj->is_fake) {
57 AERROR << "obj is fake";
58 return;
59 }
60 latest_visible_time_ = timestamp;
61 first_tracked_time_ = timestamp;
62 }
63 obj->track_id = track_id_;
64 obj->tracking_time = timestamp - first_tracked_time_;
65 duration_ = obj->tracking_time;
66 if (obj->is_fake) {
69 } else {
73 latest_visible_time_ = timestamp;
74 }
76 } else {
77 AINFO << "Push object timestamp " << timestamp << " from sensor "
78 << obj->sensor_info.name << " already exist in track, ignore push.";
79 }
80}
81
83 double timestamp = obj->object_ptr->latest_tracked_time;
84 if (cached_objects_.find(timestamp) == cached_objects_.end()) {
85 cached_objects_.insert(std::make_pair(timestamp, obj));
86 latest_cached_time_ = timestamp;
87 } else {
88 AINFO << "Push object timestamp " << timestamp << " from sensor "
89 << obj->sensor_info.name << " already exist in cache, ignore push.";
90 }
91}
92
93bool MrfTrackData::ToObject(const Eigen::Vector3d& local_to_global_offset,
94 double timestamp, base::ObjectPtr object) const {
95 if (history_objects_.empty()) {
96 return false;
97 }
98 auto latest_iter = history_objects_.rbegin();
99 const double latest_time = latest_iter->first;
100 const auto& latest_object = latest_iter->second;
101 latest_object->ToObject(object);
102 // predict object
103 double time_diff = timestamp - latest_time;
104 double offset_x = time_diff * object->velocity(0) + local_to_global_offset(0);
105 double offset_y = time_diff * object->velocity(1) + local_to_global_offset(1);
106 double offset_z = time_diff * object->velocity(2) + local_to_global_offset(2);
107 // a). update polygon
108 for (auto& pt : object->polygon) {
109 pt.x += offset_x;
110 pt.y += offset_y;
111 pt.z += offset_z;
112 }
113
114 // b). update center
115 object->center(0) += offset_x;
116 object->center(1) += offset_y;
117 object->center(2) += offset_z;
118 // c). update anchor point
119 object->anchor_point(0) += offset_x;
120 object->anchor_point(1) += offset_y;
121 object->anchor_point(2) += offset_z;
122 // d). update tracking timestamp
123 object->tracking_time += time_diff;
124 // e). update latest track timestamp
125 object->latest_tracked_time += time_diff;
126 // f). update cloud world in radar4d supplement
127 for (auto& pt : object->radar4d_supplement.cloud_world) {
128 pt.x += offset_x;
129 pt.y += offset_y;
130 pt.z += offset_z;
131 }
132 return true;
133}
134
135void MrfTrackData::PredictState(double timestamp) const {
136 if (history_objects_.empty()) {
137 return;
138 }
139 auto latest_iter = history_objects_.rbegin();
140 const double latest_time = latest_iter->first;
141 const auto& latest_object = latest_iter->second;
142 double time_diff = timestamp - latest_time;
143
144 const Eigen::Vector3d& latest_anchor_point =
145 latest_object->belief_anchor_point;
146 const Eigen::Vector3d& latest_velocity = latest_object->output_velocity;
147
148 predict_.state.resize(6);
149 predict_.state(0) = static_cast<float>(latest_anchor_point(0) +
150 latest_velocity(0) * time_diff);
151 predict_.state(1) = static_cast<float>(latest_anchor_point(1) +
152 latest_velocity(1) * time_diff);
153 predict_.state(2) = static_cast<float>(latest_anchor_point(2) +
154 latest_velocity(2) * time_diff);
155 predict_.state(3) = static_cast<float>(latest_velocity(0));
156 predict_.state(4) = static_cast<float>(latest_velocity(1));
157 predict_.state(5) = static_cast<float>(latest_velocity(2));
158
159 predict_.timestamp = timestamp;
160 // TODO(.): predict cloud and polygon if needed in future.
161}
162
164 std::vector<TrackedObjectPtr>* objects) {
165 objects->clear();
166 auto iter = cached_objects_.begin();
167 while (iter != cached_objects_.end()) {
168 const auto& timestamp = iter->first;
169 if (timestamp <= latest_visible_time_) {
170 cached_objects_.erase(iter++);
171 } else if (timestamp <= latest_cached_time_) {
172 objects->push_back(iter->second);
173 cached_objects_.erase(iter++);
174 } else {
175 break;
176 }
177 }
178}
179
180void RemoveStaleDataFromMap(double timestamp,
181 std::map<double, TrackedObjectPtr>* data) {
182 auto iter = data->begin();
183 while (iter != data->end()) {
184 if (iter->first < timestamp) {
185 data->erase(iter++);
186 } else {
187 break;
188 }
189 }
190}
191
192void MrfTrackData::RemoveStaleHistory(double timestamp) {
194 for (auto& map : sensor_history_objects_) {
195 RemoveStaleDataFromMap(timestamp, &map.second);
196 }
197}
198
199} // namespace radar4d
200} // namespace perception
201} // namespace apollo
void PredictState(double timestamp) const
Predict state
void PushTrackedObjectToCache(TrackedObjectPtr obj)
Push tracked object to cache
void RemoveStaleHistory(double timestamp)
Remove stale history data
void PushTrackedObjectToTrack(TrackedObjectPtr obj)
Push tracked object to track
bool ToObject(const Eigen::Vector3d &local_to_global_offset, double timestamp, base::ObjectPtr object) const
Convert tracked object to base object
void GetAndCleanCachedObjectsInTimeInterval(std::vector< TrackedObjectPtr > *objects)
Get and clean cached objects in time interval
std::map< std::string, TimedObjects > sensor_history_objects_
std::map< double, TrackedObjectPtr > history_objects_
Definition track_data.h:130
#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