ad_rss_map_integration
RssRouteCheckerDetail.hpp
1 // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 //
3 // Copyright (C) 2019-2022 Intel Corporation
4 //
5 // SPDX-License-Identifier: LGPL-2.1-only
6 //
7 // ----------------- END LICENSE BLOCK -----------------------------------
8 
10 
11 #include <ad/rss/state/RssStateOperation.hpp>
12 #include <tbb/tbb.h>
13 
14 #include "ad/map/intersection/CoreIntersection.hpp"
15 #include "ad/map/lane/Operation.hpp"
16 #include "ad/map/route/Operation.hpp"
17 #include "ad/rss/map/Logging.hpp"
19 #include "ad/rss/map/detail/ParallelChecker.hpp"
20 #include "ad/rss/map/detail/ParallelObjectUpdater.hpp"
21 #include "ad/rss/map/detail/ParallelRouteUpdater.hpp"
22 #include "ad/rss/map/detail/ParallelWorldModelCreator.hpp"
23 
24 namespace ad {
25 namespace rss {
26 namespace map {
27 
28 template <class OBJECT_INSTANCE_TYPE>
30  ::ad::physics::Distance const artificialObjectSamplingDistance,
31  ArtificialObjectInjectionCallbackFunctionType artificialObjectsInjectionCallback)
32 {
33  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
34  mArtificialObjectSamplingDistance = artificialObjectSamplingDistance;
35  mArtificialObjectsInjectionCallback = artificialObjectsInjectionCallback;
36 }
37 
38 template <class OBJECT_INSTANCE_TYPE>
39 template <class Data, class Adapter>
41  std::chrono::system_clock::time_point const &currentTime,
42  std::map<::ad::rss::world::ObjectId, Data> &objectMap,
43  std::vector<typename Adapter::Ptr> const &activeObjectAdapterList)
44 {
45  for (auto &objectEntry : objectMap)
46  {
47  objectEntry.second.mActive = false;
48  }
49  for (auto &adapter : activeObjectAdapterList)
50  {
51  auto objectEntryIter = objectMap.find(adapter->getObjectId());
52  if (objectEntryIter == objectMap.end())
53  {
54  // create new map entry for this object
55  auto insertResult = objectMap.insert({adapter->getObjectId(), Data()});
56  if (!insertResult.second)
57  {
58  getLogger()->error("RssRouteChecker::updateObjectMap[{}] unexpected error on adding new object adapter entry",
59  adapter->getObjectId());
60  continue;
61  }
62  objectEntryIter = insertResult.first;
63  }
64 
65  objectEntryIter->second.mActive = true;
66  objectEntryIter->second.updateAdapter(adapter);
67  }
68 
69  // remove outdated entries
70  for (auto objectEntryIter = objectMap.begin(); objectEntryIter != objectMap.end();)
71  {
72  if (!objectEntryIter->second.mActive)
73  {
74  auto durationSinceLastUpdate = currentTime - objectEntryIter->second.mRssObjectData.last_update;
75  if (std::chrono::duration_cast<std::chrono::seconds>(durationSinceLastUpdate).count()
76  > (static_cast<int64_t>(mDropOutdatedObjectsDuration.mDuration) + 1))
77  {
78  getLogger()->debug("RssRouteChecker::updateObjectMap[{}] Dropping outdated object adapter.",
79  objectEntryIter->first);
80  objectMap.erase(objectEntryIter++);
81  continue;
82  }
83  }
84  objectEntryIter++;
85  }
86 }
87 
88 template <class OBJECT_INSTANCE_TYPE> void RssRouteChecker<OBJECT_INSTANCE_TYPE>::updateRssCheckers()
89 {
90  for (auto &egoVehicleToUpdate : mEgoVehicleMap)
91  {
92  auto &egoVehicleData = egoVehicleToUpdate.second;
93  if (egoVehicleData.mActive)
94  {
95  RssRouteCheckMap lastRouteCheckMap;
96  egoVehicleData.mRssRouteCheckMap.swap(lastRouteCheckMap);
97 
98  for (auto &lastCheckerEntry : lastRouteCheckMap)
99  {
100  for (auto &otherVehicle : mVehicleMap)
101  {
102  if (otherVehicle.second.mClearObjectHistory)
103  {
104  lastCheckerEntry.second->dropObjectHistory(otherVehicle.second.mRssObjectData.id);
105  }
106  }
107  }
108 
109  for (auto &egoRssRoute : egoVehicleData.mRoutes)
110  {
111  auto routeCheckFindResult = lastRouteCheckMap.find(egoRssRoute.route_id);
112  if (routeCheckFindResult != lastRouteCheckMap.end())
113  {
114  getLogger()->trace("RssRouteChecker::updateRssCheckers[{}:{}] taking over existing checker",
115  egoVehicleData.mRssObjectData.id,
116  egoRssRoute.route_id);
117  RssRouteCheckMap::value_type checkerToTakeOver = *routeCheckFindResult;
118  egoVehicleData.mRssRouteCheckMap.insert(checkerToTakeOver);
119  }
120  else
121  {
122  // is there a parent route assigned or a default checker on RouteId(0) available?
123  routeCheckFindResult = lastRouteCheckMap.find(egoRssRoute.parent_route_id);
124  if (routeCheckFindResult != lastRouteCheckMap.end())
125  {
126  getLogger()->trace("RssRouteChecker::updateRssCheckers[{}:{}] add copy parent checker {}",
127  egoVehicleData.mRssObjectData.id,
128  egoRssRoute.route_id,
129  egoRssRoute.parent_route_id);
130  // create a copy of the parent checker to preserve the current state of the parent of
131  // the new variant of the extended route
132  ::ad::rss::core::RssCheck const &parentChecker = *routeCheckFindResult->second.get();
133  ::ad::rss::core::RssCheck::Ptr parentCheckerCopy(new ::ad::rss::core::RssCheck(parentChecker));
134  auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({egoRssRoute.route_id, parentCheckerCopy});
135  if (insertResult.second)
136  {
137  updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
138  }
139  }
140  else
141  {
142  getLogger()->trace("RssRouteChecker::updateRssCheckers[{}:{}] no parent checker {} found; add new checker",
143  egoVehicleData.mRssObjectData.id,
144  egoRssRoute.route_id,
145  egoRssRoute.parent_route_id);
146  // create a new checker
147  ::ad::rss::core::RssCheck::Ptr newChecker(new ::ad::rss::core::RssCheck());
148  auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({egoRssRoute.route_id, newChecker});
149  if (insertResult.second)
150  {
151  updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
152  }
153  }
154  }
155  }
156  if (egoVehicleData.mRssRouteCheckMap.empty())
157  {
158  // we need to ensure to have a default checker for RouteId(0)
159  if (!lastRouteCheckMap.empty())
160  {
161  getLogger()->trace("RssRouteChecker::updateRssCheckers[{}:0] no current route, resuse first checker {} as 0",
162  egoVehicleData.mRssObjectData.id,
163  lastRouteCheckMap.begin()->first);
164  // take over the first checker in the map (if there are multiple ones available,
165  // the one with the lowest route id is taken; but the route id is set to zero again)
166  auto insertResult
167  = egoVehicleData.mRssRouteCheckMap.insert({RssRouteId(0), lastRouteCheckMap.begin()->second});
168  if (insertResult.second)
169  {
170  updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
171  }
172  }
173  else
174  {
175  getLogger()->trace("RssRouteChecker::updateRssCheckers[{}:0] no current route, and no checker at all "
176  "present; add default checker",
177  egoVehicleData.mRssObjectData.id);
178  // and we didn't have any last time, so create new checker to be used for checks
179  ::ad::rss::core::RssCheck::Ptr newChecker(new ::ad::rss::core::RssCheck());
180  auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({RssRouteId(0), newChecker});
181  if (insertResult.second)
182  {
183  updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
184  }
185  }
186  }
187  }
188  }
189 }
190 
191 template <class OBJECT_INSTANCE_TYPE>
193  world::ObjectType objectType,
195 {
196  try
197  {
198  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
199  mCalculateTrajectorySetsCallbackMap[objectType] = calculateTrajectorySetsCallback;
200  // update all checkers at once
201  for (auto &egoVehicleToUpdate : mEgoVehicleMap)
202  {
203  auto &egoVehicleData = egoVehicleToUpdate.second;
204  for (auto checkMapIter = egoVehicleData.mRssRouteCheckMap.begin();
205  checkMapIter != egoVehicleData.mRssRouteCheckMap.end();
206  checkMapIter++)
207  {
208  updateRssCheckerCallbacksLocked(egoVehicleData, checkMapIter);
209  }
210  }
211  }
212  catch (std::exception &e)
213  {
214  getLogger()->critical("RssRouteChecker::registerCalculateTrajectorySetsCallback>> Exception caught'{}'", e.what());
215  }
216  catch (...)
217  {
218  getLogger()->critical("RssRouteChecker::registerCalculateTrajectorySetsCallback>> Exception caught");
219  }
220 }
221 
222 template <class OBJECT_INSTANCE_TYPE>
224  RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &egoVehicle, RssRouteCheckMap::iterator routeCheckerMapIter)
225 {
226  core::shared_lock_guard const lock_shared(mCallbackRwLock);
227  updateRssCheckerCallbacksLocked(egoVehicle, routeCheckerMapIter);
228 }
229 
230 template <class OBJECT_INSTANCE_TYPE>
231 void RssRouteChecker<OBJECT_INSTANCE_TYPE>::updateRssCheckerCallbacksLocked(
232  RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &egoVehicle, RssRouteCheckMap::iterator routeCheckerMapIter)
233 {
234  using namespace std::placeholders;
235  for (auto &callbackPair : mCalculateTrajectorySetsCallbackMap)
236  {
237  auto callback = std::bind(&RssRouteChecker::callCalculateTrajectorySetsCallback,
238  this,
239  callbackPair.second,
240  egoVehicle.mRssObjectData.id,
241  routeCheckerMapIter->first,
242  _1,
243  _2,
244  _3,
245  _4,
246  _5);
247  routeCheckerMapIter->second->registerCalculateTrajectorySetsCallback(callbackPair.first, callback);
248  }
249 }
250 
251 template <class OBJECT_INSTANCE_TYPE>
252 bool RssRouteChecker<OBJECT_INSTANCE_TYPE>::callCalculateTrajectorySetsCallback(
254  ::ad::rss::world::ObjectId const &egoVehicleId,
255  ::ad::rss::map::RssRouteId const &routeId,
256  ::ad::rss::core::RelativeConstellation const &constellation,
257  ::ad::rss::world::ObjectId const &objectId,
258  ::ad::rss::core::RelativeObjectState const &vehicleState,
259  ::ad::geometry::Polygon &brakePolygon,
260  ::ad::geometry::Polygon &continueForwardPolygon)
261 {
262  auto findEgoVehicleDataResult = mEgoVehicleMap.find(egoVehicleId);
263  if (findEgoVehicleDataResult != mEgoVehicleMap.end())
264  {
265  auto &egoVehicleData = findEgoVehicleDataResult->second;
266  return callback(
267  egoVehicleData, routeId, constellation, objectId, vehicleState, brakePolygon, continueForwardPolygon);
268  }
269  else
270  {
271  getLogger()->error("RssRouteChecker::callCalculateTrajectorySetsCallback[{}:{}] ego vehicle not found to process "
272  "callback for object type {}",
273  egoVehicleId,
274  routeId,
275  std::to_string(vehicleState.object_type));
276  }
277  return false;
278 }
279 
280 template <class OBJECT_INSTANCE_TYPE>
281 RssRouteCheckResult RssRouteChecker<OBJECT_INSTANCE_TYPE>::createSituationForRoute(
282  RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &ego_vehicle, RssRoute const &rss_route)
283 {
284  RssRouteCheckResult situationCheckResult;
285  situationCheckResult.is_valid = false;
286  situationCheckResult.rss_route = rss_route;
287  situationCheckResult.rss_situation_snapshot = ad::rss::core::RssSituationSnapshot();
288  situationCheckResult.rss_state_snapshot = ad::rss::state::RssStateSnapshot();
289  situationCheckResult.proper_response = ad::rss::state::ProperResponse();
290  situationCheckResult.result_analysis.dangerous_state = true;
291  situationCheckResult.result_analysis.dangerous_vehicle = true;
292  situationCheckResult.result_analysis.dangerous_opposite_state = true;
293  situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = false;
294 
295  try
296  {
297  ParallelWorldModelCreator<OBJECT_INSTANCE_TYPE> situationWorldModelCreator(
298  mTimeIndex, ego_vehicle, rss_route, mConnectingRoutesCache, mMapAreaLanes);
299  tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), situationWorldModelCreator);
300  tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), situationWorldModelCreator);
301  tbb::parallel_for_each(mPedestrianMap.begin(), mPedestrianMap.end(), situationWorldModelCreator);
302  tbb::parallel_for_each(mArtificialObjectMap.begin(), mArtificialObjectMap.end(), situationWorldModelCreator);
303  situationCheckResult.world_model = situationWorldModelCreator.getWorldModel();
304 
305  situationCreated(ego_vehicle, situationCheckResult);
306  }
307  catch (std::exception &e)
308  {
309  getLogger()->critical("RssRouteChecker::createSituationForRoute>> Exception caught'{}' {} {}",
310  e.what(),
311  ego_vehicle.mRssObjectData.id,
312  rss_route);
313  situationCheckResult.is_valid = false;
314  }
315  catch (...)
316  {
317  getLogger()->critical(
318  "RssRouteChecker::createSituationForRoute>> Exception caught {} {}", ego_vehicle.mRssObjectData.id, rss_route);
319  situationCheckResult.is_valid = false;
320  }
321  return situationCheckResult;
322 }
323 
324 template <class OBJECT_INSTANCE_TYPE> RssObjectResultList RssRouteChecker<OBJECT_INSTANCE_TYPE>::createSituations()
325 {
326  RssObjectResultList resultList;
327  mConnectingRoutesCache.clear();
328  for (auto const &ego_vehicle : mEgoVehicleMap)
329  {
330  if (ego_vehicle.second.mActive)
331  {
332  RssObjectResult checkResult;
333  checkResult.object_data = ego_vehicle.second.mRssObjectData;
334 
335  if (ego_vehicle.second.mRoutes.empty())
336  {
337  RssRoute emptyRoute;
338  emptyRoute.likelihood = ::ad::physics::Probability(1.);
339  emptyRoute.route_id = RssRouteId(0.);
340  emptyRoute.route = ::ad::map::route::FullRoute();
341  emptyRoute.parent_route_id = RssRouteId(0.);
342  auto const situationCheckResult = createSituationForRoute(ego_vehicle.second, emptyRoute);
343  checkResult.situation_check_results.push_back(situationCheckResult);
344  }
345  else
346  {
347  for (auto const &rss_route : ego_vehicle.second.mRoutes)
348  {
349  auto const situationCheckResult = createSituationForRoute(ego_vehicle.second, rss_route);
350  checkResult.situation_check_results.push_back(situationCheckResult);
351  }
352  }
353 
354  situationsCreated(ego_vehicle.second, checkResult);
355  resultList.push_back(checkResult);
356  }
357  }
358 
359  situationsCreated(resultList);
360  return resultList;
361 }
362 
363 template <class OBJECT_INSTANCE_TYPE>
364 void RssRouteChecker<OBJECT_INSTANCE_TYPE>::appendObjectsToResults(RssObjectResultList &objectResultList)
365 {
366  for (auto const &vehicle : mVehicleMap)
367  {
368  if (vehicle.second.mActive)
369  {
370  RssObjectResult objectResult;
371  objectResult.object_data = vehicle.second.mRssObjectData;
372  objectResultList.push_back(objectResult);
373  }
374  }
375  for (auto const &pedestrian : mPedestrianMap)
376  {
377  if (pedestrian.second.mActive)
378  {
379  RssObjectResult objectResult;
380  objectResult.object_data = pedestrian.second.mRssObjectData;
381  objectResultList.push_back(objectResult);
382  }
383  }
384  for (auto const &artificialObject : mArtificialObjectMap)
385  {
386  if (artificialObject.second.mActive)
387  {
388  RssObjectResult objectResult;
389  objectResult.object_data = artificialObject.second.mRssObjectData;
390  objectResultList.push_back(objectResult);
391  }
392  }
393 }
394 
395 template <class OBJECT_INSTANCE_TYPE>
397  std::chrono::system_clock::time_point const &currentTime,
398  ::ad::physics::Distance const vehicleSamplingDistance,
401  ::ad::physics::Distance const pedestrianSamplingDistance,
404 {
405  mTimeIndex++;
406  RssObjectResultList rssObjectResultList;
407  try
408  {
409  // update object maps
410  updateObjectMap<RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE>, RssEgoVehicleAdapter<OBJECT_INSTANCE_TYPE>>(
411  currentTime, mEgoVehicleMap, egoVehicles);
412  updateObjectMap<RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE>, RssVehicleAdapter<OBJECT_INSTANCE_TYPE>>(
413  currentTime, mVehicleMap, vehicles);
414  updateObjectMap<RssRouteCheckerPedestrianData<OBJECT_INSTANCE_TYPE>, RssPedestrianAdapter<OBJECT_INSTANCE_TYPE>>(
415  currentTime, mPedestrianMap, pedestrians);
416 
417  // update object data
418  ParallelObjectUpdater<OBJECT_INSTANCE_TYPE> objectUpdater(currentTime,
419  vehicleSamplingDistance,
420  pedestrianSamplingDistance,
421  mArtificialObjectSamplingDistance,
422  mMapAreaLanes);
423  tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), objectUpdater);
424  objectDataUpdated(mEgoVehicleMap);
425  tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), objectUpdater);
426  objectDataUpdated(mVehicleMap);
427  tbb::parallel_for_each(mPedestrianMap.begin(), mPedestrianMap.end(), objectUpdater);
428  objectDataUpdated(mPedestrianMap);
429 
430  // update routes
432  objectUpdater.getMinRoutePreviewDistance(), mMapAreaLanes, routeExtensionMode);
433  tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), routeUpdater);
434  routesUpdated(mEgoVehicleMap);
435  tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), routeUpdater);
436  routesUpdated(mVehicleMap);
437 
439  // keep the following block as it's essential to protect the callback registration
440  {
441  core::shared_lock_guard const lock_shared(mCallbackRwLock);
442  if (mArtificialObjectsInjectionCallback != nullptr)
443  {
444  artificialObjects = mArtificialObjectsInjectionCallback(mEgoVehicleMap, mVehicleMap, mPedestrianMap);
445  }
446  }
447  updateObjectMap<RssRouteCheckerArtificialObjectData<OBJECT_INSTANCE_TYPE>,
449  currentTime, mArtificialObjectMap, artificialObjects);
450  tbb::parallel_for_each(mArtificialObjectMap.begin(), mArtificialObjectMap.end(), objectUpdater);
451  objectDataUpdated(mArtificialObjectMap);
452 
453  updateRssCheckers();
454 
455  rssObjectResultList = createSituations();
456 
457  ParallelChecker<OBJECT_INSTANCE_TYPE> parallelChecker(mEgoVehicleMap);
458  tbb::parallel_for_each(rssObjectResultList.begin(), rssObjectResultList.end(), parallelChecker);
459  checksPerformed(rssObjectResultList);
460 
461  appendObjectsToResults(rssObjectResultList);
462  }
463  catch (std::exception &e)
464  {
465  getLogger()->critical("RssRouteChecker::checkObjects>> Exception caught'{}'", e.what());
466  rssObjectResultList.clear();
467  }
468  catch (...)
469  {
470  getLogger()->critical("RssRouteChecker::checkObjects>> Exception caught");
471  rssObjectResultList.clear();
472  }
473 
474  return rssObjectResultList;
475 }
476 
477 template <class OBJECT_INSTANCE_TYPE>
479  ::ad::map::lane::LaneIdSet const &lanesToConsider)
480 {
481  mMapAreaLanes = lanesToConsider;
482  getLogger()->debug("RssRouteChecker::restrictOperationToMapArea>> {}", mMapAreaLanes);
483 }
484 
485 template <class OBJECT_INSTANCE_TYPE>
487  ::ad::map::point::BoundingSphere const &bounding_sphere)
488 {
489  mMapAreaLanes = ad::map::lane::getLanesOfMapArea(bounding_sphere);
490  getLogger()->debug("RssRouteChecker::restrictOperationToMapArea({})>> {}", bounding_sphere, mMapAreaLanes);
491  return !mMapAreaLanes.empty();
492 }
493 
494 template <class OBJECT_INSTANCE_TYPE>
496  std::vector<::ad::map::lane::MapAreaPredictionStartPoint> const &predictionStartPoints)
497 {
498  mMapAreaLanes = ad::map::lane::getLanesOfMapArea(predictionStartPoints);
499  getLogger()->debug("RssRouteChecker::restrictOperationToMapArea(PredictionStartPoints)>> results in {}",
500  mMapAreaLanes);
501  return !mMapAreaLanes.empty();
502 }
503 
504 template <class OBJECT_INSTANCE_TYPE>
506  ::ad::map::point::ENUPoint const &intersectionPoint, ::ad::physics::Distance const &intersectionDistance)
507 {
508  mMapAreaLanes = ad::map::lane::getLanesOfMapArea(intersectionPoint, intersectionDistance);
509  getLogger()->debug("RssRouteChecker::restrictOperationToIntersectionArea({}@{})>> {}",
510  intersectionPoint,
511  intersectionDistance,
512  mMapAreaLanes);
513  return !mMapAreaLanes.empty();
514 }
515 
517 {
518  mMapAreaLanes.clear();
519  getLogger()->debug("RssRouteChecker::clearOperationToMapAreaRestriction>> {}", mMapAreaLanes);
520 }
521 
522 } // namespace map
523 } // namespace rss
524 } // namespace ad
Definition: ParallelChecker.hpp:18
Definition: ParallelObjectUpdater.hpp:19
Definition: ParallelRouteUpdater.hpp:17
Base class to access artificialObject information required to perform the RSS checks in conjunction w...
Definition: RssObjectAdapter.hpp:254
Base class to access ego vehicle information required to perform the RSS checks in conjunction with t...
Definition: RssObjectAdapter.hpp:531
Definition: RssObjectAdapter.hpp:191
Class to store data of RssVehicleAdapter.
Definition: RssRouteCheckerData.hpp:258
RouteExtensionMode
enumeration defining the mode on route extension
Definition: RssRouteCheckerData.hpp:165
supporting class for implementing the RSS checks
Definition: RssRouteChecker.hpp:35
std::function< bool(RssRouteCheckerEgoVehicleData< OBJECT_INSTANCE_TYPE > const &egoVehicle, ::ad::rss::map::RssRouteId const &routeId, ::ad::rss::core::RelativeConstellation const &constellation, ::ad::rss::world::ObjectId const &objectId, ::ad::rss::core::RelativeObjectState const &vehicleState, ::ad::geometry::Polygon &brakePolygon, ::ad::geometry::Polygon &continueForwardPolygon)> CalculateTrajectorySetsCallbackFunctionType
Function callback type for unstructured trajectory set calculation.
Definition: RssRouteChecker.hpp:108
bool restrictOperationToIntersectionArea(::ad::map::point::ENUPoint const &intersectionPoint, ::ad::physics::Distance const &intersectionDistance)
restriction of the map area around an intersection to a set of reachable lanes
Definition: RssRouteCheckerDetail.hpp:505
virtual RssObjectResultList checkObjects(std::chrono::system_clock::time_point const &currentTime, ::ad::physics::Distance const vehicleSamplingDistance, RssEgoVehicleAdapterList< OBJECT_INSTANCE_TYPE > &egoVehicles, RssVehicleAdapterList< OBJECT_INSTANCE_TYPE > &vehicles, ::ad::physics::Distance const pedestrianSamplingDistance, RssPedestrianAdapterList< OBJECT_INSTANCE_TYPE > &pedestrians, typename RssRouteCheckerVehicleData< OBJECT_INSTANCE_TYPE >::RouteExtensionMode routeExtensionMode)
perform the RSS check of the objects
Definition: RssRouteCheckerDetail.hpp:396
void registerCalculateTrajectorySetsCallback(world::ObjectType objectType, CalculateTrajectorySetsCallbackFunctionType calculateTrajectorySetsCallback)
Register a callback for unstructured trajectory set calculation.
Definition: RssRouteCheckerDetail.hpp:192
std::function< RssArtificialObjectAdapterList< OBJECT_INSTANCE_TYPE >(RssRouteCheckerEgoVehicleDataMap< OBJECT_INSTANCE_TYPE > const &egoVehicleMap, RssRouteCheckerVehicleDataMap< OBJECT_INSTANCE_TYPE > const &vehicleMap, RssRouteCheckerPedestrianDataMap< OBJECT_INSTANCE_TYPE > const &pedestrianMap)> ArtificialObjectInjectionCallbackFunctionType
defines the type for callback to inject artificial objects
Definition: RssRouteChecker.hpp:69
void restrictOperationToMapArea(::ad::map::lane::LaneIdSet const &lanesToConsider)
These group of functions restrict the operation of this class to a certain map area.
Definition: RssRouteCheckerDetail.hpp:478
void registerArtificialObjectInjectionCallback(::ad::physics::Distance const artificialObjectSamplingDistance, ArtificialObjectInjectionCallbackFunctionType artificialObjectsInjectionCallback)
register a callback to inject artificial objects
Definition: RssRouteCheckerDetail.hpp:29
void clearOperationToMapAreaRestriction()
clear the restriction to a certain map area
Definition: RssRouteCheckerDetail.hpp:516
Base class to access vehicle information required to perform the RSS checks in conjunction with the R...
Definition: RssObjectAdapter.hpp:362
std::vector< typename RssVehicleAdapter< OBJECT_INSTANCE_TYPE >::Ptr > RssVehicleAdapterList
typedef for a list of RssEgoVehicleAdapter smart pointers
Definition: RssObjectAdapter.hpp:509
std::vector< typename RssArtificialObjectAdapter< OBJECT_INSTANCE_TYPE >::Ptr > RssArtificialObjectAdapterList
typedef for a list of RssArtificialObjectAdapter smart pointers
Definition: RssObjectAdapter.hpp:332
std::vector< typename RssPedestrianAdapter< OBJECT_INSTANCE_TYPE >::Ptr > RssPedestrianAdapterList
typedef for a list of RssPedestrianAdapter smart pointers
Definition: RssObjectAdapter.hpp:221
std::shared_ptr< spdlog::logger > getLogger()
get the ad::rss::map logger
std::vector< typename RssEgoVehicleAdapter< OBJECT_INSTANCE_TYPE >::Ptr > RssEgoVehicleAdapterList
typedef for a list of RssEgoVehicleAdapter smart pointers
Definition: RssObjectAdapter.hpp:669
uint64_t RssRouteId
DataType RssRouteId.
Definition: RssRouteId.hpp:39
std::vector<::ad::rss::map::RssObjectResult > RssObjectResultList
DataType RssObjectResultList.
Definition: RssObjectResultList.hpp:42
std::map< RssRouteId, ::ad::rss::core::RssCheck::Ptr > RssRouteCheckMap
typedef for a RssCheck map in respect to the RssRouteId
Definition: RssRouteCheckerData.hpp:251
namespace ad
Definition: RouteAccelerations.hpp:33