ad_rss_map_integration
RssRouteCheckerControl.hpp
Go to the documentation of this file.
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 -----------------------------------
12 #pragma once
13 
14 #include <ad/map/access/Logging.hpp>
15 #include <ad/rss/core/Logging.hpp>
16 #include <ad/rss/core/shared_lock_guard.hpp>
17 #include <ad/rss/map/Logging.hpp>
22 #include <ad/rss/map/RssRoute.hpp>
24 #include <map>
25 
29 namespace ad {
33 namespace rss {
37 namespace map {
38 
45 template <class OBJECT_INSTANCE_TYPE> class RssRouteCheckerControl
46 {
47 public:
51  typedef std::shared_ptr<RssRouteCheckerControl> Ptr;
52 
56  typedef std::shared_ptr<RssRouteCheckerControl const> ConstPtr;
57 
61 
64  virtual ~RssRouteCheckerControl() = default;
65 
69  = std::function<::ad::rss::world::RssDynamics(OBJECT_INSTANCE_TYPE vehicle)>;
70 
74  void registerDefaultRssDynamicsCallback(::ad::rss::world::ObjectType const objectType,
76  {
77  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
78  mDefaultRssDynamicsCallbacks[objectType] = callback;
79  }
80 
84  bool isDefaultRssDynamicsCallbackRegistered(::ad::rss::world::ObjectType const objectType) const
85  {
86  core::shared_lock_guard const shared_lock(mCallbackRwLock);
87  return mDefaultRssDynamicsCallbacks.find(objectType) != mDefaultRssDynamicsCallbacks.end();
88  }
89 
95  ::ad::rss::world::RssDynamics getDefaultRssDynamics(::ad::rss::world::ObjectType const objectType,
96  OBJECT_INSTANCE_TYPE vehicle) const
97  {
98  core::shared_lock_guard const shared_lock(mCallbackRwLock);
99  auto findResult = mDefaultRssDynamicsCallbacks.find(objectType);
100  if (findResult != mDefaultRssDynamicsCallbacks.end())
101  {
102  return findResult->second(vehicle);
103  }
104  return ::ad::rss::world::RssDynamics();
105  }
106 
120  ::ad::rss::map::RssObjectData const &egoVehicleObject,
121  OBJECT_INSTANCE_TYPE egoVehicle,
122  ::ad::rss::map::RssObjectData const &vehicleObject,
123  OBJECT_INSTANCE_TYPE vehicle)>;
124 
129  {
130  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
131  mVehicleConstellationCallback = callback;
132  }
133 
138  {
139  core::shared_lock_guard const shared_lock(mCallbackRwLock);
140  return bool(mVehicleConstellationCallback);
141  }
142 
157  ::ad::rss::map::RssObjectData const &egoVehicleObject,
158  OBJECT_INSTANCE_TYPE egoVehicle,
159  ::ad::rss::map::RssObjectData const &vehicleObject,
160  OBJECT_INSTANCE_TYPE vehicle) const
161  {
162  core::shared_lock_guard const shared_lock(mCallbackRwLock);
163  if (bool(mVehicleConstellationCallback))
164  {
165  return mVehicleConstellationCallback(route, egoVehicleObject, egoVehicle, vehicleObject, vehicle);
166  }
167  return ::ad::rss::map::RssConstellationConfiguration();
168  }
169 
183  ::ad::rss::map::RssObjectData const &egoVehicleObject,
184  OBJECT_INSTANCE_TYPE egoVehicle,
185  ::ad::rss::map::RssObjectData const &pedestrianObject,
186  OBJECT_INSTANCE_TYPE pedestrian)>;
187 
192  {
193  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
194  mPedestrianConstellationCallback = callback;
195  }
196 
201  {
202  core::shared_lock_guard const shared_lock(mCallbackRwLock);
203  return bool(mPedestrianConstellationCallback);
204  }
205 
220  ::ad::rss::map::RssObjectData const &egoVehicleObject,
221  OBJECT_INSTANCE_TYPE egoVehicle,
222  ::ad::rss::map::RssObjectData const &pedestrianObject,
223  OBJECT_INSTANCE_TYPE pedestrian) const
224  {
225  core::shared_lock_guard const shared_lock(mCallbackRwLock);
226  if (bool(mPedestrianConstellationCallback))
227  {
228  return mPedestrianConstellationCallback(route, egoVehicleObject, egoVehicle, pedestrianObject, pedestrian);
229  }
230  return ::ad::rss::map::RssConstellationConfiguration();
231  }
232 
244  ::ad::rss::map::RssRoute const &route,
245  ::ad::rss::map::RssObjectData const &egoVehicleObject,
246  OBJECT_INSTANCE_TYPE egoVehicle,
247  ::ad::rss::map::RssObjectData const &artificialObject)>;
248 
253  {
254  std::lock_guard<std::shared_timed_mutex> const lock(mCallbackRwLock);
255  mArtificialObjectConstellationCallback = callback;
256  }
257 
262  {
263  core::shared_lock_guard const shared_lock(mCallbackRwLock);
264  return bool(mArtificialObjectConstellationCallback);
265  }
266 
281  ::ad::rss::map::RssObjectData const &egoVehicleObject,
282  OBJECT_INSTANCE_TYPE egoVehicle,
283  ::ad::rss::map::RssObjectData const &artificialObject) const
284  {
285  core::shared_lock_guard const shared_lock(mCallbackRwLock);
286  if (bool(mArtificialObjectConstellationCallback))
287  {
288  return mArtificialObjectConstellationCallback(route, egoVehicleObject, egoVehicle, artificialObject);
289  }
290  return ::ad::rss::map::RssConstellationConfiguration();
291  }
292 
296  {
297  mRssAppendRoadBoundariesMode = roadBoundariesMode;
298  }
299 
303  {
304  return mRssAppendRoadBoundariesMode;
305  }
306 
309  void setCurrentGreenTrafficLights(::ad::map::landmark::LandmarkIdSet const &currentGreenTrafficLights)
310  {
311  mCurrentGreenTrafficLights = currentGreenTrafficLights;
312  }
313 
316  ::ad::map::landmark::LandmarkIdSet getCurrentGreenTrafficLights() const
317  {
318  return mCurrentGreenTrafficLights;
319  }
320 
323  void setPositionJumpTraveledDistance(ad::physics::Distance const positionJumpTraveledDistance)
324  {
325  mPositionJumpTraveledDistance = positionJumpTraveledDistance;
326  }
327 
330  ad::physics::Distance getPositionJumpTraveledDistance() const
331  {
332  return mPositionJumpTraveledDistance;
333  }
334 
341  ad::physics::Distance const minimumDistanceToObjectsThatHaveToBeAnalyzed)
342  {
343  mMinimumDistanceToObjectsThatHaveToBeAnalyzed = minimumDistanceToObjectsThatHaveToBeAnalyzed;
344  }
345 
352  {
353  return mMinimumDistanceToObjectsThatHaveToBeAnalyzed;
354  }
355 
356  void setConsiderPositionConfidence(bool const consider_position_confidence)
357  {
358  mConsiderPositionConfidence = consider_position_confidence;
359  }
360  bool getConsiderPositionConfidence()
361  {
362  return mConsiderPositionConfidence;
363  }
364 
367  void setLogLevel(const spdlog::level::level_enum logLevel)
368  {
369  ::ad::rss::core::getLogger()->set_level(logLevel);
370  ::ad::rss::map::getLogger()->set_level(logLevel);
371  }
372 
375  void setMapLogLevel(const spdlog::level::level_enum mapLogLevel)
376  {
377  ::ad::map::access::getLogger()->set_level(mapLogLevel);
378  }
379 
383 
387 
393  void setActiveRoutingTargets(ad::rss::world::ObjectId vehicleId,
394  ::ad::map::point::ENUPointList const &activeRoutingTargets)
395  {
396  std::lock_guard<std::mutex> const lock(mRoutingLock);
397  mActiveRoutingTargets[vehicleId] = activeRoutingTargets;
398  }
399 
404  ::ad::map::point::ENUPointList getActiveRoutingTargets(ad::rss::world::ObjectId vehicleId) const
405  {
406  std::lock_guard<std::mutex> const lock(mRoutingLock);
407  auto findResult = mActiveRoutingTargets.find(vehicleId);
408  if (findResult != mActiveRoutingTargets.end())
409  {
410  return findResult->second;
411  }
412  return ::ad::map::point::ENUPointList();
413  }
414 
420  void appendRoutingTargets(ad::rss::world::ObjectId vehicleId,
421  ::ad::map::point::ENUPointList const &routingTargetsToAppend)
422  {
423  std::lock_guard<std::mutex> const lock(mRoutingLock);
424  RssRoutingTargetOperation operation;
425  operation.command = RssRoutingTargetCommand::AppendTargets;
426  operation.routingTargets = routingTargetsToAppend;
427  auto const insertResult = mRoutingTargetOperations.insert(std::make_pair(vehicleId, operation));
428  if (!insertResult.second)
429  {
430  insertResult.first->second.routingTargets.insert(
431  insertResult.first->second.routingTargets.end(), routingTargetsToAppend.begin(), routingTargetsToAppend.end());
432  }
433  }
434 
440  void replaceRoutingTargets(ad::rss::world::ObjectId vehicleId,
441  ::ad::map::point::ENUPointList const &newRoutingTargets)
442  {
443  std::lock_guard<std::mutex> const lock(mRoutingLock);
444  RssRoutingTargetOperation operation;
445  operation.command = RssRoutingTargetCommand::ReplaceTargets;
446  operation.routingTargets = newRoutingTargets;
447  auto const insertResult = mRoutingTargetOperations.insert(std::make_pair(vehicleId, operation));
448  if (!insertResult.second)
449  {
450  insertResult.first->second = operation;
451  }
452  }
453 
459  {
460  RssRoutingTargetOperation resultOperation;
461  std::lock_guard<std::mutex> const lock(mRoutingLock);
462  auto findResult = mRoutingTargetOperations.find(vehicleId);
463  if (findResult != mRoutingTargetOperations.end())
464  {
465  resultOperation = findResult->second;
466  mRoutingTargetOperations.erase(vehicleId);
467  }
468  return resultOperation;
469  }
470 
477  void dropRoute(ad::rss::world::ObjectId vehicleId)
478  {
479  replaceRoutingTargets(vehicleId, getActiveRoutingTargets(vehicleId));
480  }
481 
484  void dropVehicle(ad::rss::world::ObjectId vehicleId)
485  {
486  std::lock_guard<std::mutex> const lock(mRoutingLock);
487  mRoutingTargetOperations.erase(vehicleId);
488  mActiveRoutingTargets.erase(vehicleId);
489  }
490 
491 private:
492  // one writer mutex for the callbacks of the class should be sufficient
493  // vast majority of concurrent access is of shared nature
494  mutable std::shared_timed_mutex mCallbackRwLock;
495 
497  std::map<::ad::rss::world::ObjectType, DefaultRssDynamicsCallbackFunctionType> mDefaultRssDynamicsCallbacks;
498 
499  VehicleConstellationCallbackFunctionType mVehicleConstellationCallback;
500  PedestrianConstellationCallbackFunctionType mPedestrianConstellationCallback;
501  ArtificialObjectConstellationCallbackFunctionType mArtificialObjectConstellationCallback;
502 
503  ::ad::rss::map::RssAppendRoadBoundariesMode mRssAppendRoadBoundariesMode{
504  ::ad::rss::map::RssAppendRoadBoundariesMode::Off};
505  ::ad::map::landmark::LandmarkIdSet mCurrentGreenTrafficLights;
506 
507  mutable std::mutex mRoutingLock;
508 
509  std::map<ad::rss::world::ObjectId, ::ad::map::point::ENUPointList> mActiveRoutingTargets;
510  std::map<ad::rss::world::ObjectId, RssRoutingTargetOperation> mRoutingTargetOperations;
511 
512  ad::physics::Distance mPositionJumpTraveledDistance{20.};
513  ad::physics::Distance mMinimumDistanceToObjectsThatHaveToBeAnalyzed{RssWorldModelCreation::cMinConnectedRouteLength};
514  bool mConsiderPositionConfidence{true};
515 };
516 
517 } // namespace map
518 } // namespace rss
519 } // namespace ad
forward declaration of RssRouteCheckerControl class
Definition: RssRouteCheckerControl.hpp:46
typename RssVehicleAdapter< OBJECT_INSTANCE_TYPE >::RssRoutingTargetCommand RssRoutingTargetCommand
RssRoutingTargetCommand type from RssVehicleAdapter.
Definition: RssRouteCheckerControl.hpp:386
bool isArtificialObjectConstellationCallbackRegistered() const
Definition: RssRouteCheckerControl.hpp:261
std::function<::ad::rss::map::RssConstellationConfiguration(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &vehicleObject, OBJECT_INSTANCE_TYPE vehicle)> VehicleConstellationCallbackFunctionType
Callback function type to query the RssConstellationConfiguration of a concrete vehicle constellation...
Definition: RssRouteCheckerControl.hpp:123
void registerVehicleConstellationCallback(VehicleConstellationCallbackFunctionType callback)
Register a callback function to query the RssConstellationConfiguration of a concrete vehicle constel...
Definition: RssRouteCheckerControl.hpp:128
bool isDefaultRssDynamicsCallbackRegistered(::ad::rss::world::ObjectType const objectType) const
Definition: RssRouteCheckerControl.hpp:84
RssRoutingTargetOperation getCurrentRoutingTargetOperation(ad::rss::world::ObjectId vehicleId)
Definition: RssRouteCheckerControl.hpp:458
void setActiveRoutingTargets(ad::rss::world::ObjectId vehicleId, ::ad::map::point::ENUPointList const &activeRoutingTargets)
sets the the current active routing targets (called by RssVehicleAdapter)
Definition: RssRouteCheckerControl.hpp:393
ad::physics::Distance getPositionJumpTraveledDistance() const
gets the distance interpreted as a jump of a vehicle triggering new route calucations
Definition: RssRouteCheckerControl.hpp:330
::ad::rss::map::RssConstellationConfiguration getArtificialObjectConstellation(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &artificialObject) const
Returns the RssConstellationConfiguration of a concrete artificial object constellation within the Rs...
Definition: RssRouteCheckerControl.hpp:280
void registerDefaultRssDynamicsCallback(::ad::rss::world::ObjectType const objectType, DefaultRssDynamicsCallbackFunctionType callback)
Register a callback function to query the default RSS parameters to be used for the respective vehicl...
Definition: RssRouteCheckerControl.hpp:74
std::function<::ad::rss::world::RssDynamics(OBJECT_INSTANCE_TYPE vehicle)> DefaultRssDynamicsCallbackFunctionType
Callback function type to query the default RSS parameters to be used for the given other vehicle ins...
Definition: RssRouteCheckerControl.hpp:69
bool isPedestrianConstellationCallbackRegistered() const
Definition: RssRouteCheckerControl.hpp:200
void registerPedestrianConstellationCallback(PedestrianConstellationCallbackFunctionType callback)
Register a callback function to query the RssConstellationConfiguration of a concrete pedestrian cons...
Definition: RssRouteCheckerControl.hpp:191
RssRouteCheckerControl()=default
default constructor
::ad::map::landmark::LandmarkIdSet getCurrentGreenTrafficLights() const
Definition: RssRouteCheckerControl.hpp:316
void setMinimumDistanceToObjectsThatHaveToBeAnalyzed(ad::physics::Distance const minimumDistanceToObjectsThatHaveToBeAnalyzed)
Sets the distance below which a detailed analysis becomes necessary regardless of the objects stoppin...
Definition: RssRouteCheckerControl.hpp:340
::ad::map::point::ENUPointList getActiveRoutingTargets(ad::rss::world::ObjectId vehicleId) const
Definition: RssRouteCheckerControl.hpp:404
::ad::rss::map::RssConstellationConfiguration getVehicleConstellation(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &vehicleObject, OBJECT_INSTANCE_TYPE vehicle) const
Returns the RssConstellationConfiguration of a concrete vehicle constellation within the RssRouteChec...
Definition: RssRouteCheckerControl.hpp:156
void setPositionJumpTraveledDistance(ad::physics::Distance const positionJumpTraveledDistance)
sets the distance interpreted as a jump of a vehicle triggering new route calucations
Definition: RssRouteCheckerControl.hpp:323
void dropVehicle(ad::rss::world::ObjectId vehicleId)
erase all data of a vehicle from internal lists (called by ~RssVehicleAdapter)
Definition: RssRouteCheckerControl.hpp:484
void setRoadBoundariesMode(const ::ad::rss::map::RssAppendRoadBoundariesMode roadBoundariesMode)
sets the current mode for respecting the road boundaries
Definition: RssRouteCheckerControl.hpp:295
std::function<::ad::rss::map::RssConstellationConfiguration(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &artificialObject)> ArtificialObjectConstellationCallbackFunctionType
Callback function type to query the RssConstellationConfiguration of a concrete artificial object con...
Definition: RssRouteCheckerControl.hpp:247
::ad::rss::world::RssDynamics getDefaultRssDynamics(::ad::rss::world::ObjectType const objectType, OBJECT_INSTANCE_TYPE vehicle) const
Definition: RssRouteCheckerControl.hpp:95
::ad::rss::map::RssConstellationConfiguration getPedestrianConstellation(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &pedestrianObject, OBJECT_INSTANCE_TYPE pedestrian) const
Returns the RssConstellationConfiguration of a concrete pedestrian constellation within the RssRouteC...
Definition: RssRouteCheckerControl.hpp:219
void registerArtificialObjectConstellationCallback(ArtificialObjectConstellationCallbackFunctionType callback)
Register a callback function to query the RssConstellationConfiguration of a concrete artificial obje...
Definition: RssRouteCheckerControl.hpp:252
void setLogLevel(const spdlog::level::level_enum logLevel)
sets the current log level
Definition: RssRouteCheckerControl.hpp:367
void setMapLogLevel(const spdlog::level::level_enum mapLogLevel)
sets the current map log level
Definition: RssRouteCheckerControl.hpp:375
void appendRoutingTargets(ad::rss::world::ObjectId vehicleId, ::ad::map::point::ENUPointList const &routingTargetsToAppend)
appends a list of routing targets to the current routing target list of the respective vehicle
Definition: RssRouteCheckerControl.hpp:420
void setCurrentGreenTrafficLights(::ad::map::landmark::LandmarkIdSet const &currentGreenTrafficLights)
sets the current green traffic lights to be considered
Definition: RssRouteCheckerControl.hpp:309
std::shared_ptr< RssRouteCheckerControl > Ptr
Smart pointer on RssObjectAdapter.
Definition: RssRouteCheckerControl.hpp:51
std::function<::ad::rss::map::RssConstellationConfiguration(::ad::rss::map::RssRoute const &route, ::ad::rss::map::RssObjectData const &egoVehicleObject, OBJECT_INSTANCE_TYPE egoVehicle, ::ad::rss::map::RssObjectData const &pedestrianObject, OBJECT_INSTANCE_TYPE pedestrian)> PedestrianConstellationCallbackFunctionType
Callback function type to query the RssConstellationConfiguration of a concrete pedestrian constellat...
Definition: RssRouteCheckerControl.hpp:186
void replaceRoutingTargets(ad::rss::world::ObjectId vehicleId, ::ad::map::point::ENUPointList const &newRoutingTargets)
replaces the current routing targets of the respective vehicle
Definition: RssRouteCheckerControl.hpp:440
bool isVehicleConstellationCallbackRegistered() const
Definition: RssRouteCheckerControl.hpp:137
::ad::rss::map::RssAppendRoadBoundariesMode getRoadBoundariesMode() const
Definition: RssRouteCheckerControl.hpp:302
typename RssVehicleAdapter< OBJECT_INSTANCE_TYPE >::RssRoutingTargetOperation RssRoutingTargetOperation
RssRoutingTargetOperation type from RssVehicleAdapter.
Definition: RssRouteCheckerControl.hpp:382
std::shared_ptr< RssRouteCheckerControl const > ConstPtr
Smart pointer on constant RssObjectAdapter.
Definition: RssRouteCheckerControl.hpp:56
virtual ~RssRouteCheckerControl()=default
default destructor
ad::physics::Distance getMinimumDistanceToObjectsThatHaveToBeAnalyzed() const
Defines the distance below which a detailed analysis becomes necessary regardless of the objects stop...
Definition: RssRouteCheckerControl.hpp:351
void dropRoute(ad::rss::world::ObjectId vehicleId)
drop the current route of the respective vehicle
Definition: RssRouteCheckerControl.hpp:477
RssRoutingTargetCommand
The mode to be applied on routing target operation.
Definition: RssObjectAdapter.hpp:427
static const ::ad::physics::Distance cMinConnectedRouteLength
constant defining the minimum lenght to be used for the search of connected routes
Definition: RssWorldModelCreation.hpp:192
RssAppendRoadBoundariesMode
DataType RssAppendRoadBoundariesMode.
Definition: RssAppendRoadBoundariesMode.hpp:44
std::shared_ptr< spdlog::logger > getLogger()
get the ad::rss::map logger
namespace ad
Definition: RouteAccelerations.hpp:33
DataType RssConstellationConfiguration.
Definition: RssConstellationConfiguration.hpp:43
DataType RssObjectData.
Definition: RssObjectData.hpp:52
DataType RssRoute.
Definition: RssRoute.hpp:49
The mode to be applied on routing target operation.
Definition: RssObjectAdapter.hpp:439