56void printRoute(std::string
const &route_descr, ::ad::map::route::FullRoute
const &route) {
58 std::cout << route_descr << std::endl;
60 for (
auto road_segment : route.roadSegments) {
62 for (
auto lane_segment : road_segment.drivableLaneSegments) {
67 std::cout <<
"(" <<
static_cast<uint64_t
>(lane_segment.laneInterval.laneId) <<
" | " << std::setprecision(2)
68 <<
static_cast<double>(lane_segment.laneInterval.start) <<
":"
69 <<
static_cast<double>(lane_segment.laneInterval.end) <<
") ";
72 std::cout << std::endl;
77constexpr float to_radians =
static_cast<float>(M_PI) / 180.0f;
81 : time_since_epoch_check_start_ms(0.),
82 time_since_epoch_check_end_ms(0.),
84 min_stopping_distance(0.),
85 ego_center({0., 0., 0.}),
87 ego_heading_change(0.),
88 ego_steering_angle(0.),
89 ego_center_within_route(
false),
90 crossing_border(
false),
92 route_nominal_center({0., 0., 0.}),
98 avg_route_accel_lat(0.),
99 avg_route_accel_lon(0.) {
101 timestamp.elapsed_seconds = 0.;
105 static auto logger = spdlog::stdout_color_mt(
"RssCheck");
110 static auto logger = spdlog::stdout_color_mt(
"RssCheckTiming");
115 ::ad::rss::world::RssDynamics default_ego_vehicle_dynamics;
117 default_ego_vehicle_dynamics.alphaLon.accelMax = ::ad::physics::Acceleration(3.5);
119 default_ego_vehicle_dynamics.alphaLon.brakeMax = ::ad::physics::Acceleration(-8.);
121 default_ego_vehicle_dynamics.alphaLon.brakeMin = ::ad::physics::Acceleration(-4.);
123 default_ego_vehicle_dynamics.alphaLon.brakeMinCorrect = ::ad::physics::Acceleration(-3);
125 default_ego_vehicle_dynamics.alphaLat.accelMax = ::ad::physics::Acceleration(0.2);
127 default_ego_vehicle_dynamics.alphaLat.brakeMin = ::ad::physics::Acceleration(-0.8);
129 default_ego_vehicle_dynamics.lateralFluctuationMargin = ::ad::physics::Distance(0.1);
131 default_ego_vehicle_dynamics.responseTime = ::ad::physics::Duration(1.0);
133 default_ego_vehicle_dynamics.maxSpeedOnAcceleration = ::ad::physics::Speed(100.);
135 default_ego_vehicle_dynamics.unstructuredSettings.pedestrianTurningRadius = ad::physics::Distance(2.0);
137 default_ego_vehicle_dynamics.unstructuredSettings.driveAwayMaxAngle = ad::physics::Angle(2.4);
139 default_ego_vehicle_dynamics.unstructuredSettings.vehicleYawRateChange = ad::physics::AngularAcceleration(0.3);
141 default_ego_vehicle_dynamics.unstructuredSettings.vehicleMinRadius = ad::physics::Distance(3.5);
143 default_ego_vehicle_dynamics.unstructuredSettings.vehicleTrajectoryCalculationStep = ad::physics::Duration(0.2);
144 return default_ego_vehicle_dynamics;
148 ::ad::rss::world::RssDynamics default_pedestrian_dynamics;
150 default_pedestrian_dynamics.alphaLon.accelMax = ::ad::physics::Acceleration(2.0);
152 default_pedestrian_dynamics.alphaLon.brakeMax = ::ad::physics::Acceleration(-4.);
154 default_pedestrian_dynamics.alphaLon.brakeMin = ::ad::physics::Acceleration(-2.);
156 default_pedestrian_dynamics.alphaLon.brakeMinCorrect = ::ad::physics::Acceleration(-2.);
158 default_pedestrian_dynamics.alphaLat.accelMax = ::ad::physics::Acceleration(0.001);
159 / 设置行人横向最小刹车加速度,这里设置为 -0.001
160 default_pedestrian_dynamics.alphaLat.brakeMin = ::ad::physics::Acceleration(-0.001);
162 default_pedestrian_dynamics.lateralFluctuationMargin = ::ad::physics::Distance(0.1);
164 default_pedestrian_dynamics.responseTime = ::ad::physics::Duration(0.5);
166 default_pedestrian_dynamics.maxSpeedOnAcceleration = ::ad::physics::Speed(10.);
168 default_pedestrian_dynamics.unstructuredSettings.pedestrianTurningRadius = ad::physics::Distance(2.0);
170 default_pedestrian_dynamics.unstructuredSettings.driveAwayMaxAngle = ad::physics::Angle(2.4);
172 default_pedestrian_dynamics.unstructuredSettings.vehicleYawRateChange = ad::physics::AngularAcceleration(0.3);
174 default_pedestrian_dynamics.unstructuredSettings.vehicleMinRadius = ad::physics::Distance(3.5);
176 default_pedestrian_dynamics.unstructuredSettings.vehicleTrajectoryCalculationStep = ad::physics::Duration(0.2);
178 return default_pedestrian_dynamics;
183 : _maximum_steering_angle(maximum_steering_angle), _road_boundaries_mode(GetDefaultRoadBoundariesMode()) {
211 ::ad::rss::map::RssSceneCreation::RestrictSpeedLimitMode::IncreasedSpeedLimit10;
212 actor_constellation_result.
actor_object_type = ad::rss::world::ObjectType::Invalid;
216 if (actor_constellation_data->other_actor !=
nullptr) {
217 if (boost::dynamic_pointer_cast<carla::client::Walker>(actor_constellation_data->other_actor) !=
nullptr) {
219 actor_constellation_result.
actor_object_type = ad::rss::world::ObjectType::Pedestrian;
221 }
else if (boost::dynamic_pointer_cast<carla::client::Vehicle>(actor_constellation_data->other_actor) !=
224 actor_constellation_result.
actor_object_type = ad::rss::world::ObjectType::OtherVehicle;
226 if (
GetSpeed(*actor_constellation_data->other_actor) == ::ad::physics::Speed(0.)) {
233 actor_constellation_result.
actor_dynamics.alphaLon.accelMax = ::ad::physics::Acceleration(0.);
245 auto const abs_avg_route_accel_lat = std::fabs(actor_constellation_data->ego_dynamics_on_route.avg_route_accel_lat);
246 if (abs_avg_route_accel_lat > actor_constellation_result.
ego_vehicle_dynamics.alphaLat.accelMax) {
248 std::min(ad::physics::Acceleration(20.), abs_avg_route_accel_lat);
250 return actor_constellation_result;
256 _logger->debug(
"RssCheck with default actor constellation callback created");
266 : _maximum_steering_angle(maximum_steering_angle),
267 _actor_constellation_callback(rss_actor_constellation_callback),
268 _road_boundaries_mode(GetDefaultRoadBoundariesMode()) {
284 _logger->debug(
"RssCheck created");
290 spdlog::set_level(log_level);
295 ::ad::map::access::getLogger()->set_level(map_log_level);
296 ::ad::rss::map::getLogger()->set_level(map_log_level);
304 const ::ad::rss::world::RssDynamics &ego_vehicle_dynamics) {
313 const ::ad::rss::world::RssDynamics &other_vehicle_dynamics) {
322 const ::ad::rss::world::RssDynamics &pedestrian_dynamics) {
336 ::ad::map::point::createENUPoint(routing_target.
location.
x, -1. * routing_target.
location.
y, 0.));
341 std::vector<::carla::geom::Transform> routing_targets;
346 routing_target.
location.
x =
static_cast<float>(target.x);
347 routing_target.
location.
y =
static_cast<float>(-target.y);
349 routing_targets.push_back(routing_target);
352 return routing_targets;
378 ::ad::rss::state::ProperResponse &output_response,
379 ::ad::rss::state::RssStateSnapshot &output_rss_state_snapshot,
380 ::ad::rss::situation::SituationSnapshot &output_situation_snapshot,
381 ::ad::rss::world::WorldModel &output_world_model,
386 double const time_since_epoch_check_start_ms =
387 std::chrono::duration<double, std::milli>(std::chrono::system_clock::now().time_since_epoch()).count();
391 auto t_start = std::chrono::high_resolution_clock::now();
392 auto t_end = std::chrono::high_resolution_clock::now();
393 std::cout <<
"-> SC " << std::chrono::duration<double, std::milli>(t_end - t_start).count() <<
" start checkObjects"
397 const auto carla_ego_vehicle = boost::dynamic_pointer_cast<carla::client::Vehicle>(carla_ego_actor);
398 if (carla_ego_vehicle ==
nullptr) {
400 _logger->error(
"RSS Sensor only support vehicles as ego.");
404 t_end = std::chrono::high_resolution_clock::now();
405 std::cout <<
"-> ME " << std::chrono::duration<double, std::milli>(t_end - t_start).count()
406 <<
" before MapMatching" << std::endl;
411 auto const ego_match_object =
GetMatchObject(carla_ego_actor, ::ad::physics::Distance(2.0));
415 auto const travelled_distance = ::ad::map::point::distance(
417 if (travelled_distance > ::ad::physics::Distance(10.)) {
419 _logger->warn(
"Jump in ego vehicle position detected {} -> {}! Force reroute!",
421 ego_match_object.enuPosition.centerPoint);
432 t_end = std::chrono::high_resolution_clock::now();
433 std::cout <<
"-> ME " << std::chrono::duration<double, std::milli>(t_end - t_start).count()
434 <<
" after ego MapMatching" << std::endl;
440 t_end = std::chrono::high_resolution_clock::now();
441 std::cout <<
"-> RU " << std::chrono::duration<double, std::milli>(t_end - t_start).count()
442 <<
" after route update " << std::endl;
455 t_end = std::chrono::high_resolution_clock::now();
456 std::cout <<
"-> WM " << std::chrono::duration<double, std::milli>(t_end - t_start).count()
457 <<
" after create world model " << std::endl;
463 t_end = std::chrono::high_resolution_clock::now();
464 std::cout <<
"-> CH " << std::chrono::duration<double, std::milli>(t_end - t_start).count() <<
" end RSS check"
471 t_end = std::chrono::high_resolution_clock::now();
472 std::cout <<
"-> AN " << std::chrono::duration<double, std::milli>(t_end - t_start).count()
473 <<
" end analyze results" << std::endl;
477 std::chrono::duration<double, std::milli>(std::chrono::system_clock::now().time_since_epoch()).count();
491 _logger->debug(
"===== ROUTE NOT SAFE =====");
493 _logger->debug(
"===== ROUTE SAFE =====");
497 t_end = std::chrono::high_resolution_clock::now();
498 std::cout <<
"-> EC " << std::chrono::duration<double, std::milli>(t_end - t_start).count() <<
" end check objects"
503 _logger->error(
"Exception -> Check failed");
510 ::ad::physics::Distance
const &sampling_distance)
const {
512 ::ad::map::match::Object match_object;
514 auto const vehicle_transform = actor->GetTransform();
516 match_object.enuPosition.centerPoint.x = ::ad::map::point::ENUCoordinate(vehicle_transform.location.x);
518 match_object.enuPosition.centerPoint.y = ::ad::map::point::ENUCoordinate(-1. * vehicle_transform.location.y);
520 match_object.enuPosition.centerPoint.z = ::ad::map::point::ENUCoordinate(0.);
522 match_object.enuPosition.heading =
523 ::ad::map::point::createENUHeading(-1 * vehicle_transform.rotation.yaw *
to_radians);
525 auto const vehicle = boost::dynamic_pointer_cast<carla::client::Vehicle>(actor);
527 auto const walker = boost::dynamic_pointer_cast<carla::client::Walker>(actor);
528 if (vehicle !=
nullptr) {
530 const auto &bounding_box = vehicle->GetBoundingBox();
532 match_object.enuPosition.dimension.length = ::ad::physics::Distance(2 * bounding_box.extent.x);
534 match_object.enuPosition.dimension.width = ::ad::physics::Distance(2 * bounding_box.extent.y);
536 match_object.enuPosition.dimension.height = ::ad::physics::Distance(2 * bounding_box.extent.z);
537 }
else if (walker !=
nullptr) {
539 const auto &bounding_box = walker->GetBoundingBox();
541 match_object.enuPosition.dimension.length = ::ad::physics::Distance(2 * bounding_box.extent.x);
542 match_object.enuPosition.dimension.width = ::ad::physics::Distance(2 * bounding_box.extent.y);
543 match_object.enuPosition.dimension.height = ::ad::physics::Distance(2 * bounding_box.extent.z);
546 _logger->error(
"Could not get bounding box of actor {}", actor->GetId());
549 match_object.enuPosition.enuReferencePoint = ::ad::map::access::getENUReferencePoint();
551 ::ad::map::match::AdMapMatching map_matching;
553 match_object.mapMatchedBoundingBox =
554 map_matching.getMapMatchedBoundingBox(match_object.enuPosition, sampling_distance);
567 ::ad::physics::Speed speed(std::sqrt(velocity.x * velocity.x + velocity.y * velocity.y));
569 if (velocity.x < 0.) {
578 ::ad::physics::AngularVelocity heading_change(-1. * angular_velocity.z *
to_radians);
579 return heading_change;
585 return steering_angle;
595 ::ad::map::point::ParaPointList all_lane_matches;
596 for (
auto reference_point :
597 {::ad::map::match::ObjectReferencePoints::RearRight, ::ad::map::match::ObjectReferencePoints::RearLeft}) {
598 auto const &reference_position =
600 auto const para_points = ::ad::map::match::getParaPoints(reference_position);
601 all_lane_matches.insert(all_lane_matches.end(), para_points.begin(), para_points.end());
604 auto shorten_route_result = ::ad::map::route::shortenRoute(
605 all_lane_matches, carla_rss_state.
ego_route,
606 ::ad::map::route::ShortenRouteMode::DontCutIntersectionAndPrependIfSucceededBeforeRoute);
607 if (shorten_route_result == ::ad::map::route::ShortenRouteResult::SucceededIntersectionNotCut) {
608 shorten_route_result = ::ad::map::route::ShortenRouteResult::Succeeded;
611 bool routing_target_check_finished =
false;
614 auto const &distance_to_next_target =
615 ::ad::map::point::distance(next_target, carla_rss_state.
ego_match_object.enuPosition.centerPoint);
616 if (distance_to_next_target < ::ad::physics::Distance(3.)) {
620 routing_target_check_finished =
true;
624 bool reroute_required =
false;
626 reroute_required =
true;
634 ::ad::physics::Distance
const route_target_length(50.);
636 if ((!reroute_required) && (shorten_route_result == ::ad::map::route::ShortenRouteResult::Succeeded)) {
637 std::vector<::ad::map::route::FullRoute> additional_routes;
638 auto const route_valid =
639 ::ad::map::route::extendRouteToDistance(carla_rss_state.
ego_route, route_target_length, additional_routes);
642 if (additional_routes.size() > 0u) {
644 std::size_t route_index =
static_cast<std::size_t
>(std::rand()) % (additional_routes.size() + 1);
645 if (route_index < additional_routes.size()) {
647 _logger->debug(
"Additional Routes: {}->{}", additional_routes.size(), route_index);
648 carla_rss_state.
ego_route = additional_routes[route_index];
651 _logger->debug(
"Additional Routes: expand current");
655 reroute_required =
true;
659 reroute_required =
true;
663 if (reroute_required) {
666 std::vector<::ad::map::route::FullRoute> all_new_routes;
668 for (
const auto &position :
670 .referencePointPositions[int32_t(::ad::map::match::ObjectReferencePoints::Center)]) {
672 auto start_point = position.lanePoint.paraPoint;
674 auto projected_start_point = start_point;
675 if (!::ad::map::lane::isHeadingInLaneDirection(start_point,
678 _logger->debug(
"EgoVehicle heading in opposite lane direction");
680 if (::ad::map::lane::projectPositionToLaneInHeadingDirection(
681 start_point, carla_rss_state.
ego_match_object.enuPosition.heading, projected_start_point)) {
683 _logger->debug(
"Projected to lane {}", projected_start_point.laneId);
687 _logger->debug(
"Route start_point: {}, projected_start_point: {}", start_point, projected_start_point);
689 auto routing_start_point = ::ad::map::route::planning::createRoutingPoint(
690 projected_start_point, carla_rss_state.
ego_match_object.enuPosition.heading);
694 auto new_route = ::ad::map::route::planning::planRoute(routing_start_point,
_routing_targets,
695 ::ad::map::route::RouteCreationMode::AllRoutableLanes);
697 all_new_routes.push_back(new_route);
700 auto new_routes = ::ad::map::route::planning::predictRoutesOnDistance(
701 routing_start_point, route_target_length, ::ad::map::route::RouteCreationMode::AllRoutableLanes);
703 for (
const auto &new_route : new_routes) {
705 all_new_routes.push_back(new_route);
710 _logger->debug(
"New routes: {}", all_new_routes.size());
712 if (!all_new_routes.empty()) {
716 std::size_t route_index =
static_cast<std::size_t
>(std::rand()) % (all_new_routes.size());
718 carla_rss_state.
ego_route = all_new_routes[route_index];
729 ::ad::map::route::FullRoute
const &route, ::ad::rss::world::RssDynamics
const &default_ego_vehicle_dynamics,
734 new_dynamics.
timestamp = current_timestamp;
740 new_dynamics.
ego_center = match_object.enuPosition.centerPoint;
742 new_dynamics.
ego_heading = match_object.enuPosition.heading;
749 ::ad::map::route::getRouteSection(match_object, route, ::ad::map::route::RouteSectionCreationMode::AllRouteLanes);
751 auto border = ::ad::map::route::getENUBorderOfRoute(object_route);
752 new_dynamics.
route_heading = ::ad::map::lane::getENUHeading(border, match_object.enuPosition.centerPoint);
755 auto const object_center = ::ad::map::route::findCenterWaypoint(match_object, object_route);
756 if (object_center.isValid()) {
759 auto lane_center_point = object_center.queryPosition;
761 auto lane_center_point_enu = ::ad::map::lane::getENULanePoint(lane_center_point);
763 if (std::fabs(new_dynamics.
route_heading) > ::ad::map::point::ENUHeading(M_PI)) {
766 new_dynamics.
route_heading = ::ad::map::lane::getENUHeading(border, lane_center_point_enu);
769 if (object_center.laneSegmentIterator->laneInterval.wrongWay) {
772 ::ad::map::lane::projectPositionToLaneInHeadingDirection(lane_center_point, new_dynamics.
route_heading,
774 lane_center_point_enu = ::ad::map::lane::getENULanePoint(lane_center_point);
794 bool keep_last_acceleration =
true;
798 ::ad::physics::Duration
const delta_time(current_timestamp.
elapsed_seconds -
801 if (delta_time > ::ad::physics::Duration(0.0001)) {
824 keep_last_acceleration =
false;
830 if (keep_last_acceleration) {
839 ::ad::map::point::ParaPointList in_lane_matches;
840 for (
auto &match_position : match_object.mapMatchedBoundingBox
841 .referencePointPositions[int32_t(::ad::map::match::ObjectReferencePoints::Center)]) {
842 if (match_position.type == ::ad::map::match::MapMatchedPositionType::LANE_IN) {
843 in_lane_matches.push_back(match_position.lanePoint.paraPoint);
846 auto const object_in_lane_center = ::ad::map::route::findNearestWaypoint(in_lane_matches, route);
853 ::ad::rss::map::RssObjectData ego_object_data;
854 ego_object_data.id = ::ad::rss::world::ObjectId(0u);
855 ego_object_data.type = ::ad::rss::world::ObjectType::EgoVehicle;
856 ego_object_data.matchObject = match_object;
857 ego_object_data.speed = new_dynamics.
ego_speed;
860 ego_object_data.rssDynamics = default_ego_vehicle_dynamics;
862 ad::rss::map::RssObjectConversion object_conversion(ego_object_data);
865 "CalculateEgoDynamicsOnRoute: calculation of min stopping distance "
866 "failed. Setting to 100. ({} {} {} {})",
868 default_ego_vehicle_dynamics);
872 _logger->trace(
"CalculateEgoDynamicsOnRoute: route-section {} -> dynamics: {}", object_route, new_dynamics);
877 ::ad::map::match::Object other_match_object;
885::ad::map::landmark::LandmarkIdSet RssCheck::GetGreenTrafficLightsOnRoute(
887 ::ad::map::route::FullRoute
const &route)
const {
888 ::ad::map::landmark::LandmarkIdSet green_traffic_lights;
890 auto next_intersection = ::ad::map::intersection::Intersection::getNextIntersectionOnRoute(route);
891 if (next_intersection &&
892 (next_intersection->intersectionType() == ::ad::map::intersection::IntersectionType::TrafficLight)) {
897 auto incoming_lanes = next_intersection->incomingLanesOnRoute();
900 auto incoming_lanes_iter = incoming_lanes.begin();
901 while (incoming_lanes_iter != incoming_lanes.end()) {
902 auto find_waypoint = ::ad::map::route::findWaypoint(*incoming_lanes_iter, route);
903 if (find_waypoint.isValid() && find_waypoint.laneSegmentIterator->laneInterval.wrongWay) {
904 incoming_lanes_iter = incoming_lanes.erase(incoming_lanes_iter);
906 incoming_lanes_iter++;
910 ::ad::map::match::AdMapMatching traffic_light_map_matching;
911 bool found_relevant_traffic_light =
false;
912 for (
const auto &traffic_light : traffic_lights) {
913 auto traffic_light_state = traffic_light->GetState();
916 auto traffic_light_transform = traffic_light->GetTransform();
917 auto trigger_box_location = trigger_bounding_box.
location;
918 traffic_light_transform.TransformPoint(trigger_box_location);
920 ::ad::map::point::ENUPoint trigger_box_position;
921 trigger_box_position.
x = ::ad::map::point::ENUCoordinate(trigger_box_location.x);
922 trigger_box_position.y = ::ad::map::point::ENUCoordinate(-1 * trigger_box_location.y);
923 trigger_box_position.z = ::ad::map::point::ENUCoordinate(0.);
925 _logger->trace(
"traffic light[{}] Position: {}", traffic_light->GetId(), trigger_box_position);
926 auto traffic_light_map_matched_positions = traffic_light_map_matching.getMapMatchedPositions(
927 trigger_box_position, ::ad::physics::Distance(0.25), ::ad::physics::Probability(0.1));
929 _logger->trace(
"traffic light[{}] Map Matched Position: {}", traffic_light->GetId(),
930 traffic_light_map_matched_positions);
932 for (
auto matched_position : traffic_light_map_matched_positions) {
933 if (incoming_lanes.find(matched_position.lanePoint.paraPoint.laneId) != incoming_lanes.end()) {
934 if (found_relevant_traffic_light &&
936 _logger->warn(
"found another relevant traffic light on lane {}; {} state {}",
937 matched_position.lanePoint.paraPoint.laneId, traffic_light->GetId(),
940 _logger->debug(
"found relevant traffic light on lane {}; {} state {}",
941 matched_position.lanePoint.paraPoint.laneId, traffic_light->GetId(),
945 found_relevant_traffic_light =
true;
951 green_traffic_lights.insert(::ad::map::landmark::LandmarkId::getMax());
954 green_traffic_lights.clear();
961 return green_traffic_lights;
965 ::ad::rss::map::RssSceneCreation &scene_creation,
968 ::ad::map::landmark::LandmarkIdSet
const &green_traffic_lights)
969 : _rss_check(rss_check),
970 _scene_creation(scene_creation),
971 _carla_ego_vehicle(carla_ego_vehicle),
972 _carla_rss_state(carla_rss_state),
973 _green_traffic_lights(green_traffic_lights) {}
978 auto other_match_object = _rss_check.GetMatchObject(other_traffic_participant, ::ad::physics::Distance(2.0));
980 _rss_check._logger->trace(
"OtherVehicleMapMatching: {} {}", other_traffic_participant->GetId(),
981 other_match_object.mapMatchedBoundingBox);
985 other_match_object, other_traffic_participant}};
986 auto const actor_constellation_result = _rss_check._actor_constellation_callback(actor_constellation_data);
988 auto other_speed = _rss_check.GetSpeed(*other_traffic_participant);
989 auto other_heading_change = _rss_check.GetHeadingChange(*other_traffic_participant);
990 auto other_steering_angle = ::ad::physics::Angle(0.);
992 ::ad::rss::map::RssObjectData ego_object_data;
993 ego_object_data.id = _carla_ego_vehicle.GetId();
994 ego_object_data.type = ::ad::rss::world::ObjectType::EgoVehicle;
999 ego_object_data.rssDynamics = actor_constellation_result.ego_vehicle_dynamics;
1001 ::ad::rss::map::RssObjectData other_object_data;
1002 other_object_data.id = ::ad::rss::world::ObjectId(other_traffic_participant->GetId());
1003 other_object_data.type = actor_constellation_result.actor_object_type;
1004 other_object_data.matchObject = other_match_object;
1005 other_object_data.speed = other_speed;
1006 other_object_data.yawRate = other_heading_change;
1007 other_object_data.steeringAngle = other_steering_angle;
1008 other_object_data.rssDynamics = actor_constellation_result.actor_dynamics;
1011 actor_constellation_result.restrict_speed_limit_mode, _green_traffic_lights,
1012 actor_constellation_result.rss_calculation_mode);
1015 _rss_check._logger->error(
"Exception processing other traffic participant {} -> Ignoring it",
1016 other_traffic_participant->GetId());
1023 std::vector<SharedPtr<carla::client::TrafficLight>> traffic_lights;
1024 std::vector<SharedPtr<carla::client::Actor>> other_traffic_participants;
1025 for (
const auto &actor : actors) {
1026 const auto traffic_light = boost::dynamic_pointer_cast<carla::client::TrafficLight>(actor);
1027 if (traffic_light !=
nullptr) {
1028 traffic_lights.push_back(traffic_light);
1032 if ((boost::dynamic_pointer_cast<carla::client::Vehicle>(actor) !=
nullptr) ||
1033 (boost::dynamic_pointer_cast<carla::client::Walker>(actor) !=
nullptr)) {
1034 if (actor->GetId() == carla_ego_vehicle.
GetId()) {
1037 auto const relevant_distance =
1039 if (actor->GetTransform().location.Distance(carla_ego_vehicle.
GetTransform().
location) < relevant_distance) {
1040 other_traffic_participants.push_back(actor);
1045 ::ad::map::landmark::LandmarkIdSet green_traffic_lights =
1046 GetGreenTrafficLightsOnRoute(traffic_lights, carla_rss_state.
ego_route);
1051 tbb::parallel_for_each(
1052 other_traffic_participants.begin(), other_traffic_participants.end(),
1053 RssObjectChecker(*
this, scene_creation, carla_ego_vehicle, carla_rss_state, green_traffic_lights));
1055 for (
auto const traffic_participant : other_traffic_participants) {
1056 auto checker =
RssObjectChecker(*
this, scene_creation, carla_ego_vehicle, carla_rss_state, green_traffic_lights);
1057 checker(traffic_participant);
1065 ego_vehicle_dynamics.alphaLat.accelMax = ::ad::physics::Acceleration(0.);
1067 ::ad::rss::map::RssObjectData ego_object_data;
1068 ego_object_data.id = carla_ego_vehicle.
GetId();
1069 ego_object_data.type = ::ad::rss::world::ObjectType::EgoVehicle;
1074 ego_object_data.rssDynamics = ego_vehicle_dynamics;
1075 scene_creation.appendRoadBoundaries(ego_object_data, carla_rss_state.
ego_route,
1078 ::ad::rss::map::RssSceneCreation::AppendRoadBoundariesMode::RouteOnly);
1081 carla_rss_state.
world_model = scene_creation.getWorldModel();
1084bool RssCheck::PerformCheck(CarlaRssState &carla_rss_state)
const {
1087 bool result = carla_rss_state.rss_check.calculateProperResponse(
1088 carla_rss_state.world_model, carla_rss_state.situation_snapshot, carla_rss_state.rss_state_snapshot,
1089 carla_rss_state.proper_response);
1093 _logger->warn(
"calculateProperResponse failed!");
1096 else if (!carla_rss_state.proper_response.isSafe) {
1098 _logger->info(
"Unsafe route: {}", carla_rss_state.proper_response);
1105void RssCheck::AnalyseCheckResults(CarlaRssState &carla_rss_state)
const {
1107 carla_rss_state.dangerous_state =
false;
1109 carla_rss_state.dangerous_vehicle =
false;
1111 carla_rss_state.dangerous_opposite_state =
false;
1113 bool left_border_is_dangerous =
false;
1115 bool right_border_is_dangerous =
false;
1117 bool vehicle_triggered_left_response =
false;
1119 bool vehicle_triggered_right_response =
false;
1121 bool vehicle_triggered_longitudinal_response =
false;
1123 for (
auto const state : carla_rss_state.rss_state_snapshot.individualResponses) {
1125 if (::ad::rss::state::isDangerous(state)) {
1127 carla_rss_state.dangerous_state =
true;
1129 _logger->trace(
"DangerousState: {}", state);
1132 auto dangerous_sitation_iter = std::find_if(carla_rss_state.situation_snapshot.situations.begin(),
1133 carla_rss_state.situation_snapshot.situations.end(),
1134 [&state](::ad::rss::situation::Situation
const &situation) {
1135 return situation.situationId == state.situationId;
1138 if (dangerous_sitation_iter != carla_rss_state.situation_snapshot.situations.end()) {
1140 _logger->trace(
"Situation: {}", *dangerous_sitation_iter);
1142 if (dangerous_sitation_iter->objectId == ::ad::rss::map::RssSceneCreator::getRightBorderObjectId()) {
1144 right_border_is_dangerous =
true;
1146 }
else if (dangerous_sitation_iter->objectId == ::ad::rss::map::RssSceneCreator::getLeftBorderObjectId()) {
1148 left_border_is_dangerous =
true;
1152 carla_rss_state.dangerous_vehicle =
true;
1154 if (state.longitudinalState.response != ::ad::rss::state::LongitudinalResponse::None) {
1156 vehicle_triggered_longitudinal_response =
true;
1159 if (state.lateralStateLeft.response != ::ad::rss::state::LateralResponse::None) {
1161 vehicle_triggered_left_response =
true;
1164 if (state.lateralStateRight.response != ::ad::rss::state::LateralResponse::None) {
1166 vehicle_triggered_right_response =
true;
1170 if (dangerous_sitation_iter->situationType == ::ad::rss::situation::SituationType::OppositeDirection) {
1172 carla_rss_state.dangerous_opposite_state =
true;
1180 if (!vehicle_triggered_longitudinal_response &&
1181 (carla_rss_state.proper_response.longitudinalResponse != ::ad::rss::state::LongitudinalResponse::None)) {
1183 _logger->debug(
"!! longitudinalResponse only triggered by borders: ignore !!");
1185 carla_rss_state.proper_response.longitudinalResponse = ::ad::rss::state::LongitudinalResponse::None;
1188 carla_rss_state.proper_response.accelerationRestrictions.longitudinalRange.maximum =
1189 carla_rss_state.default_ego_vehicle_dynamics.alphaLon.accelMax;
1192 if (!vehicle_triggered_left_response && !left_border_is_dangerous &&
1193 (carla_rss_state.proper_response.lateralResponseLeft != ::ad::rss::state::LateralResponse::None)) {
1195 _logger->debug(
"!! lateralResponseLeft only triggered by right border: ignore !!");
1197 carla_rss_state.proper_response.lateralResponseLeft = ::ad::rss::state::LateralResponse::None;
1200 carla_rss_state.proper_response.accelerationRestrictions.lateralLeftRange.maximum =
1201 carla_rss_state.default_ego_vehicle_dynamics.alphaLat.accelMax;
1203 carla_rss_state.ego_dynamics_on_route.crossing_border =
true;
1206 if (!vehicle_triggered_right_response && !right_border_is_dangerous &&
1207 (carla_rss_state.proper_response.lateralResponseRight != ::ad::rss::state::LateralResponse::None)) {
1209 _logger->debug(
"!! lateralResponseRight only triggered by left border: ignore !!");
1211 carla_rss_state.proper_response.lateralResponseRight = ::ad::rss::state::LateralResponse::None;
1214 carla_rss_state.proper_response.accelerationRestrictions.lateralRightRange.maximum =
1215 carla_rss_state.default_ego_vehicle_dynamics.alphaLat.accelMax;
1217 carla_rss_state.ego_dynamics_on_route.crossing_border =
true;
1220 _logger->trace(
"RouteResponse: {}", carla_rss_state.proper_response);