ad_rss_map_integration
ParallelObjectUpdater.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/map/match/AdMapMatching.hpp"
10 #include "ad/rss/map/Logging.hpp"
13 
14 namespace ad {
15 namespace rss {
16 namespace map {
17 
18 template <class OBJECT_INSTANCE_TYPE> class ParallelObjectUpdater
19 {
20 public:
21  ParallelObjectUpdater(std::chrono::system_clock::time_point const &currentTime,
22  ::ad::physics::Distance const vehicleSamplingDistance,
23  ::ad::physics::Distance const pedestrianSamplingDistance,
24  ::ad::physics::Distance const artificialObjectSamplingDistance,
25  ::ad::map::lane::LaneIdSet const &mapAreaLanes)
26  : mCurrentTime(currentTime)
27  , mVehicleSamplingDistance(vehicleSamplingDistance)
28  , mPedestrianSamplingDistance(pedestrianSamplingDistance)
29  , mArtificialObjectSamplingDistance(artificialObjectSamplingDistance)
30  , mConservativeMaxStoppingDistance(0.)
31  , mMaxVehicleLength(0.)
32  {
33  mMapMatching.setRelevantLanes(mapAreaLanes);
34  }
35 
36  ParallelObjectUpdater(ParallelObjectUpdater const &other) = delete;
37  ParallelObjectUpdater &operator=(ParallelObjectUpdater const &other) = delete;
38 
39  void operator()(typename RssRouteCheckerPedestrianDataMap<OBJECT_INSTANCE_TYPE>::value_type &pedestrianToUpdate) const
40  {
41  if (pedestrianToUpdate.second.mActive)
42  {
43  auto pedestrianAdapter = pedestrianToUpdate.second.getAdapter();
44  if (!bool(pedestrianAdapter))
45  {
46  throw std::runtime_error("RssRouteChecker::ParallelObjectUpdater>> pedestrian adapter invalid");
47  }
48  pedestrianToUpdate.second.mRssObjectData
49  = getRssObjectData(pedestrianAdapter, mPedestrianSamplingDistance, pedestrianAdapter->getObjectType());
50  pedestrianToUpdate.second.mClearObjectHistory = !pedestrianAdapter->isObjectIdUniqueOverTime();
51  getLogger()->trace("ParallelObjectUpdater::updatePedestrian[{}] {}",
52  pedestrianAdapter->getObjectId(),
53  pedestrianToUpdate.second.mRssObjectData);
54  }
55  }
56 
57  void operator()(
58  typename RssRouteCheckerArtificialObjectDataMap<OBJECT_INSTANCE_TYPE>::value_type &artificialObjectToUpdate) const
59  {
60  if (artificialObjectToUpdate.second.mActive)
61  {
62  auto artificialObjectAdapter = artificialObjectToUpdate.second.getAdapter();
63  if (!bool(artificialObjectAdapter))
64  {
65  throw std::runtime_error("RssRouteChecker::ParallelObjectUpdater>> artificialObject adapter invalid");
66  }
67  artificialObjectToUpdate.second.mRssObjectData = getRssObjectData(
68  artificialObjectAdapter, mArtificialObjectSamplingDistance, artificialObjectAdapter->getObjectType());
69  artificialObjectToUpdate.second.mClearObjectHistory = !artificialObjectAdapter->isObjectIdUniqueOverTime();
70 
71  getLogger()->trace("ParallelObjectUpdater::updateArtificialObject[{}] {}",
72  artificialObjectAdapter->getObjectId(),
73  artificialObjectToUpdate.second.mRssObjectData);
74  }
75  }
76 
77  void operator()(typename RssRouteCheckerVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &vehicleToUpdate) const
78  {
79  if (vehicleToUpdate.second.mActive)
80  {
81  auto vehicleAdapter = vehicleToUpdate.second.getAdapter();
82  if (!bool(vehicleAdapter))
83  {
84  throw std::runtime_error("RssRouteChecker::ParallelObjectUpdater>> vehicle adapter invalid");
85  }
86  updateVehicle(vehicleToUpdate.second, vehicleAdapter->getObjectType());
87  }
88  }
89 
90  void operator()(typename RssRouteCheckerEgoVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &egoVehicleToUpdate) const
91  {
92  if (egoVehicleToUpdate.second.mActive)
93  {
94  auto egoVehicleAdapter = egoVehicleToUpdate.second.getAdapter();
95  if (!bool(egoVehicleAdapter))
96  {
97  throw std::runtime_error("RssRouteChecker::ParallelObjectUpdater>> ego_vehicle adapter invalid");
98  }
99  updateVehicle(egoVehicleToUpdate.second, egoVehicleAdapter->getObjectType());
100  }
101  }
102 
103  RssObjectData getRssObjectData(typename RssObjectAdapter<OBJECT_INSTANCE_TYPE>::Ptr object,
104  physics::Distance const sampling_distance,
105  ::ad::rss::world::ObjectType const object_type) const
106  {
107  RssObjectData rssObjectData;
108  rssObjectData.id = object->getObjectId();
109  rssObjectData.type = object_type;
110  rssObjectData.last_update = mCurrentTime;
111  rssObjectData.match_object = object->getMatchedObject(mMapMatching, sampling_distance);
112  rssObjectData.speed_range = object->getSpeedRange();
113  rssObjectData.yaw_rate = object->getYawRate();
114  rssObjectData.rss_dynamics = object->getDefaultRssDynamics();
115  rssObjectData.steering_angle = object->getSteeringAngle();
116  return rssObjectData;
117  }
118 
119  void updateVehicle(RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE> &vehicle,
120  ::ad::rss::world::ObjectType const object_type) const
121  {
122  auto const lastCenterPoint = vehicle.mRssObjectData.match_object.enu_position.center_point;
123  auto vehicleAdapter = vehicle.getAdapter();
124  if (!bool(vehicleAdapter))
125  {
126  throw std::runtime_error("RssRouteChecker::ParallelObjectUpdater>> vehicle adapter invalid");
127  }
128  vehicle.mRssObjectData = getRssObjectData(vehicleAdapter, mVehicleSamplingDistance, object_type);
129  vehicle.mClearObjectHistory = !vehicleAdapter->isObjectIdUniqueOverTime();
130  getLogger()->trace(
131  "ParallelObjectUpdater::updateVehicle[{}] {}", vehicleAdapter->getObjectId(), vehicle.mRssObjectData);
132 
133  if ((::ad::rss::world::ObjectType::OtherObject == vehicle.mRssObjectData.type) || vehicle.mClearObjectHistory)
134  {
135  // OtherObject types are not taking routes into consideration, because using unstructured evaluation
136  // explictly cleanup requests also clear routes
137  vehicle.mRoutes.clear();
138  // clear routing targets, too
139  vehicle.mRoutingTargets.clear();
140  }
141  else if (isValid(lastCenterPoint, false) && (!vehicle.mRoutes.empty()))
142  {
143  auto const traveledDistance
144  = ad::map::point::distance(vehicle.mRssObjectData.match_object.enu_position.center_point, lastCenterPoint);
145 
146  // check for bigger position jumps of the vehicle
147  if (traveledDistance > vehicleAdapter->getPositionJumpTraveledDistance())
148  {
149  getLogger()->warn("ParallelObjectUpdater::updateVehicle[{}] Jump of {} in vehicle position detected {} -> {}, "
150  "larger than allowed distance {}. Force new route!",
151  vehicle.mRssObjectData.id,
152  traveledDistance,
153  lastCenterPoint,
154  vehicle.mRssObjectData.match_object.enu_position.center_point,
155  vehicleAdapter->getPositionJumpTraveledDistance());
156  vehicle.mRoutes.clear();
157  }
158  }
159 
160  updateConservativeMaxStoppingDistance(vehicle);
161  }
162 
163  ad::physics::Distance getMinRoutePreviewDistance()
164  {
165  uint32_t currentMaxStoppingDistance = mConservativeMaxStoppingDistance;
166  // get rid of small fluctuations
167  currentMaxStoppingDistance /= 10u;
168  currentMaxStoppingDistance++;
169  currentMaxStoppingDistance *= 10;
170  ::ad::physics::Distance result(2 * currentMaxStoppingDistance);
171  // ensure to be larger than min connected route length
172  result = std::max(result, RssWorldModelCreation::cMinConnectedRouteLength);
173  // ensure to consider the max vehicle length to prevent from recalculations
174  result += ::ad::physics::Distance(mMaxVehicleLength);
175  // now the route preview distance should be exactly what is required for
176  // world model creation, except for changes due to individualized RssDynamics
177  // of the situations
178  // -> this has an actual positive effect on runtime
179  return result;
180  }
181 
182 private:
183  // mConservativeMaxStoppingDistance is mutable and we ensure safe multi-threaded update
184  void updateConservativeMaxStoppingDistance(RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE> &vehicle) const
185  {
186  ::ad::physics::Distance conservativeMinStoppingDistance;
188  vehicle.mRssObjectData.speed_range.maximum,
190  conservativeMinStoppingDistance))
191  {
192  // lock-free update of mConservativeMaxStoppingDistance
193  auto const conservativeMinStoppingDistance_uint
194  = static_cast<uint32_t>(conservativeMinStoppingDistance.mDistance);
195  uint32_t currentMaxStoppingDistance = mConservativeMaxStoppingDistance;
196  while (conservativeMinStoppingDistance_uint > currentMaxStoppingDistance)
197  {
198  mConservativeMaxStoppingDistance.compare_exchange_weak(currentMaxStoppingDistance,
199  conservativeMinStoppingDistance_uint);
200  }
201  }
202  // lock-free update of mConservativeMaxStoppingDistance
203  auto const vehicleLength_uint = static_cast<uint32_t>(vehicle.getAdapter()->getDimensions().length.mDistance);
204  uint32_t currentMaxVehicleLength = mMaxVehicleLength;
205  while (vehicleLength_uint > currentMaxVehicleLength)
206  {
207  mMaxVehicleLength.compare_exchange_weak(currentMaxVehicleLength, vehicleLength_uint);
208  }
209  }
210 
211  std::chrono::system_clock::time_point const mCurrentTime;
212  ::ad::map::match::AdMapMatching mMapMatching;
213  ::ad::physics::Distance const mVehicleSamplingDistance;
214  ::ad::physics::Distance const mPedestrianSamplingDistance;
215  ::ad::physics::Distance const mArtificialObjectSamplingDistance;
216  mutable std::atomic_uint32_t mConservativeMaxStoppingDistance;
217  mutable std::atomic_uint32_t mMaxVehicleLength;
218 };
219 
220 } // namespace map
221 } // namespace rss
222 } // namespace ad
Definition: ParallelObjectUpdater.hpp:19
std::shared_ptr< RssObjectAdapter > Ptr
Smart pointer on RssObjectAdapter.
Definition: RssObjectAdapter.hpp:62
static bool calculateConservativeMinStoppingDistance(::ad::rss::world::ObjectId const &object_id, ::ad::physics::Speed const &current_speed, ::ad::rss::world::RssDynamics const &rss_dynamics, ::ad::physics::Distance &conservativeMinStoppingDistance)
bool mClearObjectHistory
flag indicating if the object's history has to be cleared
Definition: RssRouteCheckerData.hpp:64
Class to store data of RssVehicleAdapter.
Definition: RssRouteCheckerData.hpp:124
std::vector<::ad::map::point::ENUPoint > mRoutingTargets
the list of routing target to be used for routing purposes
Definition: RssRouteCheckerData.hpp:200
RssRouteList mRoutes
the sorted list of routes
Definition: RssRouteCheckerData.hpp:194
RssObjectData mRssObjectData
the actual RssObjectData of this
Definition: RssRouteCheckerData.hpp:67
RssVehicleAdapterType::Ptr getAdapter()
function to get the adapter class of this
Definition: RssRouteCheckerData.hpp:152
static const ::ad::physics::Distance cMinConnectedRouteLength
constant defining the minimum lenght to be used for the search of connected routes
Definition: RssWorldModelCreation.hpp:192
std::map<::ad::rss::world::ObjectId, RssRouteCheckerEgoVehicleData< OBJECT_INSTANCE_TYPE > > RssRouteCheckerEgoVehicleDataMap
Definition: RssRouteCheckerData.hpp:387
std::map<::ad::rss::world::ObjectId, RssRouteCheckerArtificialObjectData< OBJECT_INSTANCE_TYPE > > RssRouteCheckerArtificialObjectDataMap
Definition: RssRouteCheckerData.hpp:393
std::shared_ptr< spdlog::logger > getLogger()
get the ad::rss::map logger
std::map<::ad::rss::world::ObjectId, RssRouteCheckerVehicleData< OBJECT_INSTANCE_TYPE > > RssRouteCheckerVehicleDataMap
Definition: RssRouteCheckerData.hpp:381
std::map<::ad::rss::world::ObjectId, RssRouteCheckerPedestrianData< OBJECT_INSTANCE_TYPE > > RssRouteCheckerPedestrianDataMap
Definition: RssRouteCheckerData.hpp:375
namespace ad
Definition: RouteAccelerations.hpp:33
DataType RssObjectData.
Definition: RssObjectData.hpp:52
::ad::rss::world::ObjectId id
Definition: RssObjectData.hpp:135
::ad::map::match::Object match_object
Definition: RssObjectData.hpp:145
::ad::physics::AngularVelocity yaw_rate
Definition: RssObjectData.hpp:156
::ad::physics::Angle steering_angle
Definition: RssObjectData.hpp:161
::ad::rss::world::ObjectType type
Definition: RssObjectData.hpp:140
std::chrono::system_clock::time_point last_update
Definition: RssObjectData.hpp:130
::ad::rss::world::RssDynamics rss_dynamics
Definition: RssObjectData.hpp:166
::ad::physics::SpeedRange speed_range
Definition: RssObjectData.hpp:151