Apollo 10.0
自动驾驶开放平台
tracked_object.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 "cyber/common/log.h"
25
26namespace apollo {
27namespace perception {
28namespace lidar {
29
31
33 const Eigen::Affine3d& pose) {
34 AttachObject(obj_ptr, pose);
35}
36
38 const Eigen::Affine3d& pose,
39 const Eigen::Vector3d& global_to_local_offset,
40 const base::SensorInfo& sensor,
41 double timestamp) {
42 if (obj_ptr) {
43 // all state of input obj_ptr will not change except cloud world
44 object_ptr = obj_ptr;
45
47 global_local_offset = global_to_local_offset;
48 // object info to tracked object
49 center = pose * object_ptr->center;
50 const PointFCloud& cloud = (object_ptr->lidar_supplement).cloud;
51 barycenter = (algorithm::CalculateCentroid(cloud)).cast<double>();
52 barycenter = pose * barycenter;
54
55 // object-detection center
56 float detection_center_x = obj_ptr->lidar_supplement.detections[0];
57 float detection_center_y = obj_ptr->lidar_supplement.detections[1];
58 float detection_center_z = obj_ptr->lidar_supplement.detections[2];
59 float detection_size_x = obj_ptr->lidar_supplement.detections[3];
60 float detection_size_y = obj_ptr->lidar_supplement.detections[4];
61 float detection_size_z = obj_ptr->lidar_supplement.detections[5];
62 float detection_theta = obj_ptr->lidar_supplement.detections[6];
63 Eigen::Vector3d model_center_lidar = Eigen::Vector3d(detection_center_x,
64 detection_center_y, detection_center_z);
65 detection_center = pose * model_center_lidar;
66
67 // object-detection center/size/direction -> corners
68 Eigen::Matrix<float, 8, 1> corners;
70 detection_center_x, detection_center_y, detection_center_z,
71 detection_size_x, detection_size_y, detection_size_z,
72 detection_theta, &corners);
73 for (size_t i = 0; i < 4; i++) {
74 Eigen::Vector3d detection_cor = Eigen::Vector3d(
75 static_cast<double>(corners[2 * i]),
76 static_cast<double>(corners[2 * i + 1]), detection_center_z);
77 detection_corners[i] = pose * detection_cor;
78 }
79
80 Eigen::Matrix3d rotation = pose.rotation();
81 direction = rotation * object_ptr->direction.cast<double>();
83 size = object_ptr->size.cast<double>();
84 type = object_ptr->type;
85 type_probs = object_ptr->type_probs;
86 is_background = object_ptr->lidar_supplement.is_background;
87
88 base::PointDCloud& cloud_world = (object_ptr->lidar_supplement).cloud_world;
89 cloud_world.clear();
90 cloud_world.resize(cloud.size());
91 for (size_t i = 0; i < cloud.size(); ++i) {
92 Eigen::Vector3d pt(cloud[i].x, cloud[i].y, cloud[i].z);
93 Eigen::Vector3d pt_world = pose * pt;
94 cloud_world[i].x = pt_world(0);
95 cloud_world[i].y = pt_world(1);
96 cloud_world[i].z = pt_world(2);
97 cloud_world[i].intensity = cloud[i].intensity;
98 }
99 // memcpy(&(cloud_world.points_height(0)), &(cloud.points_height(0)),
100 // sizeof(float) * cloud.size());
101 for (size_t i = 0; i < cloud.size(); ++i) {
102 cloud_world.SetPointHeight(i, cloud.points_height(i));
103 }
104 // other belief information keep as Reset()
105 selected_measured_velocity = Eigen::Vector3d::Zero();
106 selected_measured_acceleration = Eigen::Vector3d::Zero();
108 belief_velocity = Eigen::Vector3d::Zero();
109 belief_acceleration = Eigen::Vector3d::Zero();
110
111 output_velocity = Eigen::Vector3d::Zero();
112 output_velocity_uncertainty = Eigen::Matrix3d::Zero();
116
117 sensor_info = sensor;
118 this->timestamp = timestamp;
119 }
120}
121
123 const base::PointFCloud& cloud = (object_ptr->lidar_supplement).cloud;
124 base::PointDCloud& cloud_world = (object_ptr->lidar_supplement).cloud_world;
125 cloud_world.clear();
126 cloud_world.resize(cloud.size());
127 for (size_t i = 0; i < cloud.size(); ++i) {
128 Eigen::Vector3d pt(cloud[i].x, cloud[i].y, cloud[i].z);
129 Eigen::Vector3d pt_world = sensor_to_local_pose * pt;
130 cloud_world[i].x = pt_world(0);
131 cloud_world[i].y = pt_world(1);
132 cloud_world[i].z = pt_world(2);
133 cloud_world[i].intensity = cloud[i].intensity;
134 }
135 memcpy(&cloud_world.points_height(0), &cloud.points_height(0),
136 sizeof(float) * cloud.size());
137}
138
140 object_ptr.reset();
141 sensor_to_local_pose = Eigen::Affine3d::Identity();
142
143 // measurement reset
144 for (int i = 0; i < 4; ++i) {
145 corners[i] = Eigen::Vector3d::Zero();
146 detection_corners[i] = Eigen::Vector3d::Zero();
147 measured_corners_velocity[i] = Eigen::Vector3d::Zero();
148 measured_history_corners_velocity[i] = Eigen::Vector3d::Zero();
149 measured_detection_history_corners_velocity[i] = Eigen::Vector3d::Zero();
150 }
151 center = Eigen::Vector3d::Zero();
152 barycenter = Eigen::Vector3d::Zero();
153 anchor_point = Eigen::Vector3d::Zero();
154 detection_center = Eigen::Vector3d::Zero();
155 measured_barycenter_velocity = Eigen::Vector3d::Zero();
156 measured_center_velocity = Eigen::Vector3d::Zero();
157 measured_nearest_corner_velocity = Eigen::Vector3d::Zero();
158 measured_history_center_velocity = Eigen::Vector3d::Zero();
159 measured_detection_center_velocity = Eigen::Vector3d::Zero();
160 measured_detection_history_center_velocity = Eigen::Vector3d::Zero();
162 direction = Eigen::Vector3d::Zero();
163 lane_direction = Eigen::Vector3d::Zero();
164 size = Eigen::Vector3d::Zero();
166 type_probs.assign(static_cast<int>(base::ObjectType::MAX_OBJECT_TYPE), 0.0f);
167 is_background = false;
168 shape_features.clear();
169 shape_features_full.clear();
171 association_score = 0.0;
172 is_fake = false;
173 track_id = -1;
174 tracking_time = 0.0;
175
176 // filter reset
178 valid = false;
179 converged = true;
181 update_quality = 0.0;
183 selected_measured_acceleration = Eigen::Vector3d::Zero();
187 belief_velocity_gain = Eigen::Vector3d::Zero();
188 velocity_covariance = Eigen::Matrix3d::Zero();
189 belief_velocity_online_covariance = Eigen::Matrix3d::Zero();
190
191 state = Eigen::Vector4d::Zero();
192 measurement_covariance = Eigen::Matrix4d::Zero();
193 state_covariance = Eigen::Matrix4d::Zero();
194
195 motion_score = Eigen::Vector3d(1, 1, 1);
196
197 // output reset
203
204 // sensor info reset
206 timestamp = 0.0;
207}
208
209void TrackedObject::Reset(base::ObjectPtr obj_ptr, const Eigen::Affine3d& pose,
210 const Eigen::Vector3d& global_to_local_offset,
211 const base::SensorInfo& sensor, double timestamp) {
212 Reset();
213 AttachObject(obj_ptr, pose, global_to_local_offset, sensor, timestamp);
214}
215
216void TrackedObject::CopyFrom(TrackedObjectPtr rhs, bool is_deep) {
217 *this = *rhs;
218 if (is_deep) {
219 object_ptr = base::ObjectPool::Instance().Get();
220 *object_ptr = *(rhs->object_ptr);
221 } else {
222 object_ptr = rhs->object_ptr;
223 }
224}
225
227 if (obj->type == base::ObjectType::VEHICLE) {
228 return 0.99f;
229 }
230 return 0.0f;
231}
232
234 *obj = *object_ptr;
235 // obj id keep default
236 // obj polygon calculate outside, because
237 /* 1. if ConvexHull2D as member variable:
238 constructor time consume a little large
239 2. if ConvexHull2D as static or global variable:
240 need mutex time consume in multi threads
241 what a pity!
242 */
243 obj->direction = output_direction.cast<float>();
244 // obj theta_variance not calculate in tracker, keep default
245 obj->center = output_center;
246 // obj center_uncertainty not calculate in tracker, keep default
247 obj->size = output_size.cast<float>();
248 // obj size_varuance not calculate in tracker, keep default
249 obj->anchor_point = belief_anchor_point;
250 obj->type = type;
251 // obj type_probs calculate in tracker
252 obj->type_probs = type_probs;
253 // obj confidence not calculate in tracker, keep default
254 obj->track_id = track_id;
255 obj->velocity = output_velocity.cast<float>();
256 obj->velocity_uncertainty = output_velocity_uncertainty.cast<float>();
257 obj->velocity_converged = converged;
258 obj->tracking_time = tracking_time;
259 if (obj->velocity.norm() > GetVelThreshold(obj)) {
260 obj->theta = std::atan2(obj->velocity[1], obj->velocity[0]);
261 } else {
262 obj->theta = std::atan2(obj->direction[1], obj->direction[0]);
263 }
264 // obj latest_tracked_time not calculate in tracker, keep default
265 // obj car_light not calculate in tracker, keep default
266 // obj lidar_supplement cloud_world has passed in *obj = *object_ptr
267 // obj lidar_supplement other elements not calculate in tracker, keep default
268 // obj radar_supplement not calculate in tracker, keep default
269 // obj camera_supplement not calculate in tracker, keep default
270}
271
272std::string TrackedObject::ToString() const {
273 // std::string txt;
274 // return txt;
275 std::ostringstream oos;
276 oos << "obj id: " << object_ptr->id << ", track_id: " << object_ptr->track_id
277 << ", bary_center: (" << barycenter[0] << "," << barycenter[1] << ","
278 << barycenter[2] << ")"
279 << ", lane_direction: (" << lane_direction[0] << "," << lane_direction[1]
280 << "," << lane_direction[2] << ")";
281 return oos.str();
282}
283
285 // Compute object's shape feature
286 // 1. check whether shape feature is ready
287 // 2. compute object's shape feature
289 FeatureDescriptor fd(&(object_ptr->lidar_supplement.cloud));
290 fd.ComputeHistogram(static_cast<int>(histogram_bin_size),
291 shape_features_full.data());
292
293 size_t feature_len = histogram_bin_size * 3;
294 shape_features.clear();
295 shape_features.resize(feature_len);
296 for (size_t i = 0; i < feature_len; ++i) {
298 }
299}
300} // namespace lidar
301} // namespace perception
302} // namespace apollo
const std::vector< float > & points_height() const
void resize(const size_t size) override
void SetPointHeight(size_t i, size_t j, float height)
void ComputeHistogram(int bin_size, float *feature)
Eigen::Matrix< T, 3, 1 > CalculateCentroid(const base::AttributePointCloud< base::Point< T > > &cloud)
Definition common.h:134
void CalculateCornersFromCenter(Type center_x, Type center_y, Type center_z, Type size_x, Type size_y, Type size_z, Type theta, Eigen::Matrix< Type, 8, 1 > *corners)
Definition common.h:361
std::shared_ptr< Object > ObjectPtr
Definition object.h:127
apollo::perception::base::PointCloud< PointF > PointFCloud
std::shared_ptr< TrackedObject > TrackedObjectPtr
class register implement
Definition arena_queue.h:37
void AttachObject(base::ObjectPtr obj_ptr, const Eigen::Affine3d &pose, const Eigen::Vector3d &global_to_local_offset=Eigen::Vector3d::Zero(), const base::SensorInfo &sensor=base::SensorInfo(), double timestamp=0.0)
Attach object
std::string ToString() const
Transform tracked data state to string
Eigen::Vector3d measured_detection_history_corners_velocity[4]
float GetVelThreshold(base::ObjectPtr obj) const
Get vehicle threshold
void ToObject(base::ObjectPtr obj_ptr) const
Convert tracked object to base object
void ComputeShapeFeatures()
Compute shape features
void TransformObjectCloudToWorld()
Transform object cloud to world
void CopyFrom(std::shared_ptr< TrackedObject > rhs, bool is_deep)
Copy from tracked object