ad_rss_map_integration
ParallelChecker.hpp
1 // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 //
3 // Copyright (C) 2019-2021 Intel Corporation
4 //
5 // SPDX-License-Identifier: LGPL-2.1-only
6 //
7 // ----------------- END LICENSE BLOCK -----------------------------------
8 
9 #include "ad/rss/map/Logging.hpp"
12 
13 namespace ad {
14 namespace rss {
15 namespace map {
16 
17 template <class OBJECT_INSTANCE_TYPE> class ParallelChecker
18 {
19 public:
21  : mEgoVehicleMap(egoVehicleMap)
22  {
23  }
24 
25  ParallelChecker(ParallelChecker const &other) = delete;
26  ParallelChecker &operator=(ParallelChecker const &other) = delete;
27 
28  void analyseResultOfRoute(RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &ego_vehicle,
29  RssRouteCheckResult &situationCheckResult) const
30  {
31  if (situationCheckResult.is_valid)
32  {
33  situationCheckResult.result_analysis.dangerous_state = false;
34  situationCheckResult.result_analysis.dangerous_vehicle = false;
35  situationCheckResult.result_analysis.dangerous_opposite_state = false;
36  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = false;
37  bool leftBorderIsDangerous = false;
38  bool rightBorderIsDangerous = false;
39  bool vehicleTriggeredLeftResponse = false;
40  bool vehicleTriggeredRightResponse = false;
41  bool vehicleTriggeredLongitudinalResponse = false;
42  for (auto const &state : situationCheckResult.rss_state_snapshot.individual_responses)
43  {
44  if (::ad::rss::state::isDangerous(state))
45  {
46  situationCheckResult.result_analysis.dangerous_state = true;
47  auto dangerousSitationIter
48  = std::find_if(situationCheckResult.rss_situation_snapshot.constellations.begin(),
49  situationCheckResult.rss_situation_snapshot.constellations.end(),
50  [&state](::ad::rss::core::RelativeConstellation const &constellation) {
51  return constellation.constellation_id == state.constellation_id;
52  });
53  if (dangerousSitationIter != situationCheckResult.rss_situation_snapshot.constellations.end())
54  {
55  if (dangerousSitationIter->object_id == ::ad::rss::structured::getRightBorderObjectId())
56  {
57  rightBorderIsDangerous = true;
58  if (state.lateral_state_right.rss_state_information.current_distance == ::ad::physics::Distance(0.))
59  {
60  getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] right border is crossed",
61  ego_vehicle.mRssObjectData.id,
62  situationCheckResult.rss_route.route_id);
63  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
64  }
65  }
66  else if (dangerousSitationIter->object_id == ::ad::rss::structured::getLeftBorderObjectId())
67  {
68  leftBorderIsDangerous = true;
69  if (state.lateral_state_left.rss_state_information.current_distance == ::ad::physics::Distance(0.))
70  {
71  getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] left border is crossed",
72  ego_vehicle.mRssObjectData.id,
73  situationCheckResult.rss_route.route_id);
74  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
75  }
76  }
77  else
78  {
79  situationCheckResult.result_analysis.dangerous_vehicle = true;
80  if (state.longitudinal_state.response != ::ad::rss::state::LongitudinalResponse::None)
81  {
82  vehicleTriggeredLongitudinalResponse = true;
83  }
84  if (state.lateral_state_left.response != ::ad::rss::state::LateralResponse::None)
85  {
86  vehicleTriggeredLeftResponse = true;
87  }
88  if (state.lateral_state_right.response != ::ad::rss::state::LateralResponse::None)
89  {
90  vehicleTriggeredRightResponse = true;
91  }
92  }
93  if (dangerousSitationIter->constellation_type == ::ad::rss::world::ConstellationType::OppositeDirection)
94  {
95  situationCheckResult.result_analysis.dangerous_opposite_state = true;
96  }
97  }
98  }
99  }
100 
101  // border are restricting potentially too much, fix this
102  if (!vehicleTriggeredLongitudinalResponse
103  && (situationCheckResult.proper_response.longitudinal_response
104  != ::ad::rss::state::LongitudinalResponse::None))
105  {
106  getLogger()->debug(
107  "RssRouteChecker::analyseResultOfRoute[{}:{}] longitudinal_response only triggered by borders: ignore",
108  ego_vehicle.mRssObjectData.id,
109  situationCheckResult.rss_route.route_id);
110  situationCheckResult.proper_response.longitudinal_response = ::ad::rss::state::LongitudinalResponse::None;
111  situationCheckResult.proper_response.acceleration_restrictions.longitudinal_range.maximum
112  = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lon.accel_max;
113  }
114  if (!vehicleTriggeredLeftResponse && !leftBorderIsDangerous
115  && (situationCheckResult.proper_response.lateral_response_left != ::ad::rss::state::LateralResponse::None))
116  {
117  getLogger()->debug(
118  "RssRouteChecker::analyseResultOfRoute[{}:{}] lateral_response_left only triggered by right border: ignore",
119  ego_vehicle.mRssObjectData.id,
120  situationCheckResult.rss_route.route_id);
121  situationCheckResult.proper_response.lateral_response_left = ::ad::rss::state::LateralResponse::None;
122  situationCheckResult.proper_response.acceleration_restrictions.lateral_left_range.maximum
123  = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lat.accel_max;
124  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
125  }
126  if (!vehicleTriggeredRightResponse && !rightBorderIsDangerous
127  && (situationCheckResult.proper_response.lateral_response_right != ::ad::rss::state::LateralResponse::None))
128  {
129  getLogger()->debug(
130  "RssRouteChecker::analyseResultOfRoute[{}:{}] lateral_response_right only triggered by left border: ignore",
131  ego_vehicle.mRssObjectData.id,
132  situationCheckResult.rss_route.route_id);
133  situationCheckResult.proper_response.lateral_response_right = ::ad::rss::state::LateralResponse::None;
134  situationCheckResult.proper_response.acceleration_restrictions.lateral_right_range.maximum
135  = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lat.accel_max;
136  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
137  }
138 
139  if (!situationCheckResult.proper_response.is_safe)
140  {
141  getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] Unsafe route: {}\n {}",
142  ego_vehicle.mRssObjectData.id,
143  situationCheckResult.rss_route.route_id,
144  situationCheckResult.proper_response,
145  situationCheckResult);
146  }
147  else
148  {
149  getLogger()->trace("RssRouteChecker::analyseResults[{}:{}] RouteResponse: {}\n {}",
150  ego_vehicle.mRssObjectData.id,
151  situationCheckResult.rss_route.route_id,
152  situationCheckResult.proper_response,
153  situationCheckResult);
154  }
155  }
156  }
157 
158  void operator()(RssObjectResult &objectResult) const
159  {
160  auto egoVehicleFindResult = mEgoVehicleMap.find(objectResult.object_data.id);
161  if (egoVehicleFindResult == mEgoVehicleMap.end())
162  {
163  getLogger()->error("RssRouteChecker::ParallelChecker[{}] unexpectedly did not find checker for object",
164  objectResult.object_data.id);
165  return;
166  }
167  auto &egoVehicleData = egoVehicleFindResult->second;
168 
169  for (auto &situationCheckResult : objectResult.situation_check_results)
170  {
171  auto rssCheckFindResult = egoVehicleData.mRssRouteCheckMap.find(situationCheckResult.rss_route.route_id);
172  if (rssCheckFindResult == egoVehicleData.mRssRouteCheckMap.end())
173  {
174  getLogger()->error("RssRouteChecker::ParallelChecker[{}:{}] unexpectedly did not find checker for route",
175  objectResult.object_data.id,
176  situationCheckResult.rss_route.route_id);
177  continue;
178  }
179  auto &rssCheck = rssCheckFindResult->second;
180 
181  situationCheckResult.is_valid = rssCheck->mSituationExtraction.extractSituation(
182  situationCheckResult.world_model, situationCheckResult.rss_situation_snapshot);
183  if (!situationCheckResult.is_valid)
184  {
185  getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] extractSituation failed {}!",
186  objectResult.object_data.id,
187  situationCheckResult.rss_route.route_id,
188  situationCheckResult.world_model);
189  }
190 
191  if (situationCheckResult.is_valid)
192  {
193  situationCheckResult.is_valid = rssCheck->mSituationChecking.checkSituation(
194  situationCheckResult.rss_situation_snapshot, situationCheckResult.rss_state_snapshot);
195  if (!situationCheckResult.is_valid)
196  {
197  getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] checkSituation failed {}!",
198  objectResult.object_data.id,
199  situationCheckResult.rss_route.route_id,
200  situationCheckResult.rss_situation_snapshot);
201  }
202  }
203 
204  if (situationCheckResult.is_valid)
205  {
206  situationCheckResult.is_valid = rssCheck->mResponseResolving.provideProperResponse(
207  situationCheckResult.rss_state_snapshot, situationCheckResult.proper_response);
208  if (!situationCheckResult.is_valid)
209  {
210  getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] provideProperResponse failed {}!",
211  objectResult.object_data.id,
212  situationCheckResult.rss_route.route_id,
213  situationCheckResult.rss_state_snapshot);
214  }
215  }
216 
217  analyseResultOfRoute(egoVehicleData, situationCheckResult);
218  }
219  }
220 
221 private:
223 };
224 
225 } // namespace map
226 } // namespace rss
227 } // namespace ad
Definition: ParallelChecker.hpp:18
Class to store data of RssVehicleAdapter.
Definition: RssRouteCheckerData.hpp:258
RssObjectData mRssObjectData
the actual RssObjectData of this
Definition: RssRouteCheckerData.hpp:67
std::map<::ad::rss::world::ObjectId, RssRouteCheckerEgoVehicleData< OBJECT_INSTANCE_TYPE > > RssRouteCheckerEgoVehicleDataMap
Definition: RssRouteCheckerData.hpp:387
std::shared_ptr< spdlog::logger > getLogger()
get the ad::rss::map logger
namespace ad
Definition: RouteAccelerations.hpp:33
::ad::rss::world::ObjectId id
Definition: RssObjectData.hpp:135
::ad::rss::world::RssDynamics rss_dynamics
Definition: RssObjectData.hpp:166
DataType RssObjectResult.
Definition: RssObjectResult.hpp:47
::ad::rss::map::RssObjectData object_data
Definition: RssObjectResult.hpp:123
::ad::rss::map::RssRouteCheckResultList situation_check_results
Definition: RssObjectResult.hpp:128
bool dangerous_state
Definition: RssRouteCheckResultAnalysis.hpp:122
bool vehicle_crossing_road_boundaries
Definition: RssRouteCheckResultAnalysis.hpp:140
bool dangerous_vehicle
Definition: RssRouteCheckResultAnalysis.hpp:127
bool dangerous_opposite_state
Definition: RssRouteCheckResultAnalysis.hpp:132
DataType RssRouteCheckResult.
Definition: RssRouteCheckResult.hpp:48
::ad::rss::world::WorldModel world_model
Definition: RssRouteCheckResult.hpp:136
::ad::rss::map::RssRouteCheckResultAnalysis result_analysis
Definition: RssRouteCheckResult.hpp:156
bool is_valid
Definition: RssRouteCheckResult.hpp:131
::ad::rss::state::ProperResponse proper_response
Definition: RssRouteCheckResult.hpp:151
::ad::rss::core::RssSituationSnapshot rss_situation_snapshot
Definition: RssRouteCheckResult.hpp:141
::ad::rss::map::RssRoute rss_route
Definition: RssRouteCheckResult.hpp:126
::ad::rss::state::RssStateSnapshot rss_state_snapshot
Definition: RssRouteCheckResult.hpp:146
::ad::rss::map::RssRouteId route_id
Definition: RssRoute.hpp:127