9 #include <ad/map/lane/Operation.hpp>
10 #include <ad/map/match/MapMatchedOperation.hpp>
11 #include <ad/map/route/Planning.hpp>
24 if (mVehicleAdapter !=
nullptr)
26 mVehicleAdapter->getCheckerControl()->dropVehicle(mRssObjectData.id);
30 enum class ReachedRoutingTargetsMode
33 eDISTANCE_AND_ORIENTATION
36 inline void dropReachedRoutingTargets(std::vector<::ad::map::point::ENUPoint> &routingTargets,
37 RssObjectData
const &rssObjectData,
38 ad::physics::Distance
const &reachedDistance,
39 ReachedRoutingTargetsMode reachedRoutingTargetsMode)
42 while (!routingTargets.empty())
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)
49 routingTargets.erase(routingTargets.begin());
51 "RssRouteCheckerVehicleData::removeReachedRoutingTargets[{}] Next target reached by distance: {}; "
52 "remaining targets: {}",
57 else if ((reachedRoutingTargetsMode == ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION)
58 && (routingTargets.size() > 1u) && (distanceToNextTarget < 10. * reachedDistance))
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)
71 routingTargets.erase(routingTargets.begin());
73 "RssRouteCheckerVehicleData::removeReachedRoutingTargets[{}] Next target reached by orientation: {}, {}; "
74 "remaining targets: {}",
92 template <
class OBJECT_INSTANCE_TYPE>
95 auto const routingTargetOperation = getAdapter()->getRoutingTargetOperation();
96 std::vector<::ad::map::point::ENUPoint> routingTargetsToAppend;
97 if (routingTargetOperation.command
101 mRoutingTargets = routingTargetOperation.routingTargets;
102 dropReachedRoutingTargets(mRoutingTargets,
104 getAdapter()->getRoutingTargetReachedDistance(),
105 ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION);
109 dropReachedRoutingTargets(mRoutingTargets,
111 getAdapter()->getRoutingTargetReachedDistance(),
112 ReachedRoutingTargetsMode::eDISTANCE_ONLY);
114 if (routingTargetOperation.command
117 routingTargetsToAppend = routingTargetOperation.routingTargets;
118 dropReachedRoutingTargets(routingTargetsToAppend,
120 getAdapter()->getRoutingTargetReachedDistance(),
121 ReachedRoutingTargetsMode::eDISTANCE_AND_ORIENTATION);
124 return routingTargetsToAppend;
129 ad::map::point::ParaPointList allLaneMatches;
130 for (
auto const &referencePoint :
131 {::ad::map::match::ObjectReferencePoints::RearRight, ::ad::map::match::ObjectReferencePoints::RearLeft})
133 for (
auto const &matchPoint :
134 mRssObjectData.match_object.map_matched_bounding_box.reference_point_positions[
size_t(referencePoint)])
138 if (ad::map::match::isLongitudinalInLaneMatch(matchPoint))
140 allLaneMatches.push_back(matchPoint.lane_point.para_point);
145 auto routeIndex = 0u;
146 while (routeIndex < mRoutes.size())
148 getLogger()->trace(
"RssVehicleAdapter::shortenRoutes[{}:{}] call shorten route with {} and {}",
150 mRoutes[routeIndex].route_id,
152 mRoutes[routeIndex].route);
153 auto shortenRouteResult = ::ad::map::route::shortenRoute(
155 mRoutes[routeIndex].route,
156 ::ad::map::route::ShortenRouteMode::DontCutIntersectionAndPrependIfSucceededBeforeRoute);
158 if ((shortenRouteResult != ::ad::map::route::ShortenRouteResult::Succeeded)
159 && (shortenRouteResult != ::ad::map::route::ShortenRouteResult::SucceededIntersectionNotCut))
161 getLogger()->trace(
"RssVehicleAdapter::shortenRoutes[{}:{}] shorten current route failed. Dropping. {}",
163 mRoutes[routeIndex].route_id,
164 mRoutes[routeIndex].route);
165 mRoutes.erase(mRoutes.begin() + routeIndex);
169 getLogger()->trace(
"RssVehicleAdapter::shortenRoutes[{}:{}] shorten current route succeeded {}",
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);
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)
187 auto routeIndex = 0u;
188 while (routeIndex < mRoutes.size())
190 std::vector<::ad::map::route::FullRoute> additionalRoutes;
192 bool routeValid =
false;
193 if (!routingTargetsToAppend.empty())
195 routeValid = ::ad::map::route::extendRouteToDestinations(mRoutes[routeIndex].route, routingTargetsToAppend);
196 mRoutingTargets.insert(mRoutingTargets.end(), routingTargetsToAppend.begin(), routingTargetsToAppend.end());
198 else if (mRoutingTargets.empty() && (mRouteExtensionMode != RouteExtensionMode::eAllowOnlyTargetRoute))
201 routeValid = ::ad::map::route::extendRouteToDistance(mRoutes[routeIndex].route,
202 mRoutes[routeIndex].progress_on_route + routePreviewDistance,
213 getLogger()->trace(
"RssVehicleAdapter::extendRoutes[{}:{}] extended current route {} {}",
215 mRoutes[routeIndex].route_id,
216 mRoutes[routeIndex].progress_on_route,
217 mRoutes[routeIndex].route);
218 if (mRouteExtensionMode == RouteExtensionMode::eAllowMultipleRoutes)
220 for (
auto &additionalRoute : additionalRoutes)
222 bool addRoute =
true;
223 for (
auto checkRouteIndex = 0u; checkRouteIndex < mRoutes.size(); checkRouteIndex++)
225 if (checkRouteIndex != routeIndex)
227 auto const compareResult = ::ad::map::route::planning::compareRoutesOnIntervalLevel(
228 additionalRoute, mRoutes[checkRouteIndex].route);
229 if (compareResult != ::ad::map::route::planning::CompareRouteResult::Differ)
231 getLogger()->trace(
"RssVehicleAdapter::extendRoutes[{}:{}] drop additional route {} because compares "
232 "{} to route_id {} {}",
234 mRoutes[routeIndex].route_id,
237 mRoutes[checkRouteIndex].route_id,
238 mRoutes[checkRouteIndex].route);
250 newRssRoute.
route_id = mNextRouteId++;
251 newRssRoute.
route = additionalRoute;
253 newRssRoute.
likelihood = mRoutes[routeIndex].likelihood;
256 getLogger()->trace(
"RssVehicleAdapter::extendRoutes[{}:{}] additional route {}: {} {}",
258 mRoutes[routeIndex].route_id,
262 routesToAdd.push_back(newRssRoute);
266 else if (additionalRoutes.size() > 0u)
269 "RssVehicleAdapter::extendRoutes[{}:{}] allow only single route mode: drop additional routes {}",
271 mRoutes[routeIndex].route_id,
272 additionalRoutes.size());
279 getLogger()->warn(
"RssVehicleAdapter::extendRoutes[{}:{}] extend current route failed, dropping {}",
281 mRoutes[routeIndex].route_id,
282 mRoutes[routeIndex].route);
283 mRoutes.erase(mRoutes.begin() + routeIndex);
286 mRoutes.insert(mRoutes.end(), routesToAdd.begin(), routesToAdd.end());
289 template <
class OBJECT_INSTANCE_TYPE>
290 std::vector<::ad::map::route::FullRoute>
292 ::ad::map::lane::LaneIdSet
const &mapAreaLanes)
294 std::vector<::ad::map::route::FullRoute> newRoutes;
295 for (
const auto &refPoint :
296 {::ad::map::match::ObjectReferencePoints::RearLeft, ::ad::map::match::ObjectReferencePoints::RearRight})
298 for (
const auto &position :
299 mRssObjectData.match_object.map_matched_bounding_box.reference_point_positions[std::size_t(int32_t(refPoint))])
303 if (!ad::map::match::isLongitudinalInLaneMatch(position))
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))
311 getLogger()->trace(
"Vehicle heading in opposite lane direction");
312 if (::ad::map::lane::projectPositionToLaneInHeadingDirection(
313 startPoint, mRssObjectData.match_object.enu_position.heading, projectedStartPoint))
315 getLogger()->trace(
"Projected to lane {}", projectedStartPoint.lane_id);
318 getLogger()->trace(
"Route startPoint: {}, projectedStartPoint: {}", startPoint, projectedStartPoint);
319 auto routingStartPoint = ::ad::map::route::planning::createRoutingPoint(
320 projectedStartPoint, mRssObjectData.match_object.enu_position.heading);
322 if (!mRoutingTargets.empty() && ad::map::point::isValid(mRoutingTargets))
324 auto newRoute = ::ad::map::route::planning::planRoute(
325 routingStartPoint, mRoutingTargets, ::ad::map::route::RouteCreationMode::AllRoutableLanes);
326 if (newRoute.route_planning_counter > 0u)
328 newRoutes.push_back(newRoute);
329 getLogger()->trace(
"Route found from startPoint: {}, projectedStartPoint: {}, routingTargets: {}, route: {}",
337 getLogger()->warn(
"No Route found from startPoint: {}, projectedStartPoint: {}, routingTargets: {}",
343 else if (mRouteExtensionMode != RouteExtensionMode::eAllowOnlyTargetRoute)
346 auto newRoutesFromCurrentStart = ::ad::map::route::planning::predictRoutesOnDistance(
348 routePreviewDistance,
349 ::ad::map::route::RouteCreationMode::AllRoutableLanes,
350 ::ad::map::route::planning::FilterDuplicatesMode::SubRoutesPreferLongerOnes,
352 newRoutes.insert(newRoutes.end(), newRoutesFromCurrentStart.begin(), newRoutesFromCurrentStart.end());
353 getLogger()->trace(
"Routes predicted from startPoint: {}, projectedStartPoint: {}, routes: {}",
356 newRoutesFromCurrentStart);
362 newRoutes = ::ad::map::route::planning::filterDuplicatedRoutes(
363 newRoutes, ::ad::map::route::planning::FilterDuplicatesMode::SubRoutesPreferLongerOnes);
368 template <
class OBJECT_INSTANCE_TYPE>
370 ::ad::physics::Distance
const routePreviewDistance,
371 ::ad::map::lane::LaneIdSet
const &mapAreaLanes,
374 mRouteExtensionMode = routeExtensionMode;
375 auto adapterPredictions = getAdapter()->getRoutePredictions();
376 if (!adapterPredictions.empty())
378 if (!mExternalRoutes)
383 mExternalRoutes =
true;
385 oldRoutes.swap(mRoutes);
386 for (
auto &prediction : adapterPredictions)
388 mRoutes.push_back(prediction);
390 = std::find_if(oldRoutes.begin(), oldRoutes.end(), [&prediction](
RssRoute const &route) ->
bool {
391 return route.route_id == prediction.route_id;
393 if (oldRouteIter != oldRoutes.end())
396 mRoutes.back().vehicle_dynamics_on_route = oldRouteIter->vehicle_dynamics_on_route;
407 mExternalRoutes =
false;
409 auto const routingTargetsToAppend = handleRoutingTargets();
414 ::ad::map::route::FullRouteList newRoutes = createRoutes(routePreviewDistance, mapAreaLanes);
415 for (
auto &newRoute : newRoutes)
418 rss_route.
route_id = mNextRouteId++;
419 rss_route.
route = newRoute;
422 rss_route.
likelihood = physics::Probability(1.);
425 getLogger()->trace(
"RssVehicleAdapter::updateRoutes[{}] new route {}: {} {}",
430 mRoutes.push_back(rss_route);
437 extendRoutes(routePreviewDistance, routingTargetsToAppend, mapAreaLanes);
439 getAdapter()->activeRoutingTargets(mRoutingTargets);
445 physics::Probability likelihoodSum(.0);
446 for (
auto &rss_route : mRoutes)
448 likelihoodSum += rss_route.likelihood;
451 if (likelihoodSum != physics::Probability(0.))
454 for (
auto &rss_route : mRoutes)
456 rss_route.likelihood = physics::Probability(rss_route.likelihood / likelihoodSum);
461 std::sort(mRoutes.begin(), mRoutes.end(), [](
RssRoute const &left,
RssRoute const &right) ->
bool {
462 return left.likelihood > right.likelihood;
465 if ((mRouteExtensionMode == RouteExtensionMode::eAllowOnlySingleRoute) && (mRoutes.size() > 1))
468 "RssVehicleAdapter::normalizeAndOrderRoutes[{}] allow only single route mode: drop other routes #{}",
475 template <
class OBJECT_INSTANCE_TYPE>
478 for (
auto &rss_route : mRoutes)
481 physics::Duration deltaTime(0.);
482 if (rss_route.vehicle_dynamics_on_route.last_update.time_since_epoch().count() != 0)
484 deltaTime = physics::Duration(
485 std::chrono::duration<double>(mRssObjectData.last_update - rss_route.vehicle_dynamics_on_route.last_update)
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;
493 rss_route.object_data_on_route = calculateRssObjectDataOnRoute(rss_route.route, mRssObjectData);
494 rss_route.vehicle_dynamics_on_route.last_update = mRssObjectData.last_update;
496 if ((deltaTime > physics::Duration(0.0001)) && lastRouteSpeedValid && rss_route.object_data_on_route.is_valid)
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)
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)
511 if (rss_route.vehicle_dynamics_on_route.avg_route_accel_lat == physics::Acceleration(0.))
514 rss_route.vehicle_dynamics_on_route.avg_route_accel_lat = physics::Acceleration(0.);
516 if (rss_route.vehicle_dynamics_on_route.avg_route_accel_lon == physics::Acceleration(0.))
519 rss_route.vehicle_dynamics_on_route.avg_route_accel_lon = physics::Acceleration(0.);
527 if (!mExternalRoutes)
529 physics::Angle
const maxHeadingDelta(M_PI / 4.);
530 physics::Distance
const maxCenterDistance(4.);
531 for (
auto &rss_route : mRoutes)
533 rss_route.likelihood = physics::Probability(.05);
534 if (rss_route.object_data_on_route.is_valid)
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)
542 rss_route.likelihood = physics::Probability(.01);
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))
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);
namespace ad
Definition: RouteAccelerations.hpp:33