Apollo 10.0
自动驾驶开放平台
apollo::third_party_perception::conversion_smartereye 命名空间参考

apollo::third_party_perception 更多...

类型定义

using Point = apollo::common::Point3D
 

函数

apollo::perception::PerceptionObstacles SmartereyeToPerceptionObstacles (const apollo::drivers::SmartereyeObstacles &smartereye_obstacles, const apollo::drivers::SmartereyeLanemark &smartereye_lanemark, const apollo::localization::LocalizationEstimate &localization, const apollo::canbus::Chassis &chassis)
 

详细描述

类型定义说明

◆ Point

函数说明

◆ SmartereyeToPerceptionObstacles()

apollo::perception::PerceptionObstacles apollo::third_party_perception::conversion_smartereye::SmartereyeToPerceptionObstacles ( const apollo::drivers::SmartereyeObstacles smartereye_obstacles,
const apollo::drivers::SmartereyeLanemark smartereye_lanemark,
const apollo::localization::LocalizationEstimate localization,
const apollo::canbus::Chassis chassis 
)

在文件 conversion_smartereye.cc47 行定义.

51 {
52 PerceptionObstacles obstacles;
53 // retrieve position and velocity of the main vehicle from the localization
54 // position
55 std::map<std::int32_t, apollo::hdmap::LaneBoundaryType_Type>
56 lane_conversion_map = {{0, apollo::hdmap::LaneBoundaryType::DOTTED_YELLOW},
63
64 obstacles.mutable_header()->CopyFrom(smartereye_obstacles.header());
65
66 // Fullfill lane_type information
67 std::int32_t sma_left_lane_type =
68 smartereye_lanemark.lane_road_data().roadway().left_lane().style();
69 std::int32_t sma_right_lane_type =
70 smartereye_lanemark.lane_road_data().roadway().right_lane().style();
71
72 obstacles.mutable_lane_marker()->mutable_left_lane_marker()->set_lane_type(
73 lane_conversion_map[sma_left_lane_type]);
74 obstacles.mutable_lane_marker()->mutable_right_lane_marker()->set_lane_type(
75 lane_conversion_map[sma_right_lane_type]);
76
77 obstacles.mutable_lane_marker()->mutable_left_lane_marker()->set_quality(
78 smartereye_lanemark.lane_road_data().roadway()
79 .left_lane().quality() / 4.0);
80 obstacles.mutable_lane_marker()->mutable_left_lane_marker()
81 ->set_model_degree(smartereye_lanemark.lane_road_data().roadway()
83
84 // Convert everything to FLU
85 obstacles.mutable_lane_marker()->mutable_left_lane_marker()->set_c0_position(
86 smartereye_lanemark.lane_road_data().roadway()
88 obstacles.mutable_lane_marker()->mutable_left_lane_marker()
89 ->set_c1_heading_angle(smartereye_lanemark.lane_road_data().roadway()
91 obstacles.mutable_lane_marker()->mutable_left_lane_marker()
92 ->set_c2_curvature(smartereye_lanemark.lane_road_data().roadway()
94 obstacles.mutable_lane_marker()->mutable_left_lane_marker()
95 ->set_c3_curvature_derivative(
96 smartereye_lanemark.lane_road_data().roadway()
98 // obstacles.mutable_lane_marker()->mutable_left_lane_marker()
99 // ->set_view_range(
100 // smartereye_lanemark.lane_road_data().roadway().left_lane().width());
101
102 obstacles.mutable_lane_marker()->mutable_right_lane_marker()->set_quality(
103 smartereye_lanemark.lane_road_data().roadway()
104 .right_lane().quality() / 4.0);
105 obstacles.mutable_lane_marker()->mutable_right_lane_marker()
106 ->set_model_degree(smartereye_lanemark.lane_road_data().roadway()
108 obstacles.mutable_lane_marker()->mutable_right_lane_marker()
109 ->set_c0_position(smartereye_lanemark.lane_road_data().roadway()
111 obstacles.mutable_lane_marker()->mutable_right_lane_marker()
112 ->set_c1_heading_angle(smartereye_lanemark.lane_road_data().roadway()
114 obstacles.mutable_lane_marker()->mutable_right_lane_marker()
115 ->set_c2_curvature(smartereye_lanemark.lane_road_data().roadway()
117 obstacles.mutable_lane_marker()->mutable_right_lane_marker()
118 ->set_c3_curvature_derivative(
119 smartereye_lanemark.lane_road_data().roadway()
121 // obstacles.mutable_lane_marker()->mutable_right_lane_marker()
122 // ->set_view_range(
123 // smartereye_lanemark.lane_road_data().roadway().right_lane().width());
124
125 double adc_x = localization.pose().position().x();
126 double adc_y = localization.pose().position().y();
127 double adc_z = localization.pose().position().z();
128 // heading
129 auto adc_quaternion = localization.pose().orientation();
130 double adc_theta = GetAngleFromQuaternion(adc_quaternion);
131 // velocity
132 double adc_vx = localization.pose().linear_velocity().x();
133 double adc_vy = localization.pose().linear_velocity().y();
134 double adc_velocity = Speed(adc_vx, adc_vy);
135
136 for (int index = 0; index < smartereye_obstacles.num_obstacles() &&
137 index < smartereye_obstacles.output_obstacles_size();
138 ++index) {
139 auto* sma = obstacles.add_perception_obstacle();
140 const auto& data_obstacle =
141 smartereye_obstacles.output_obstacles().at(index);
142 int sma_id = data_obstacle.trackid() + FLAGS_smartereye_id_offset;
143
144 double sma_x = data_obstacle.avgdistancez();
145 double sma_y = data_obstacle.real3dcenterx();
146 double sma_z = (data_obstacle.real3dupy() +
147 data_obstacle.real3dlowy()) / 2.0;
148 // relative speed
149 double sma_vel_x = data_obstacle.fuzzyrelativespeedz();
150 int sma_type = data_obstacle.obstacletype();
151
152 double sma_w = data_obstacle.real3drightx() - data_obstacle.real3dleftx();
153 double sma_l = data_obstacle.real3dlowy() - data_obstacle.real3dupy();
154
155 switch (sma_type) {
156 case 1:
157 case 6:
158 case 7: {
159 sma->set_type(PerceptionObstacle::VEHICLE); // VEHICLE
160 break;
161 }
162 case 4:
163 case 5: {
164 sma->set_type(PerceptionObstacle::BICYCLE); // BIKE
165 break;
166 }
167 case 2:
168 case 3: {
169 sma->set_type(PerceptionObstacle::PEDESTRIAN); // PED
170 break;
171 }
172 default: {
173 sma->set_type(PerceptionObstacle::UNKNOWN); // UNKNOWN
174 break;
175 }
176 }
177
178 if (sma_l > FLAGS_max_mobileye_obstacle_length) {
179 sma_l = GetDefaultObjectLength(sma_type);
180 }
181 if (sma_w > FLAGS_max_mobileye_obstacle_width) {
182 sma_w = GetDefaultObjectWidth(sma_type);
183 }
184
185 Point xy_point = SLtoXY(sma_x, sma_y, adc_theta);
186
187 // TODO(QiL) : Clean this up after data collection and validation
188 double converted_x = 0.0;
189 double converted_y = 0.0;
190 double converted_z = 0.0;
191 double converted_speed = 0.0;
192 double converted_vx = 0.0;
193 double converted_vy = 0.0;
194
195 double path_c1 = 0.0;
196 double path_c2 = 0.0;
197 double path_c3 = 0.0;
198
199 if (obstacles.lane_marker().left_lane_marker().quality() >=
200 obstacles.lane_marker().right_lane_marker().quality()) {
201 path_c1 = obstacles.lane_marker().left_lane_marker().c1_heading_angle();
202 path_c2 = obstacles.lane_marker().left_lane_marker().c2_curvature();
203 path_c3 =
205 } else {
206 path_c1 = obstacles.lane_marker().right_lane_marker().c1_heading_angle();
207 path_c2 = obstacles.lane_marker().right_lane_marker().c2_curvature();
208 path_c3 =
210 }
211
212 if (!FLAGS_use_navigation_mode) {
213 converted_x = adc_x + xy_point.x();
214 converted_y = adc_y + xy_point.y();
215 converted_z = adc_z + sma_z;
216 sma->set_theta(GetNearestLaneHeading(converted_x, converted_y, adc_z));
217 converted_speed = adc_velocity + sma_vel_x;
218 converted_vx = converted_speed * std::cos(sma->theta());
219 converted_vy = converted_speed * std::sin(sma->theta());
220 } else {
221 converted_x = data_obstacle.real3dcenterx() - sma_l / 2.0;
222 converted_y = sma_y;
223 converted_vx = sma_vel_x + chassis.speed_mps();
224 converted_vy = 0.0;
225 converted_z = data_obstacle.avgdistancez();
226
227 double nearest_lane_heading =
228 converted_vx > 0
229 ? std::atan2(3 * path_c3 * converted_x * converted_x +
230 2 * path_c2 * converted_x + path_c1,
231 1)
232 : std::atan2(3 * path_c3 * converted_x * converted_x +
233 2 * path_c2 * converted_x + path_c1,
234 1) +
235 M_PI;
236 AINFO << "nearest lane heading is" << nearest_lane_heading;
237 sma->set_theta(nearest_lane_heading);
238 }
239
240 sma->set_id(sma_id);
241 sma->mutable_position()->set_x(converted_x);
242 sma->mutable_position()->set_y(converted_y);
243 sma->mutable_position()->set_z(converted_z);
244
245 sma->mutable_velocity()->set_x(converted_vx);
246 sma->mutable_velocity()->set_y(converted_vy);
247 sma->set_length(sma_l);
248 sma->set_width(sma_w);
249 sma->set_height(FLAGS_default_height);
250
251 sma->clear_polygon_point();
252
253 // create polygon
254 FillPerceptionPolygon(sma, sma->position().x(), sma->position().y(),
255 sma->position().z(), sma->length(), sma->width(),
256 sma->height(), sma->theta());
257
258 sma->set_confidence(0.5);
259 }
260
261 return obstacles;
262}
#define AINFO
Definition log.h:42
apollo::common::Point3D Point
void FillPerceptionPolygon(PerceptionObstacle *const perception_obstacle, const double mid_x, const double mid_y, const double mid_z, const double length, const double width, const double height, const double heading)
double GetDefaultObjectLength(const int object_type)
double GetAngleFromQuaternion(const Quaternion quaternion)
Point SLtoXY(const Point &point, const double theta)
double GetNearestLaneHeading(const PointENU &point_enu)
double GetDefaultObjectWidth(const int object_type)
Definition future.h:29
optional float speed_mps
Definition chassis.proto:70
optional LdwRoadway roadway
optional LdwLaneBoundary left_boundary
optional LdwLaneStyle style
optional LdwLaneBoundary right_boundary
map< uint32, OutputObstacle > output_obstacles
optional apollo::common::Header header
optional apollo::localization::Pose pose
optional apollo::common::Point3D linear_velocity
Definition pose.proto:35
optional apollo::common::Quaternion orientation
Definition pose.proto:31
optional apollo::common::PointENU position
Definition pose.proto:26