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;
41 const std::shared_ptr<DependencyInjector> &injector) {
46 return Task::LoadConfig<RssDeciderConfig>(&config_);
51 return Process(frame, reference_line_info);
57 CHECK_NOTNULL(reference_line_info);
61 const std::string msg =
"Empty path or speed data";
63 return Status(ErrorCode::PLANNING_ERROR, msg);
67 const PathDecision *path_decision = reference_line_info->
path_decision();
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;
79 for (
const auto *obstacle : path_decision->obstacles().Items()) {
80 if (obstacle->IsVirtual()) {
84 obstacle->PerceptionBoundingBox());
88 const auto &obstacle_sl = obstacle->PerceptionSLBoundary();
89 if (obstacle_sl.end_s() <= ego_v_s_start) {
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();
105 ::ad_rss::world::Dynamics dynamics;
106 rss_config_default_dynamics(&dynamics);
110 front_obstacle_distance);
112 front_obstacle_distance);
115 -1 *
static_cast<double>(dynamics.alphaLon.brakeMax));
117 static_cast<double>(dynamics.alphaLon.accelMax));
119 -1 *
static_cast<double>(dynamics.alphaLat.brakeMin));
121 static_cast<double>(dynamics.alphaLat.accelMax));
123 -1 *
static_cast<double>(dynamics.alphaLat.brakeMin));
125 static_cast<double>(dynamics.alphaLat.accelMax));
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;
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);
143 rss_world_info.
obs_s_end = nearest_obs_s_end;
145 rss_world_info.
obs_l_end = nearest_obs_l_end;
146 rss_world_info.
obs_speed = nearest_obs_speed;
156 Object followingObject;
157 Object leadingObject;
161 scene.situationType = ad_rss::situation::SituationType::SameDirection;
163 rss_create_other_object(&leadingObject, nearest_obs_speed, 0);
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);
176 leadingObject.occupiedRegions.push_back(occupiedRegion_leading);
179 static_cast<double>(occupiedRegion_leading.lonRange.minimum);
181 static_cast<double>(occupiedRegion_leading.lonRange.maximum);
183 static_cast<double>(occupiedRegion_leading.latRange.minimum);
185 static_cast<double>(occupiedRegion_leading.latRange.maximum);
187 RssDecider::rss_create_ego_object(&followingObject, adc_velocity, 0.0);
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);
200 followingObject.occupiedRegions.push_back(occupiedRegion_following);
202 rss_world_info.
adc_vel = adc_velocity;
204 static_cast<double>(occupiedRegion_following.lonRange.minimum);
206 static_cast<double>(occupiedRegion_following.lonRange.maximum);
208 static_cast<double>(occupiedRegion_following.latRange.minimum);
210 static_cast<double>(occupiedRegion_following.latRange.maximum);
212 ad_rss::world::RoadSegment roadSegment;
213 ad_rss::world::LaneSegment laneSegment;
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);
221 roadSegment.push_back(laneSegment);
222 roadArea.push_back(roadSegment);
225 static_cast<double>(laneSegment.length.minimum);
227 static_cast<double>(laneSegment.length.maximum);
229 static_cast<double>(laneSegment.width.minimum);
231 static_cast<double>(laneSegment.width.maximum);
233 ad_rss::world::WorldModel worldModel;
234 worldModel.egoVehicle = followingObject;
235 scene.object = leadingObject;
236 scene.egoVehicleRoad = roadArea;
237 worldModel.scenes.push_back(scene);
240 ad_rss::situation::SituationVector situationVector;
241 bool rss_result = ::ad_rss::core::RssSituationExtraction::extractSituations(
242 worldModel, situationVector);
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);
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);
255 ::ad_rss::state::ResponseStateVector responseStateVector;
256 ::ad_rss::core::RssSituationChecking RssCheck;
257 rss_result = RssCheck.checkSituations(situationVector, responseStateVector);
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);
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);
271 ::ad_rss::state::ResponseState properResponse;
272 ::ad_rss::core::RssResponseResolving RssResponse;
274 RssResponse.provideProperResponse(responseStateVector, properResponse);
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);
282 ::ad_rss::world::AccelerationRestriction accelerationRestriction;
283 rss_result = ad_rss::core::RssResponseTransformation::transformProperResponse(
284 worldModel, properResponse, accelerationRestriction);
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);
293 situationVector[0].relativePosition.longitudinalDistance;
295 VehicleState
const &leadingVehicleState =
296 situationVector[0].otherVehicleState;
297 VehicleState
const &followingVehicleState =
298 situationVector[0].egoVehicleState;
301 ::ad_rss::situation::calculateSafeLongitudinalDistanceSameDirection(
302 leadingVehicleState, followingVehicleState, safeLonDistance);
305 (
"ad_rss::calculateSafeLongitudinalDistanceSameDirection failed");
306 rss_dump_world_info(rss_world_info);
307 return Status(ErrorCode::PLANNING_ERROR, rss_world_info.
err_code);
310 if (responseStateVector[0].longitudinalState.isSafe) {
311 ADEBUG <<
"Task " <<
Name() <<
" Distance is RSS-Safe";
314 ADEBUG <<
"Task " <<
Name() <<
" Distance is not RSS-Safe";
322 static_cast<double>(currentLonDistance));
324 static_cast<double>(safeLonDistance));
326 static_cast<double>(accelerationRestriction.longitudinalRange.minimum));
328 static_cast<double>(accelerationRestriction.longitudinalRange.maximum));
330 static_cast<double>(accelerationRestriction.lateralLeftRange.minimum));
332 static_cast<double>(accelerationRestriction.lateralLeftRange.maximum));
334 static_cast<double>(accelerationRestriction.lateralRightRange.minimum));
336 static_cast<double>(accelerationRestriction.lateralRightRange.maximum));
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;
348 ADEBUG <<
" rss_safe_dist_lon: "
350 ADEBUG <<
" acc_longitudianlRange_minimum: "
352 ADEBUG <<
" acc_longitudinalRange_maximum: "
354 ADEBUG <<
" acc_lateralLeftRange_minimum: "
356 ADEBUG <<
" acc_lateralLeftRange_maximum: "
358 ADEBUG <<
" acc_lateralRightRange: "
360 ADEBUG <<
" acc_lateralRightRange_maximum: "
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);
376void RssDecider::rss_create_ego_object(::ad_rss::world::Object *ego,
377 double vel_lon,
double vel_lat) {
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.);
386void RssDecider::rss_create_other_object(::ad_rss::world::Object *other,
387 double vel_lon,
double vel_lat) {
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.);
396void RssDecider::rss_dump_world_info(
397 const struct rss_world_model_struct &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;
A general class to denote the return status of an API call.
static Status OK()
generate a success status.
Frame holds all data for one planning cycle.
uint32_t SequenceNum() const
const common::VehicleState & vehicle_state() const
ReferenceLineInfo holds all data for one reference line.
PathDecision * path_decision()
const SpeedData & speed_data() const
SpeedData * mutable_speed_data()
const RSSInfo & rss_info() const
RSSInfo * mutable_rss_info()
const ReferenceLine & reference_line() const
const PathData & path_data() 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.
const std::string & Name() const
virtual bool Init(const std::string &config_dir, const std::string &name, const std::shared_ptr< DependencyInjector > &injector)
Planning module main class.
double Distance(const Point &point1, const Point &point2)
double Speed(const Point &point)
optional double linear_velocity