Apollo 11.0
自动驾驶开放平台
rss_decider.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
22
25
26namespace apollo {
27namespace planning {
28
31
32using ad_rss::physics::Distance;
33using ad_rss::physics::ParametricValue;
34using ad_rss::physics::Speed;
35using ad_rss::situation::VehicleState;
36using ad_rss::world::Object;
37using ad_rss::world::RoadArea;
38using ad_rss::world::Scene;
39
40bool RssDecider::Init(const std::string &config_dir, const std::string &name,
41 const std::shared_ptr<DependencyInjector> &injector) {
42 if (!Task::Init(config_dir, name, injector)) {
43 return false;
44 }
45 // Load the config this task.
46 return Task::LoadConfig<RssDeciderConfig>(&config_);
47}
48
50 Frame *frame, ReferenceLineInfo *reference_line_info) {
51 return Process(frame, reference_line_info);
52}
53
54Status RssDecider::Process(Frame *frame,
55 ReferenceLineInfo *reference_line_info) {
56 CHECK_NOTNULL(frame);
57 CHECK_NOTNULL(reference_line_info);
58
59 if (reference_line_info->path_data().Empty() ||
60 reference_line_info->speed_data().empty()) {
61 const std::string msg = "Empty path or speed data";
62 AERROR << msg;
63 return Status(ErrorCode::PLANNING_ERROR, msg);
64 }
65
66 double adc_velocity = frame->vehicle_state().linear_velocity();
67 const PathDecision *path_decision = reference_line_info->path_decision();
68 const double ego_v_s_start = reference_line_info->AdcSlBoundary().start_s();
69 const double ego_v_s_end = reference_line_info->AdcSlBoundary().end_s();
70 const double ego_v_l_start = reference_line_info->AdcSlBoundary().start_l();
71 const double ego_v_l_end = reference_line_info->AdcSlBoundary().end_l();
72 double nearest_obs_s_start = 0.0;
73 double nearest_obs_s_end = 0.0;
74 double nearest_obs_l_start = 0.0;
75 double nearest_obs_l_end = 0.0;
76 double nearest_obs_speed = 0.0;
77
78 double front_obstacle_distance = config_.rss_max_front_obstacle_distance();
79 for (const auto *obstacle : path_decision->obstacles().Items()) {
80 if (obstacle->IsVirtual()) {
81 continue;
82 }
83 bool is_on_road = reference_line_info->reference_line().HasOverlap(
84 obstacle->PerceptionBoundingBox());
85 if (!is_on_road) {
86 continue;
87 }
88 const auto &obstacle_sl = obstacle->PerceptionSLBoundary();
89 if (obstacle_sl.end_s() <= ego_v_s_start) {
90 continue;
91 }
92 double distance = obstacle_sl.start_s() - ego_v_s_end;
93 if (distance > 0 && distance < front_obstacle_distance) {
94 front_obstacle_distance = distance;
95 nearest_obs_s_start = obstacle_sl.start_s();
96 nearest_obs_s_end = obstacle_sl.end_s();
97 nearest_obs_l_start = obstacle_sl.start_l();
98 nearest_obs_l_end = obstacle_sl.end_l();
99 nearest_obs_speed = obstacle->speed();
100 }
101 }
102
103 // there is no obstacle in front of adc
104 if (front_obstacle_distance >= config_.rss_max_front_obstacle_distance()) {
105 ::ad_rss::world::Dynamics dynamics;
106 rss_config_default_dynamics(&dynamics);
107
108 reference_line_info->mutable_rss_info()->set_is_rss_safe(true);
109 reference_line_info->mutable_rss_info()->set_cur_dist_lon(
110 front_obstacle_distance);
111 reference_line_info->mutable_rss_info()->set_rss_safe_dist_lon(
112 front_obstacle_distance);
113
114 reference_line_info->mutable_rss_info()->set_acc_lon_range_minimum(
115 -1 * static_cast<double>(dynamics.alphaLon.brakeMax));
116 reference_line_info->mutable_rss_info()->set_acc_lon_range_maximum(
117 static_cast<double>(dynamics.alphaLon.accelMax));
118 reference_line_info->mutable_rss_info()->set_acc_lat_left_range_minimum(
119 -1 * static_cast<double>(dynamics.alphaLat.brakeMin));
120 reference_line_info->mutable_rss_info()->set_acc_lat_left_range_maximum(
121 static_cast<double>(dynamics.alphaLat.accelMax));
122 reference_line_info->mutable_rss_info()->set_acc_lat_right_range_minimum(
123 -1 * static_cast<double>(dynamics.alphaLat.brakeMin));
124 reference_line_info->mutable_rss_info()->set_acc_lat_right_range_maximum(
125 static_cast<double>(dynamics.alphaLat.accelMax));
126
127 return Status::OK();
128 }
129
130#if RSS_FAKE_INPUT
131 nearest_obs_l_start = -4.2608;
132 nearest_obs_l_end = -1.42591;
133 ego_v_l_start = -1.05554;
134 ego_v_l_end = 1.08416;
135#endif
136 double lane_leftmost = std::max(ego_v_l_end, nearest_obs_l_end);
137 double lane_rightmost = std::min(ego_v_l_start, nearest_obs_l_start);
138 double lane_width = std::abs(lane_leftmost - lane_rightmost);
139 double lane_length = std::max(nearest_obs_s_end, ego_v_s_end);
140
141 rss_world_info.front_obs_dist = front_obstacle_distance;
142 rss_world_info.obs_s_start = nearest_obs_s_start;
143 rss_world_info.obs_s_end = nearest_obs_s_end;
144 rss_world_info.obs_l_start = nearest_obs_l_start;
145 rss_world_info.obs_l_end = nearest_obs_l_end;
146 rss_world_info.obs_speed = nearest_obs_speed;
147 rss_world_info.ego_v_s_start = ego_v_s_start;
148 rss_world_info.ego_v_s_end = ego_v_s_end;
149 rss_world_info.ego_v_l_start = ego_v_l_start;
150 rss_world_info.ego_v_l_end = ego_v_l_end;
151 rss_world_info.lane_leftmost = lane_leftmost;
152 rss_world_info.lane_rightmost = lane_rightmost;
153 rss_world_info.lane_width = lane_width;
154 rss_world_info.lane_length = lane_length;
155
156 Object followingObject;
157 Object leadingObject;
158 RoadArea roadArea;
159 Scene scene;
160
161 scene.situationType = ad_rss::situation::SituationType::SameDirection;
162
163 rss_create_other_object(&leadingObject, nearest_obs_speed, 0);
164
165 ad_rss::world::OccupiedRegion occupiedRegion_leading;
166 occupiedRegion_leading.segmentId = 0;
167 occupiedRegion_leading.lonRange.minimum =
168 ParametricValue(nearest_obs_s_start / lane_length);
169 occupiedRegion_leading.lonRange.maximum =
170 ParametricValue(nearest_obs_s_end / lane_length);
171 occupiedRegion_leading.latRange.minimum =
172 ParametricValue(std::abs(ego_v_l_end - lane_leftmost) / lane_width);
173 occupiedRegion_leading.latRange.maximum =
174 ParametricValue(std::abs(ego_v_l_start - lane_leftmost) / lane_width);
175
176 leadingObject.occupiedRegions.push_back(occupiedRegion_leading);
177
178 rss_world_info.OR_front_lon_min =
179 static_cast<double>(occupiedRegion_leading.lonRange.minimum);
180 rss_world_info.OR_front_lon_max =
181 static_cast<double>(occupiedRegion_leading.lonRange.maximum);
182 rss_world_info.OR_front_lat_min =
183 static_cast<double>(occupiedRegion_leading.latRange.minimum);
184 rss_world_info.OR_front_lat_max =
185 static_cast<double>(occupiedRegion_leading.latRange.maximum);
186
187 RssDecider::rss_create_ego_object(&followingObject, adc_velocity, 0.0);
188
189 ad_rss::world::OccupiedRegion occupiedRegion_following;
190 occupiedRegion_following.segmentId = 0;
191 occupiedRegion_following.lonRange.minimum =
192 ParametricValue(ego_v_s_start / lane_length);
193 occupiedRegion_following.lonRange.maximum =
194 ParametricValue(ego_v_s_end / lane_length);
195 occupiedRegion_following.latRange.minimum =
196 ParametricValue(std::abs(nearest_obs_l_end - lane_leftmost) / lane_width);
197 occupiedRegion_following.latRange.maximum = ParametricValue(
198 std::abs(nearest_obs_l_start - lane_leftmost) / lane_width);
199
200 followingObject.occupiedRegions.push_back(occupiedRegion_following);
201
202 rss_world_info.adc_vel = adc_velocity;
203 rss_world_info.OR_rear_lon_min =
204 static_cast<double>(occupiedRegion_following.lonRange.minimum);
205 rss_world_info.OR_rear_lon_max =
206 static_cast<double>(occupiedRegion_following.lonRange.maximum);
207 rss_world_info.OR_rear_lat_min =
208 static_cast<double>(occupiedRegion_following.latRange.minimum);
209 rss_world_info.OR_rear_lat_max =
210 static_cast<double>(occupiedRegion_following.latRange.maximum);
211
212 ad_rss::world::RoadSegment roadSegment;
213 ad_rss::world::LaneSegment laneSegment;
214
215 laneSegment.id = 0;
216 laneSegment.length.minimum = Distance(lane_length);
217 laneSegment.length.maximum = Distance(lane_length);
218 laneSegment.width.minimum = Distance(lane_width);
219 laneSegment.width.maximum = Distance(lane_width);
220
221 roadSegment.push_back(laneSegment);
222 roadArea.push_back(roadSegment);
223
224 rss_world_info.laneSeg_len_min =
225 static_cast<double>(laneSegment.length.minimum);
226 rss_world_info.laneSeg_len_max =
227 static_cast<double>(laneSegment.length.maximum);
228 rss_world_info.laneSeg_width_min =
229 static_cast<double>(laneSegment.width.minimum);
230 rss_world_info.laneSeg_width_max =
231 static_cast<double>(laneSegment.width.maximum);
232
233 ad_rss::world::WorldModel worldModel;
234 worldModel.egoVehicle = followingObject;
235 scene.object = leadingObject;
236 scene.egoVehicleRoad = roadArea;
237 worldModel.scenes.push_back(scene);
238 worldModel.timeIndex = frame->SequenceNum();
239
240 ad_rss::situation::SituationVector situationVector;
241 bool rss_result = ::ad_rss::core::RssSituationExtraction::extractSituations(
242 worldModel, situationVector);
243 if (!rss_result) {
244 rss_world_info.err_code = "ad_rss::extractSituation failed";
245 rss_dump_world_info(rss_world_info);
246 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
247 }
248
249 if (situationVector.empty()) {
250 rss_world_info.err_code = "situationVector unexpected empty";
251 rss_dump_world_info(rss_world_info);
252 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
253 }
254
255 ::ad_rss::state::ResponseStateVector responseStateVector;
256 ::ad_rss::core::RssSituationChecking RssCheck;
257 rss_result = RssCheck.checkSituations(situationVector, responseStateVector);
258
259 if (!rss_result) {
260 rss_world_info.err_code = "ad_rss::checkSituation failed";
261 rss_dump_world_info(rss_world_info);
262 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
263 }
264
265 if (responseStateVector.empty()) {
266 rss_world_info.err_code = "responseStateVector unexpected empty";
267 rss_dump_world_info(rss_world_info);
268 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
269 }
270
271 ::ad_rss::state::ResponseState properResponse;
272 ::ad_rss::core::RssResponseResolving RssResponse;
273 rss_result =
274 RssResponse.provideProperResponse(responseStateVector, properResponse);
275
276 if (!rss_result) {
277 rss_world_info.err_code = "ad_rss::provideProperResponse failed";
278 rss_dump_world_info(rss_world_info);
279 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
280 }
281
282 ::ad_rss::world::AccelerationRestriction accelerationRestriction;
283 rss_result = ad_rss::core::RssResponseTransformation::transformProperResponse(
284 worldModel, properResponse, accelerationRestriction);
285
286 if (!rss_result) {
287 rss_world_info.err_code = "ad_rss::transformProperResponse failed";
288 rss_dump_world_info(rss_world_info);
289 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
290 }
291
292 Distance const currentLonDistance =
293 situationVector[0].relativePosition.longitudinalDistance;
294 Distance safeLonDistance;
295 VehicleState const &leadingVehicleState =
296 situationVector[0].otherVehicleState;
297 VehicleState const &followingVehicleState =
298 situationVector[0].egoVehicleState;
299
300 rss_result =
301 ::ad_rss::situation::calculateSafeLongitudinalDistanceSameDirection(
302 leadingVehicleState, followingVehicleState, safeLonDistance);
303 if (!rss_result) {
304 rss_world_info.err_code =
305 ("ad_rss::calculateSafeLongitudinalDistanceSameDirection failed");
306 rss_dump_world_info(rss_world_info);
307 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.err_code);
308 }
309
310 if (responseStateVector[0].longitudinalState.isSafe) {
311 ADEBUG << "Task " << Name() << " Distance is RSS-Safe";
312 reference_line_info->mutable_rss_info()->set_is_rss_safe(true);
313 } else {
314 ADEBUG << "Task " << Name() << " Distance is not RSS-Safe";
315 reference_line_info->mutable_rss_info()->set_is_rss_safe(false);
316 if (config_.enable_rss_fallback()) {
317 reference_line_info->mutable_speed_data()->clear();
318 }
319 }
320
321 reference_line_info->mutable_rss_info()->set_cur_dist_lon(
322 static_cast<double>(currentLonDistance));
323 reference_line_info->mutable_rss_info()->set_rss_safe_dist_lon(
324 static_cast<double>(safeLonDistance));
325 reference_line_info->mutable_rss_info()->set_acc_lon_range_minimum(
326 static_cast<double>(accelerationRestriction.longitudinalRange.minimum));
327 reference_line_info->mutable_rss_info()->set_acc_lon_range_maximum(
328 static_cast<double>(accelerationRestriction.longitudinalRange.maximum));
329 reference_line_info->mutable_rss_info()->set_acc_lat_left_range_minimum(
330 static_cast<double>(accelerationRestriction.lateralLeftRange.minimum));
331 reference_line_info->mutable_rss_info()->set_acc_lat_left_range_maximum(
332 static_cast<double>(accelerationRestriction.lateralLeftRange.maximum));
333 reference_line_info->mutable_rss_info()->set_acc_lat_right_range_minimum(
334 static_cast<double>(accelerationRestriction.lateralRightRange.minimum));
335 reference_line_info->mutable_rss_info()->set_acc_lat_right_range_maximum(
336 static_cast<double>(accelerationRestriction.lateralRightRange.maximum));
337
338 ADEBUG << " longitudinalState.isSafe: "
339 << responseStateVector[0].longitudinalState.isSafe;
340 ADEBUG << " lateralStateLeft.isSafe: "
341 << responseStateVector[0].lateralStateLeft.isSafe;
342 ADEBUG << " lateralStateRight.isSafe: "
343 << responseStateVector[0].lateralStateRight.isSafe;
344 ADEBUG << " is_rss_safe : " << reference_line_info->rss_info().is_rss_safe();
345 ADEBUG << " cur_dist_lon: " << reference_line_info->rss_info().cur_dist_lon();
346 ADEBUG << " is_rss_safe : " << reference_line_info->rss_info().is_rss_safe();
347 ADEBUG << " cur_dist_lon: " << reference_line_info->rss_info().cur_dist_lon();
348 ADEBUG << " rss_safe_dist_lon: "
349 << reference_line_info->rss_info().rss_safe_dist_lon();
350 ADEBUG << " acc_longitudianlRange_minimum: "
351 << reference_line_info->rss_info().acc_lon_range_minimum();
352 ADEBUG << " acc_longitudinalRange_maximum: "
353 << reference_line_info->rss_info().acc_lon_range_maximum();
354 ADEBUG << " acc_lateralLeftRange_minimum: "
355 << reference_line_info->rss_info().acc_lat_left_range_minimum();
356 ADEBUG << " acc_lateralLeftRange_maximum: "
357 << reference_line_info->rss_info().acc_lat_left_range_maximum();
358 ADEBUG << " acc_lateralRightRange: "
359 << reference_line_info->rss_info().acc_lat_right_range_minimum();
360 ADEBUG << " acc_lateralRightRange_maximum: "
361 << reference_line_info->rss_info().acc_lat_right_range_maximum();
362
363 return Status::OK();
364}
365
366void RssDecider::rss_config_default_dynamics(
367 ::ad_rss::world::Dynamics *dynamics) {
368 dynamics->alphaLon.accelMax = ::ad_rss::physics::Acceleration(3.5);
369 dynamics->alphaLon.brakeMax = ::ad_rss::physics::Acceleration(8);
370 dynamics->alphaLon.brakeMin = ::ad_rss::physics::Acceleration(4.);
371 dynamics->alphaLon.brakeMinCorrect = ::ad_rss::physics::Acceleration(3.);
372 dynamics->alphaLat.accelMax = ::ad_rss::physics::Acceleration(0.2);
373 dynamics->alphaLat.brakeMin = ::ad_rss::physics::Acceleration(0.8);
374}
375
376void RssDecider::rss_create_ego_object(::ad_rss::world::Object *ego,
377 double vel_lon, double vel_lat) {
378 ego->objectId = 1;
379 ego->objectType = ::ad_rss::world::ObjectType::EgoVehicle;
380 ego->velocity.speedLon = Speed(vel_lon);
381 ego->velocity.speedLat = Speed(vel_lat);
382 rss_config_default_dynamics(&(ego->dynamics));
383 ego->responseTime = ::ad_rss::physics::Duration(1.);
384}
385
386void RssDecider::rss_create_other_object(::ad_rss::world::Object *other,
387 double vel_lon, double vel_lat) {
388 other->objectId = 0;
389 other->objectType = ::ad_rss::world::ObjectType::OtherVehicle;
390 other->velocity.speedLon = Speed(vel_lon);
391 other->velocity.speedLat = Speed(vel_lat);
392 rss_config_default_dynamics(&(other->dynamics));
393 other->responseTime = ::ad_rss::physics::Duration(2.);
394}
395
396void RssDecider::rss_dump_world_info(
397 const struct rss_world_model_struct &rss_info) {
398 AERROR << " RSS_INFO :"
399 << " front_obs_dist: " << rss_info.front_obs_dist
400 << " obs_s_start: " << rss_info.obs_s_start
401 << " obs_s_end: " << rss_info.obs_s_end
402 << " obs_l_start: " << rss_info.obs_l_start
403 << " obs_l_end: " << rss_info.obs_l_end
404 << " obs_speed: " << rss_info.obs_speed
405 << " ego_v_s_start: " << rss_info.ego_v_s_start
406 << " ego_v_s_end: " << rss_info.ego_v_s_end
407 << " ego_v_l_start: " << rss_info.ego_v_l_start
408 << " ego_v_l_end: " << rss_info.ego_v_l_end
409 << " lane_leftmost: " << rss_info.lane_leftmost
410 << " lane_rightmost: " << rss_info.lane_rightmost
411 << " lane_width: " << rss_info.lane_width
412 << " lane_length: " << rss_info.lane_length
413 << " OR_front_lon_min: " << rss_info.OR_front_lon_min
414 << " OR_front_lon_max: " << rss_info.OR_front_lon_max
415 << " OR_front_lat_min: " << rss_info.OR_front_lat_min
416 << " OR_front_lat_max: " << rss_info.OR_front_lat_max
417 << " OR_rear_lon_min: " << rss_info.OR_rear_lon_min
418 << " OR_rear_lon_max: " << rss_info.OR_rear_lon_max
419 << " OR_rear_lat_min: " << rss_info.OR_rear_lat_min
420 << " OR_rear_lat_max: " << rss_info.OR_rear_lat_max
421 << " adc_vel: " << rss_info.adc_vel
422 << " laneSeg_len_min: " << rss_info.laneSeg_len_min
423 << " laneSeg_len_max: " << rss_info.laneSeg_len_max
424 << " laneSeg_width_min: " << rss_info.laneSeg_width_min
425 << " laneSeg_width_max: " << rss_info.laneSeg_width_max;
426}
427
428} // namespace planning
429} // namespace apollo
A general class to denote the return status of an API call.
Definition status.h:43
static Status OK()
generate a success status.
Definition status.h:60
Frame holds all data for one planning cycle.
Definition frame.h:62
uint32_t SequenceNum() const
Definition frame.cc:423
const common::VehicleState & vehicle_state() const
Definition frame.cc:83
ReferenceLineInfo holds all data for one reference line.
const ReferenceLine & reference_line() const
const SLBoundary & AdcSlBoundary() const
bool HasOverlap(const common::math::Box2d &box) const
check if any part of the box has overlap with the road.
apollo::common::Status Execute(Frame *frame, ReferenceLineInfo *reference_line_info) override
bool Init(const std::string &config_dir, const std::string &name, const std::shared_ptr< DependencyInjector > &injector) override
const std::string & Name() const
Definition task.cc:58
virtual bool Init(const std::string &config_dir, const std::string &name, const std::shared_ptr< DependencyInjector > &injector)
Definition task.cc:40
Planning module main class.
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
double Distance(const Point &point1, const Point &point2)
class register implement
Definition arena_queue.h:37
optional double cur_dist_lon
optional double rss_safe_dist_lon
optional double acc_lat_right_range_maximum
optional double acc_lat_left_range_maximum
optional double acc_lat_left_range_minimum
optional double acc_lon_range_maximum
optional double acc_lon_range_minimum
optional double acc_lat_right_range_minimum
optional double rss_max_front_obstacle_distance