ad_rss_map_integration
ParallelWorldModelCreator.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 ParallelWorldModelCreator
18 {
19 public:
20  ParallelWorldModelCreator(::ad::rss::world::TimeIndex const time_index,
22  RssRoute const &rss_route,
23  ConnectingRoutesCache &connecting_routes_cache,
24  ::ad::map::lane::LaneIdSet const &mapAreaLanes)
25  : mEgoVehicleData(egoVehicleData)
26  , mRssRoute(rss_route)
27  , mWorldModelCreation(time_index, mEgoVehicleData.mRssObjectData.rss_dynamics, connecting_routes_cache)
28  , mMapAreaLanes(mapAreaLanes)
29  {
30  mWorldModelCreation.setRouteId(mRssRoute.route_id);
31  auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
32  if (!bool(egoVehicleAdapter))
33  {
34  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
35  }
37  egoVehicleAdapter->getMinimumDistanceToObjectsThatHaveToBeAnalyzed());
38 
39  mGreenTrafficLightsOnRoute = egoVehicleAdapter->getGreenTrafficLightsOnRoute(mRssRoute.route);
40  auto const roadBoundariesMode = egoVehicleAdapter->getRoadBoundariesMode(mRssRoute.route);
41  ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
42  // don't expect acceleration towards boundaries ('soft border')
43  // and ignore ego fluctuation margin to get smoother behavior
44  egoObjectData.rss_dynamics.alpha_lat.accel_max = ::ad::physics::Acceleration(0.);
45  egoObjectData.rss_dynamics.lateral_fluctuation_margin = ::ad::physics::Distance(0.);
46  mWorldModelCreation.appendRoadBoundaries(egoObjectData, mRssRoute.route, roadBoundariesMode);
47  }
48 
50  ParallelWorldModelCreator &operator=(ParallelWorldModelCreator const &other) = delete;
51 
52  void
53  operator()(typename RssRouteCheckerPedestrianDataMap<OBJECT_INSTANCE_TYPE>::value_type &pedestrianToProcess) const
54  {
55  if (pedestrianToProcess.second.mActive)
56  {
57  auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
58  if (!bool(egoVehicleAdapter))
59  {
60  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
61  }
62  auto pedestrianAdapter = pedestrianToProcess.second.getAdapter();
63  if (!bool(pedestrianAdapter))
64  {
65  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> pedestrian adapter invalid");
66  }
67  ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
68  ::ad::rss::map::RssObjectData pedestrianData = pedestrianToProcess.second.mRssObjectData;
69  auto rssConstellationResult = egoVehicleAdapter->getPedestrianConstellationOnRoute(
70  mRssRoute, egoObjectData, pedestrianAdapter, pedestrianData);
71  egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
72  pedestrianData.rss_dynamics = rssConstellationResult.object_dynamics;
73 
74  mWorldModelCreation.appendConstellations(egoObjectData,
75  mRssRoute.route,
76  pedestrianData,
77  rssConstellationResult.restrict_speed_limit_mode,
78  mGreenTrafficLightsOnRoute,
79  rssConstellationResult.constellation_creation_mode,
80  mMapAreaLanes);
81  }
82  }
83 
84  void operator()(
85  typename RssRouteCheckerArtificialObjectDataMap<OBJECT_INSTANCE_TYPE>::value_type &artificialObjectToProcess) const
86  {
87  if (artificialObjectToProcess.second.mActive)
88  {
89  auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
90  if (!bool(egoVehicleAdapter))
91  {
92  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
93  }
94  auto artificialObjectAdapter = artificialObjectToProcess.second.getAdapter();
95  if (!bool(artificialObjectAdapter))
96  {
97  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> artificialObject adapter invalid");
98  }
99  ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
100  ::ad::rss::map::RssObjectData artificialObjectData = artificialObjectToProcess.second.mRssObjectData;
101  auto rssConstellationResult = egoVehicleAdapter->getArtificialObjectConstellationOnRoute(
102  mRssRoute, egoObjectData, artificialObjectAdapter, artificialObjectData);
103  egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
104  artificialObjectData.rss_dynamics = rssConstellationResult.object_dynamics;
105 
106  mWorldModelCreation.appendConstellations(egoObjectData,
107  mRssRoute.route,
108  artificialObjectData,
109  rssConstellationResult.restrict_speed_limit_mode,
110  mGreenTrafficLightsOnRoute,
111  rssConstellationResult.constellation_creation_mode,
112  mMapAreaLanes);
113  }
114  }
115 
116  void operator()(typename RssRouteCheckerVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &vehicleToProcess) const
117  {
118  if (vehicleToProcess.second.mActive)
119  {
120  process(vehicleToProcess.second);
121  }
122  }
123 
124  void operator()(typename RssRouteCheckerEgoVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &vehicleToProcess) const
125  {
126  if ((vehicleToProcess.second.mActive)
127  && (vehicleToProcess.second.mRssObjectData.id != mEgoVehicleData.mRssObjectData.id))
128  {
129  process(vehicleToProcess.second);
130  }
131  }
132 
133  void process(RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE> const &vehicleToProcess) const
134  {
135  auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
136  if (!bool(egoVehicleAdapter))
137  {
138  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
139  }
140  auto vehicleAdapter = vehicleToProcess.getAdapter();
141  if (!bool(vehicleAdapter))
142  {
143  throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> vehicle adapter invalid");
144  }
145  ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
146  ::ad::rss::map::RssObjectData vehicleData = vehicleToProcess.mRssObjectData;
147  if (vehicleData.type == ::ad::rss::world::ObjectType::EgoVehicle)
148  {
149  vehicleData.type = ::ad::rss::world::ObjectType::OtherVehicle;
150  }
151  auto rssConstellationResult
152  = egoVehicleAdapter->getVehicleConstellationOnRoute(mRssRoute, egoObjectData, vehicleAdapter, vehicleData);
153  egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
154  vehicleData.rss_dynamics = rssConstellationResult.object_dynamics;
155 
156  if ((mEgoVehicleData.mRouteExtensionMode
158  && (vehicleToProcess.mRouteExtensionMode
160  {
161  // only can deploy the routes if all routes have been considered
162  mWorldModelCreation.appendConstellations(egoObjectData,
163  mRssRoute.route,
164  vehicleData,
165  rssConstellationResult.restrict_speed_limit_mode,
166  mGreenTrafficLightsOnRoute,
167  rssConstellationResult.constellation_creation_mode,
168  mEgoVehicleData.mRoutes,
169  vehicleToProcess.mRoutes,
170  mMapAreaLanes);
171  }
172  else
173  {
174  mWorldModelCreation.appendConstellations(egoObjectData,
175  mRssRoute.route,
176  vehicleData,
177  rssConstellationResult.restrict_speed_limit_mode,
178  mGreenTrafficLightsOnRoute,
179  rssConstellationResult.constellation_creation_mode,
180  mMapAreaLanes);
181  }
182  }
183 
184  ::ad::rss::world::WorldModel getWorldModel()
185  {
186  return mWorldModelCreation.getWorldModel();
187  }
188 
189 private:
191  RssRoute const &mRssRoute;
192  // the constellation creation calls are thread-safe, therefore mark mutable here is ok.
193  mutable RssWorldModelCreation mWorldModelCreation;
194  ::ad::map::landmark::LandmarkIdSet mGreenTrafficLightsOnRoute;
195  ::ad::map::lane::LaneIdSet const &mMapAreaLanes;
196 };
197 
198 } // namespace map
199 } // namespace rss
200 } // namespace ad
class to cache ConnectingRouteList between vehicles to speed up world model creation
Definition: ConnectingRoutesCache.hpp:36
Definition: ParallelWorldModelCreator.hpp:18
Class to store data of RssVehicleAdapter.
Definition: RssRouteCheckerData.hpp:258
Class to store data of RssVehicleAdapter.
Definition: RssRouteCheckerData.hpp:124
RssRouteList mRoutes
the sorted list of routes
Definition: RssRouteCheckerData.hpp:194
RssObjectData mRssObjectData
the actual RssObjectData of this
Definition: RssRouteCheckerData.hpp:67
RouteExtensionMode mRouteExtensionMode
the current active route extension mode
Definition: RssRouteCheckerData.hpp:192
RssVehicleAdapterType::Ptr getAdapter()
function to get the adapter class of this
Definition: RssRouteCheckerData.hpp:152
class providing supporting functions to create a world model and its constellations.
Definition: RssWorldModelCreation.hpp:51
void setRouteId(::ad::rss::map::RssRouteId const &route_id)
Setter for a route_id provided on debug output.
Definition: RssWorldModelCreation.hpp:85
bool appendConstellations(RssObjectData const &egoObjectData, ::ad::map::route::FullRoute const &egoRoute, RssObjectData const &otherObjectData, RssRestrictSpeedLimitMode const &restrict_speed_limit_mode, ::ad::map::landmark::LandmarkIdSet const &greenTrafficLights, ::ad::rss::map::RssConstellationCreationMode const &mode, ::ad::map::lane::LaneIdSet const &relevantLanes=::ad::map::lane::LaneIdSet())
create possible constellations between ego vehicle and the object
void setMinimumDistanceToObjectsThatHaveToBeAnalyzed(ad::physics::Distance const minimumDistanceToObjectsThatHaveToBeAnalyzed)
Sets the distance below which a detailed analysis becomes necessary regardless of the objects stoppin...
Definition: RssWorldModelCreation.hpp:95
bool appendRoadBoundaries(RssObjectData const &egoObjectData, ::ad::map::route::FullRoute const &route, RssAppendRoadBoundariesMode const operationMode)
create constellations between ego vehicle and road boundaries
::ad::rss::world::WorldModel getWorldModel()
get the final world model object
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::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::ObjectType type
Definition: RssObjectData.hpp:140
::ad::rss::world::RssDynamics rss_dynamics
Definition: RssObjectData.hpp:166
DataType RssRoute.
Definition: RssRoute.hpp:49
::ad::rss::map::RssRouteId route_id
Definition: RssRoute.hpp:127
::ad::map::route::FullRoute route
Definition: RssRoute.hpp:132