ad_rss_map_integration
RssRouteCheckerDataDetail.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 
9 #include <ad/map/lane/Operation.hpp>
10 #include <ad/map/match/MapMatchedOperation.hpp>
11 #include <ad/map/route/Planning.hpp>
12 #include "ad/rss/map/Logging.hpp"
16 
17 namespace ad {
18 namespace rss {
19 namespace map {
20 
22 {
23  // housekeeping of RssRouteCheckerControl
24  if (mVehicleAdapter != nullptr)
25  {
26  mVehicleAdapter->getCheckerControl()->dropVehicle(mRssObjectData.id);
27  }
28 }
29 
30 enum class ReachedRoutingTargetsMode
31 {
32  eDISTANCE_ONLY,
33  eDISTANCE_AND_ORIENTATION
34 };
35 
36 inline void dropReachedRoutingTargets(std::vector<::ad::map::point::ENUPoint> &routingTargets,
37  RssObjectData const &rssObjectData,
38  ad::physics::Distance const &reachedDistance,
39  ReachedRoutingTargetsMode reachedRoutingTargetsMode)
40 {
41  // removeReachedRoutingTargets
42  while (!routingTargets.empty())
43  {
44  auto const nextTarget = routingTargets.front();
45  auto const distanceToNextTarget
46  = ad::map::point::distance(nextTarget, rssObjectData.match_object.enu_position.center_point);
47  if (distanceToNextTarget < reachedDistance)
48  {
49  routingTargets.erase(routingTargets.begin());
50  getLogger()->debug(
51  "RssRouteCheckerVehicleData::removeReachedRoutingTargets[{}] Next target reached by distance: {}; "
52  "remaining targets: {}",
53  rssObjectData.id,
54  nextTarget,
55  routingTargets);
56  }
57  else if ((reachedRoutingTargetsMode == ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION)
58  && (routingTargets.size() > 1u) && (distanceToNextTarget < 10. * reachedDistance))
59 
60  {
61  // if we have a new list of targets and there will be additional targets left if we drop this
62  // and the next target is already located behind the vehicle and not more than 10 time further away as
63  // reachedDistance, we also drop this; otherwhise the ego might try to plan more or less a round trip before
64  // finishing the target list
65  auto routingTargetHeading
66  = ad::map::point::createENUHeading(rssObjectData.match_object.enu_position.center_point, nextTarget);
67  auto headingDiffSigned = ad::physics::normalizeAngleSigned(ad::physics::Angle(
68  routingTargetHeading.mENUHeading - rssObjectData.match_object.enu_position.heading.mENUHeading));
69  if (std::fabs(headingDiffSigned) > ad::physics::cPI_2)
70  {
71  routingTargets.erase(routingTargets.begin());
72  getLogger()->debug(
73  "RssRouteCheckerVehicleData::removeReachedRoutingTargets[{}] Next target reached by orientation: {}, {}; "
74  "remaining targets: {}",
75  rssObjectData.id,
76  nextTarget,
77  headingDiffSigned,
78  routingTargets);
79  }
80  else
81  {
82  break;
83  }
84  }
85  else
86  {
87  break;
88  }
89  }
90 }
91 
92 template <class OBJECT_INSTANCE_TYPE>
94 {
95  auto const routingTargetOperation = getAdapter()->getRoutingTargetOperation();
96  std::vector<::ad::map::point::ENUPoint> routingTargetsToAppend;
97  if (routingTargetOperation.command
99  {
100  mRoutes.clear();
101  mRoutingTargets = routingTargetOperation.routingTargets;
102  dropReachedRoutingTargets(mRoutingTargets,
103  mRssObjectData,
104  getAdapter()->getRoutingTargetReachedDistance(),
105  ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION);
106  }
107  else
108  {
109  dropReachedRoutingTargets(mRoutingTargets,
110  mRssObjectData,
111  getAdapter()->getRoutingTargetReachedDistance(),
112  ReachedRoutingTargetsMode::eDISTANCE_ONLY);
113 
114  if (routingTargetOperation.command
116  {
117  routingTargetsToAppend = routingTargetOperation.routingTargets;
118  dropReachedRoutingTargets(routingTargetsToAppend,
119  mRssObjectData,
120  getAdapter()->getRoutingTargetReachedDistance(),
121  ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION);
122  }
123  }
124  return routingTargetsToAppend;
125 }
126 
127 template <class OBJECT_INSTANCE_TYPE> void RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE>::shortenRoutes()
128 {
129  ad::map::point::ParaPointList allLaneMatches;
130  for (auto const &referencePoint :
131  {::ad::map::match::ObjectReferencePoints::RearRight, ::ad::map::match::ObjectReferencePoints::RearLeft})
132  {
133  for (auto const &matchPoint :
134  mRssObjectData.match_object.map_matched_bounding_box.reference_point_positions[size_t(referencePoint)])
135  {
136  // consider only longitudinal in lane matches here, because we want to cover the rear of the vehicle
137  // allow lateral outside matches to cover vehicle driving slightly outside the route
138  if (ad::map::match::isLongitudinalInLaneMatch(matchPoint))
139  {
140  allLaneMatches.push_back(matchPoint.lane_point.para_point);
141  }
142  }
143  }
144 
145  auto routeIndex = 0u;
146  while (routeIndex < mRoutes.size())
147  {
148  getLogger()->trace("RssVehicleAdapter::shortenRoutes[{}:{}] call shorten route with {} and {}",
149  mRssObjectData.id,
150  mRoutes[routeIndex].route_id,
151  allLaneMatches,
152  mRoutes[routeIndex].route);
153  auto shortenRouteResult = ::ad::map::route::shortenRoute(
154  allLaneMatches,
155  mRoutes[routeIndex].route,
156  ::ad::map::route::ShortenRouteMode::DontCutIntersectionAndPrependIfSucceededBeforeRoute);
157 
158  if ((shortenRouteResult != ::ad::map::route::ShortenRouteResult::Succeeded)
159  && (shortenRouteResult != ::ad::map::route::ShortenRouteResult::SucceededIntersectionNotCut))
160  {
161  getLogger()->trace("RssVehicleAdapter::shortenRoutes[{}:{}] shorten current route failed. Dropping. {}",
162  mRssObjectData.id,
163  mRoutes[routeIndex].route_id,
164  mRoutes[routeIndex].route);
165  mRoutes.erase(mRoutes.begin() + routeIndex);
166  }
167  else
168  {
169  getLogger()->trace("RssVehicleAdapter::shortenRoutes[{}:{}] shorten current route succeeded {}",
170  mRssObjectData.id,
171  mRoutes[routeIndex].route_id,
172  mRoutes[routeIndex].route);
173  auto findWaypointResult = findNearestWaypoint(allLaneMatches, mRoutes[routeIndex].route);
174  mRoutes[routeIndex].progress_on_route = calcLength(findWaypointResult);
175  routeIndex++;
176  }
177  }
178 }
179 
180 template <class OBJECT_INSTANCE_TYPE>
182  physics::Distance const routePreviewDistance,
183  std::vector<::ad::map::point::ENUPoint> const &routingTargetsToAppend,
184  ::ad::map::lane::LaneIdSet const &mapAreaLanes)
185 {
186  RssRouteList routesToAdd;
187  auto routeIndex = 0u;
188  while (routeIndex < mRoutes.size())
189  {
190  std::vector<::ad::map::route::FullRoute> additionalRoutes;
191 
192  bool routeValid = false;
193  if (!routingTargetsToAppend.empty())
194  {
195  routeValid = ::ad::map::route::extendRouteToDestinations(mRoutes[routeIndex].route, routingTargetsToAppend);
196  mRoutingTargets.insert(mRoutingTargets.end(), routingTargetsToAppend.begin(), routingTargetsToAppend.end());
197  }
198  else if (mRoutingTargets.empty() && (mRouteExtensionMode != RouteExtensionMode::eAllowOnlyTargetRoute))
199  {
200  // only extend if no routing targets are provided and not forbidden to extend by extension mode
201  routeValid = ::ad::map::route::extendRouteToDistance(mRoutes[routeIndex].route,
202  mRoutes[routeIndex].progress_on_route + routePreviewDistance,
203  additionalRoutes,
204  mapAreaLanes);
205  }
206  else
207  {
208  routeValid = true;
209  }
210 
211  if (routeValid)
212  {
213  getLogger()->trace("RssVehicleAdapter::extendRoutes[{}:{}] extended current route {} {}",
214  mRssObjectData.id,
215  mRoutes[routeIndex].route_id,
216  mRoutes[routeIndex].progress_on_route,
217  mRoutes[routeIndex].route);
218  if (mRouteExtensionMode == RouteExtensionMode::eAllowMultipleRoutes)
219  {
220  for (auto &additionalRoute : additionalRoutes)
221  {
222  bool addRoute = true;
223  for (auto checkRouteIndex = 0u; checkRouteIndex < mRoutes.size(); checkRouteIndex++)
224  {
225  if (checkRouteIndex != routeIndex)
226  {
227  auto const compareResult = ::ad::map::route::planning::compareRoutesOnIntervalLevel(
228  additionalRoute, mRoutes[checkRouteIndex].route);
229  if (compareResult != ::ad::map::route::planning::CompareRouteResult::Differ)
230  {
231  getLogger()->trace("RssVehicleAdapter::extendRoutes[{}:{}] drop additional route {} because compares "
232  "{} to route_id {} {}",
233  mRssObjectData.id,
234  mRoutes[routeIndex].route_id,
235  additionalRoute,
236  compareResult,
237  mRoutes[checkRouteIndex].route_id,
238  mRoutes[checkRouteIndex].route);
239  addRoute = false;
240  break;
241  }
242  }
243  }
244 
245  if (addRoute)
246  {
247  // as the current point in the route is identical with the new one, we take over the current vehicle
248  // dynamics, too.
249  RssRoute newRssRoute;
250  newRssRoute.route_id = mNextRouteId++;
251  newRssRoute.route = additionalRoute;
252  newRssRoute.vehicle_dynamics_on_route = mRoutes[routeIndex].vehicle_dynamics_on_route;
253  newRssRoute.likelihood = mRoutes[routeIndex].likelihood;
254  newRssRoute.parent_route_id = mRoutes[routeIndex].route_id;
255  newRssRoute.progress_on_route = mRoutes[routeIndex].progress_on_route;
256  getLogger()->trace("RssVehicleAdapter::extendRoutes[{}:{}] additional route {}: {} {}",
257  mRssObjectData.id,
258  mRoutes[routeIndex].route_id,
259  newRssRoute.route_id,
260  newRssRoute.progress_on_route,
261  newRssRoute.route);
262  routesToAdd.push_back(newRssRoute);
263  }
264  }
265  }
266  else if (additionalRoutes.size() > 0u)
267  {
268  getLogger()->trace(
269  "RssVehicleAdapter::extendRoutes[{}:{}] allow only single route mode: drop additional routes {}",
270  mRssObjectData.id,
271  mRoutes[routeIndex].route_id,
272  additionalRoutes.size());
273  }
274  routeIndex++;
275  }
276  else
277  {
278  // drop this
279  getLogger()->warn("RssVehicleAdapter::extendRoutes[{}:{}] extend current route failed, dropping {}",
280  mRssObjectData.id,
281  mRoutes[routeIndex].route_id,
282  mRoutes[routeIndex].route);
283  mRoutes.erase(mRoutes.begin() + routeIndex);
284  }
285  }
286  mRoutes.insert(mRoutes.end(), routesToAdd.begin(), routesToAdd.end());
287 }
288 
289 template <class OBJECT_INSTANCE_TYPE>
290 std::vector<::ad::map::route::FullRoute>
291 RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE>::createRoutes(physics::Distance const routePreviewDistance,
292  ::ad::map::lane::LaneIdSet const &mapAreaLanes)
293 {
294  std::vector<::ad::map::route::FullRoute> newRoutes;
295  for (const auto &refPoint :
296  {::ad::map::match::ObjectReferencePoints::RearLeft, ::ad::map::match::ObjectReferencePoints::RearRight})
297  {
298  for (const auto &position :
299  mRssObjectData.match_object.map_matched_bounding_box.reference_point_positions[std::size_t(int32_t(refPoint))])
300  {
301  // consider only longitudinal in lane matches here, to be consistent to shortenRoute
302  // otherwhise the next shorten route might fail
303  if (!ad::map::match::isLongitudinalInLaneMatch(position))
304  {
305  continue;
306  }
307  auto startPoint = position.lane_point.para_point;
308  auto projectedStartPoint = startPoint;
309  if (!::ad::map::lane::isHeadingInLaneDirection(startPoint, mRssObjectData.match_object.enu_position.heading))
310  {
311  getLogger()->trace("Vehicle heading in opposite lane direction");
312  if (::ad::map::lane::projectPositionToLaneInHeadingDirection(
313  startPoint, mRssObjectData.match_object.enu_position.heading, projectedStartPoint))
314  {
315  getLogger()->trace("Projected to lane {}", projectedStartPoint.lane_id);
316  }
317  }
318  getLogger()->trace("Route startPoint: {}, projectedStartPoint: {}", startPoint, projectedStartPoint);
319  auto routingStartPoint = ::ad::map::route::planning::createRoutingPoint(
320  projectedStartPoint, mRssObjectData.match_object.enu_position.heading);
321 
322  if (!mRoutingTargets.empty() && ad::map::point::isValid(mRoutingTargets))
323  {
324  auto newRoute = ::ad::map::route::planning::planRoute(
325  routingStartPoint, mRoutingTargets, ::ad::map::route::RouteCreationMode::AllRoutableLanes);
326  if (newRoute.route_planning_counter > 0u)
327  {
328  newRoutes.push_back(newRoute);
329  getLogger()->trace("Route found from startPoint: {}, projectedStartPoint: {}, routingTargets: {}, route: {}",
330  startPoint,
331  projectedStartPoint,
332  mRoutingTargets,
333  newRoute);
334  }
335  else
336  {
337  getLogger()->warn("No Route found from startPoint: {}, projectedStartPoint: {}, routingTargets: {}",
338  startPoint,
339  projectedStartPoint,
340  mRoutingTargets);
341  }
342  }
343  else if (mRouteExtensionMode != RouteExtensionMode::eAllowOnlyTargetRoute)
344  {
345  // better prefer longer routes to ensure back of the vehicle is in
346  auto newRoutesFromCurrentStart = ::ad::map::route::planning::predictRoutesOnDistance(
347  routingStartPoint,
348  routePreviewDistance,
349  ::ad::map::route::RouteCreationMode::AllRoutableLanes,
350  ::ad::map::route::planning::FilterDuplicatesMode::SubRoutesPreferLongerOnes,
351  mapAreaLanes);
352  newRoutes.insert(newRoutes.end(), newRoutesFromCurrentStart.begin(), newRoutesFromCurrentStart.end());
353  getLogger()->trace("Routes predicted from startPoint: {}, projectedStartPoint: {}, routes: {}",
354  startPoint,
355  projectedStartPoint,
356  newRoutesFromCurrentStart);
357  }
358  }
359  }
360 
361  // better prefer longer routes to ensure back of the vehicle is in
362  newRoutes = ::ad::map::route::planning::filterDuplicatedRoutes(
363  newRoutes, ::ad::map::route::planning::FilterDuplicatesMode::SubRoutesPreferLongerOnes);
364 
365  return newRoutes;
366 }
367 
368 template <class OBJECT_INSTANCE_TYPE>
370  ::ad::physics::Distance const routePreviewDistance,
371  ::ad::map::lane::LaneIdSet const &mapAreaLanes,
373 {
374  mRouteExtensionMode = routeExtensionMode;
375  auto adapterPredictions = getAdapter()->getRoutePredictions();
376  if (!adapterPredictions.empty())
377  {
378  if (!mExternalRoutes)
379  {
380  // mode switch between external and internal routes
381  mRoutes.clear();
382  }
383  mExternalRoutes = true;
384  RssRouteList oldRoutes;
385  oldRoutes.swap(mRoutes);
386  for (auto &prediction : adapterPredictions)
387  {
388  mRoutes.push_back(prediction);
389  auto oldRouteIter
390  = std::find_if(oldRoutes.begin(), oldRoutes.end(), [&prediction](RssRoute const &route) -> bool {
391  return route.route_id == prediction.route_id;
392  });
393  if (oldRouteIter != oldRoutes.end())
394  {
395  // preserve vehicle dynamics if possible
396  mRoutes.back().vehicle_dynamics_on_route = oldRouteIter->vehicle_dynamics_on_route;
397  }
398  }
399  }
400  else
401  {
402  if (mExternalRoutes)
403  {
404  // mode switch between external and internal routes
405  mRoutes.clear();
406  }
407  mExternalRoutes = false;
408 
409  auto const routingTargetsToAppend = handleRoutingTargets();
410 
411  if (mRoutes.empty())
412  {
413  // try to create routes
414  ::ad::map::route::FullRouteList newRoutes = createRoutes(routePreviewDistance, mapAreaLanes);
415  for (auto &newRoute : newRoutes)
416  {
417  RssRoute rss_route;
418  rss_route.route_id = mNextRouteId++;
419  rss_route.route = newRoute;
422  rss_route.likelihood = physics::Probability(1.);
423  rss_route.parent_route_id = RssRouteId(0);
424  rss_route.progress_on_route = physics::Distance(0.);
425  getLogger()->trace("RssVehicleAdapter::updateRoutes[{}] new route {}: {} {}",
426  mRssObjectData.id,
427  rss_route.route_id,
428  rss_route.progress_on_route,
429  rss_route.route);
430  mRoutes.push_back(rss_route);
431  }
432  }
433  else
434  {
435  // adapt routes if required
436  shortenRoutes();
437  extendRoutes(routePreviewDistance, routingTargetsToAppend, mapAreaLanes);
438  }
439  getAdapter()->activeRoutingTargets(mRoutingTargets);
440  }
441 }
442 
444 {
445  physics::Probability likelihoodSum(.0);
446  for (auto &rss_route : mRoutes)
447  {
448  likelihoodSum += rss_route.likelihood;
449  }
450 
451  if (likelihoodSum != physics::Probability(0.))
452  {
453  // normalize
454  for (auto &rss_route : mRoutes)
455  {
456  rss_route.likelihood = physics::Probability(rss_route.likelihood / likelihoodSum);
457  }
458  }
459 
460  // sort
461  std::sort(mRoutes.begin(), mRoutes.end(), [](RssRoute const &left, RssRoute const &right) -> bool {
462  return left.likelihood > right.likelihood;
463  });
464 
465  if ((mRouteExtensionMode == RouteExtensionMode::eAllowOnlySingleRoute) && (mRoutes.size() > 1))
466  {
467  getLogger()->trace(
468  "RssVehicleAdapter::normalizeAndOrderRoutes[{}] allow only single route mode: drop other routes #{}",
469  mRssObjectData.id,
470  mRoutes.size() - 1);
471  mRoutes.resize(1u);
472  }
473 }
474 
475 template <class OBJECT_INSTANCE_TYPE>
477 {
478  for (auto &rss_route : mRoutes)
479  {
480  // before starting to override, store required old data
481  physics::Duration deltaTime(0.);
482  if (rss_route.vehicle_dynamics_on_route.last_update.time_since_epoch().count() != 0)
483  {
484  deltaTime = physics::Duration(
485  std::chrono::duration<double>(mRssObjectData.last_update - rss_route.vehicle_dynamics_on_route.last_update)
486  .count());
487  }
488  auto const lastRouteSpeedValid = rss_route.object_data_on_route.is_valid;
489  auto const lastRouteSpeedLat = rss_route.object_data_on_route.route_speed_lat;
490  auto const lastRouteSpeedLon = rss_route.object_data_on_route.route_speed_lon;
491 
492  // start the update
493  rss_route.object_data_on_route = calculateRssObjectDataOnRoute(rss_route.route, mRssObjectData);
494  rss_route.vehicle_dynamics_on_route.last_update = mRssObjectData.last_update;
495 
496  if ((deltaTime > physics::Duration(0.0001)) && lastRouteSpeedValid && rss_route.object_data_on_route.is_valid)
497  {
498  rss_route.vehicle_dynamics_on_route.route_accel_lat
499  = (rss_route.object_data_on_route.route_speed_lat - lastRouteSpeedLat) / deltaTime;
500  rss_route.vehicle_dynamics_on_route.avg_route_accel_lat
501  = ((rss_route.vehicle_dynamics_on_route.avg_route_accel_lat * 2.)
502  + rss_route.vehicle_dynamics_on_route.route_accel_lat)
503  / 3.;
504  rss_route.vehicle_dynamics_on_route.route_accel_lon
505  = (rss_route.object_data_on_route.route_speed_lon - lastRouteSpeedLon) / deltaTime;
506  rss_route.vehicle_dynamics_on_route.avg_route_accel_lon
507  = ((rss_route.vehicle_dynamics_on_route.avg_route_accel_lon * 2.)
508  + rss_route.vehicle_dynamics_on_route.route_accel_lon)
509  / 3.;
510 
511  if (rss_route.vehicle_dynamics_on_route.avg_route_accel_lat == physics::Acceleration(0.))
512  {
513  // prevent from underrun
514  rss_route.vehicle_dynamics_on_route.avg_route_accel_lat = physics::Acceleration(0.);
515  }
516  if (rss_route.vehicle_dynamics_on_route.avg_route_accel_lon == physics::Acceleration(0.))
517  {
518  // prevent from underrun
519  rss_route.vehicle_dynamics_on_route.avg_route_accel_lon = physics::Acceleration(0.);
520  }
521  }
522  }
523 }
524 
526 {
527  if (!mExternalRoutes)
528  {
529  physics::Angle const maxHeadingDelta(M_PI / 4.);
530  physics::Distance const maxCenterDistance(4.);
531  for (auto &rss_route : mRoutes)
532  {
533  rss_route.likelihood = physics::Probability(.05);
534  if (rss_route.object_data_on_route.is_valid)
535  {
536  // distance to nominal center
537  auto const distanceToRouteNominalCenter = ad::map::point::distance(
538  rss_route.object_data_on_route.nominal_center_position_of_lane_in_nominal_route_direction,
539  mRssObjectData.match_object.enu_position.center_point);
540  if (!rss_route.object_data_on_route.object_within_route)
541  {
542  rss_route.likelihood = physics::Probability(.01);
543  }
544  else if ((rss_route.object_data_on_route.object_center_within_route)
545  && (distanceToRouteNominalCenter < maxCenterDistance)
546  && (std::fabs(rss_route.object_data_on_route.route_heading_delta) < maxHeadingDelta))
547  {
548  auto const distanceFactor = 1. - distanceToRouteNominalCenter / maxCenterDistance;
549  auto const headingFactor
550  = 1. - std::fabs(rss_route.object_data_on_route.route_heading_delta) / maxHeadingDelta;
551  rss_route.likelihood = physics::Probability(distanceFactor * headingFactor);
552  }
553  else
554  {
555  // center not within route anymore, or heading diff larger than 45 degree
556  }
557  }
558  }
559  }
560 }
561 
562 } // namespace map
563 } // namespace rss
564 } // namespace ad
void updateVehicleDynamicsOnRoutes()
Supporting function to update the vehicle dynamics on route.
Definition: RssRouteCheckerDataDetail.hpp:476
void evaluateRoutes()
Supporting function to evaluate current route likelihood in respect to the VehicleDynamicsOnRoute.
Definition: RssRouteCheckerDataDetail.hpp:525
std::vector<::ad::map::route::FullRoute > createRoutes(::ad::physics::Distance const routePreviewDistance, ::ad::map::lane::LaneIdSet const &mapAreaLanes)
Supporting function to create new routes.
Definition: RssRouteCheckerDataDetail.hpp:291
std::vector<::ad::map::point::ENUPoint > handleRoutingTargets()
Supporting function to process routing targets.
Definition: RssRouteCheckerDataDetail.hpp:93
void extendRoutes(::ad::physics::Distance const routePreviewDistance, std::vector<::ad::map::point::ENUPoint > const &routingTargetsToAppend, ::ad::map::lane::LaneIdSet const &mapAreaLanes)
Supporting function to extend the predicted routes.
Definition: RssRouteCheckerDataDetail.hpp:181
RouteExtensionMode
enumeration defining the mode on route extension
Definition: RssRouteCheckerData.hpp:165
void updateRoutes(::ad::physics::Distance const routePreviewDistance, ::ad::map::lane::LaneIdSet const &mapAreaLanes, RouteExtensionMode routeExtensionMode=RouteExtensionMode::eAllowMultipleRoutes)
Supporting function to update the routes of this.
Definition: RssRouteCheckerDataDetail.hpp:369
~RssRouteCheckerVehicleData()
default destrutor
Definition: RssRouteCheckerDataDetail.hpp:21
void shortenRoutes()
Supporting function to shorten the predicted routes.
Definition: RssRouteCheckerDataDetail.hpp:127
void normalizeAndOrderRoutes()
Supporting function to normalize the sum of the route likelihood to 1.0 and reorder the list in desce...
Definition: RssRouteCheckerDataDetail.hpp:443
Base class to access vehicle information required to perform the RSS checks in conjunction with the R...
Definition: RssObjectAdapter.hpp:362
std::vector<::ad::rss::map::RssRoute > RssRouteList
DataType RssRouteList.
Definition: RssRouteList.hpp:42
std::shared_ptr< spdlog::logger > getLogger()
get the ad::rss::map logger
uint64_t RssRouteId
DataType RssRouteId.
Definition: RssRouteId.hpp:39
namespace ad
Definition: RouteAccelerations.hpp:33
DataType RssEgoVehicleDynamicsOnRoute.
Definition: RssEgoVehicleDynamicsOnRoute.hpp:46
DataType RssObjectDataOnRoute.
Definition: RssObjectDataOnRoute.hpp:50
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
::ad::rss::map::RssObjectDataOnRoute object_data_on_route
Definition: RssRoute.hpp:158
::ad::rss::map::RssEgoVehicleDynamicsOnRoute vehicle_dynamics_on_route
Definition: RssRoute.hpp:142
::ad::physics::Distance progress_on_route
Definition: RssRoute.hpp:153
::ad::rss::map::RssRouteId parent_route_id
Definition: RssRoute.hpp:148
::ad::physics::Probability likelihood
Definition: RssRoute.hpp:137