11 #include <ad/rss/state/RssStateOperation.hpp>
14 #include "ad/map/intersection/CoreIntersection.hpp"
15 #include "ad/map/lane/Operation.hpp"
16 #include "ad/map/route/Operation.hpp"
19 #include "ad/rss/map/detail/ParallelChecker.hpp"
20 #include "ad/rss/map/detail/ParallelObjectUpdater.hpp"
21 #include "ad/rss/map/detail/ParallelRouteUpdater.hpp"
22 #include "ad/rss/map/detail/ParallelWorldModelCreator.hpp"
28 template <
class OBJECT_INSTANCE_TYPE>
30 ::ad::physics::Distance
const artificialObjectSamplingDistance,
33 std::lock_guard<std::shared_timed_mutex>
const lock(mCallbackRwLock);
34 mArtificialObjectSamplingDistance = artificialObjectSamplingDistance;
35 mArtificialObjectsInjectionCallback = artificialObjectsInjectionCallback;
38 template <
class OBJECT_INSTANCE_TYPE>
39 template <
class Data,
class Adapter>
41 std::chrono::system_clock::time_point
const ¤tTime,
42 std::map<::ad::rss::world::ObjectId, Data> &objectMap,
43 std::vector<typename Adapter::Ptr>
const &activeObjectAdapterList)
45 for (
auto &objectEntry : objectMap)
47 objectEntry.second.mActive =
false;
49 for (
auto &adapter : activeObjectAdapterList)
51 auto objectEntryIter = objectMap.find(adapter->getObjectId());
52 if (objectEntryIter == objectMap.end())
55 auto insertResult = objectMap.insert({adapter->getObjectId(), Data()});
56 if (!insertResult.second)
58 getLogger()->error(
"RssRouteChecker::updateObjectMap[{}] unexpected error on adding new object adapter entry",
59 adapter->getObjectId());
62 objectEntryIter = insertResult.first;
65 objectEntryIter->second.mActive =
true;
66 objectEntryIter->second.updateAdapter(adapter);
70 for (
auto objectEntryIter = objectMap.begin(); objectEntryIter != objectMap.end();)
72 if (!objectEntryIter->second.mActive)
74 auto durationSinceLastUpdate = currentTime - objectEntryIter->second.mRssObjectData.last_update;
75 if (std::chrono::duration_cast<std::chrono::seconds>(durationSinceLastUpdate).count()
76 > (
static_cast<int64_t
>(mDropOutdatedObjectsDuration.mDuration) + 1))
78 getLogger()->debug(
"RssRouteChecker::updateObjectMap[{}] Dropping outdated object adapter.",
79 objectEntryIter->first);
80 objectMap.erase(objectEntryIter++);
88 template <
class OBJECT_INSTANCE_TYPE>
void RssRouteChecker<OBJECT_INSTANCE_TYPE>::updateRssCheckers()
90 for (
auto &egoVehicleToUpdate : mEgoVehicleMap)
92 auto &egoVehicleData = egoVehicleToUpdate.second;
93 if (egoVehicleData.mActive)
96 egoVehicleData.mRssRouteCheckMap.swap(lastRouteCheckMap);
98 for (
auto &lastCheckerEntry : lastRouteCheckMap)
100 for (
auto &otherVehicle : mVehicleMap)
102 if (otherVehicle.second.mClearObjectHistory)
104 lastCheckerEntry.second->dropObjectHistory(otherVehicle.second.mRssObjectData.id);
109 for (
auto &egoRssRoute : egoVehicleData.mRoutes)
111 auto routeCheckFindResult = lastRouteCheckMap.find(egoRssRoute.route_id);
112 if (routeCheckFindResult != lastRouteCheckMap.end())
114 getLogger()->trace(
"RssRouteChecker::updateRssCheckers[{}:{}] taking over existing checker",
115 egoVehicleData.mRssObjectData.id,
116 egoRssRoute.route_id);
117 RssRouteCheckMap::value_type checkerToTakeOver = *routeCheckFindResult;
118 egoVehicleData.mRssRouteCheckMap.insert(checkerToTakeOver);
123 routeCheckFindResult = lastRouteCheckMap.find(egoRssRoute.parent_route_id);
124 if (routeCheckFindResult != lastRouteCheckMap.end())
126 getLogger()->trace(
"RssRouteChecker::updateRssCheckers[{}:{}] add copy parent checker {}",
127 egoVehicleData.mRssObjectData.id,
128 egoRssRoute.route_id,
129 egoRssRoute.parent_route_id);
132 ::ad::rss::core::RssCheck
const &parentChecker = *routeCheckFindResult->second.get();
133 ::ad::rss::core::RssCheck::Ptr parentCheckerCopy(new ::ad::rss::core::RssCheck(parentChecker));
134 auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({egoRssRoute.route_id, parentCheckerCopy});
135 if (insertResult.second)
137 updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
142 getLogger()->trace(
"RssRouteChecker::updateRssCheckers[{}:{}] no parent checker {} found; add new checker",
143 egoVehicleData.mRssObjectData.id,
144 egoRssRoute.route_id,
145 egoRssRoute.parent_route_id);
147 ::ad::rss::core::RssCheck::Ptr newChecker(new ::ad::rss::core::RssCheck());
148 auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({egoRssRoute.route_id, newChecker});
149 if (insertResult.second)
151 updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
156 if (egoVehicleData.mRssRouteCheckMap.empty())
159 if (!lastRouteCheckMap.empty())
161 getLogger()->trace(
"RssRouteChecker::updateRssCheckers[{}:0] no current route, resuse first checker {} as 0",
162 egoVehicleData.mRssObjectData.id,
163 lastRouteCheckMap.begin()->first);
167 = egoVehicleData.mRssRouteCheckMap.insert({
RssRouteId(0), lastRouteCheckMap.begin()->second});
168 if (insertResult.second)
170 updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
175 getLogger()->trace(
"RssRouteChecker::updateRssCheckers[{}:0] no current route, and no checker at all "
176 "present; add default checker",
177 egoVehicleData.mRssObjectData.id);
179 ::ad::rss::core::RssCheck::Ptr newChecker(new ::ad::rss::core::RssCheck());
180 auto insertResult = egoVehicleData.mRssRouteCheckMap.insert({
RssRouteId(0), newChecker});
181 if (insertResult.second)
183 updateRssCheckerCallbacks(egoVehicleData, insertResult.first);
191 template <
class OBJECT_INSTANCE_TYPE>
193 world::ObjectType objectType,
198 std::lock_guard<std::shared_timed_mutex>
const lock(mCallbackRwLock);
199 mCalculateTrajectorySetsCallbackMap[objectType] = calculateTrajectorySetsCallback;
201 for (
auto &egoVehicleToUpdate : mEgoVehicleMap)
203 auto &egoVehicleData = egoVehicleToUpdate.second;
204 for (
auto checkMapIter = egoVehicleData.mRssRouteCheckMap.begin();
205 checkMapIter != egoVehicleData.mRssRouteCheckMap.end();
208 updateRssCheckerCallbacksLocked(egoVehicleData, checkMapIter);
212 catch (std::exception &e)
214 getLogger()->critical(
"RssRouteChecker::registerCalculateTrajectorySetsCallback>> Exception caught'{}'", e.what());
218 getLogger()->critical(
"RssRouteChecker::registerCalculateTrajectorySetsCallback>> Exception caught");
222 template <
class OBJECT_INSTANCE_TYPE>
226 core::shared_lock_guard
const lock_shared(mCallbackRwLock);
227 updateRssCheckerCallbacksLocked(egoVehicle, routeCheckerMapIter);
230 template <
class OBJECT_INSTANCE_TYPE>
231 void RssRouteChecker<OBJECT_INSTANCE_TYPE>::updateRssCheckerCallbacksLocked(
232 RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE>
const &egoVehicle, RssRouteCheckMap::iterator routeCheckerMapIter)
234 using namespace std::placeholders;
235 for (
auto &callbackPair : mCalculateTrajectorySetsCallbackMap)
237 auto callback = std::bind(&RssRouteChecker::callCalculateTrajectorySetsCallback,
240 egoVehicle.mRssObjectData.id,
241 routeCheckerMapIter->first,
247 routeCheckerMapIter->second->registerCalculateTrajectorySetsCallback(callbackPair.first, callback);
251 template <
class OBJECT_INSTANCE_TYPE>
252 bool RssRouteChecker<OBJECT_INSTANCE_TYPE>::callCalculateTrajectorySetsCallback(
254 ::ad::rss::world::ObjectId
const &egoVehicleId,
256 ::ad::rss::core::RelativeConstellation
const &constellation,
257 ::ad::rss::world::ObjectId
const &objectId,
258 ::ad::rss::core::RelativeObjectState
const &vehicleState,
259 ::ad::geometry::Polygon &brakePolygon,
260 ::ad::geometry::Polygon &continueForwardPolygon)
262 auto findEgoVehicleDataResult = mEgoVehicleMap.find(egoVehicleId);
263 if (findEgoVehicleDataResult != mEgoVehicleMap.end())
265 auto &egoVehicleData = findEgoVehicleDataResult->second;
267 egoVehicleData, routeId, constellation, objectId, vehicleState, brakePolygon, continueForwardPolygon);
271 getLogger()->error(
"RssRouteChecker::callCalculateTrajectorySetsCallback[{}:{}] ego vehicle not found to process "
272 "callback for object type {}",
275 std::to_string(vehicleState.object_type));
280 template <
class OBJECT_INSTANCE_TYPE>
281 RssRouteCheckResult RssRouteChecker<OBJECT_INSTANCE_TYPE>::createSituationForRoute(
282 RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE>
const &ego_vehicle, RssRoute
const &rss_route)
284 RssRouteCheckResult situationCheckResult;
285 situationCheckResult.is_valid =
false;
286 situationCheckResult.rss_route = rss_route;
287 situationCheckResult.rss_situation_snapshot = ad::rss::core::RssSituationSnapshot();
288 situationCheckResult.rss_state_snapshot = ad::rss::state::RssStateSnapshot();
289 situationCheckResult.proper_response = ad::rss::state::ProperResponse();
290 situationCheckResult.result_analysis.dangerous_state =
true;
291 situationCheckResult.result_analysis.dangerous_vehicle =
true;
292 situationCheckResult.result_analysis.dangerous_opposite_state =
true;
293 situationCheckResult.result_analysis.vehicle_crossing_road_boundaries =
false;
297 ParallelWorldModelCreator<OBJECT_INSTANCE_TYPE> situationWorldModelCreator(
298 mTimeIndex, ego_vehicle, rss_route, mConnectingRoutesCache, mMapAreaLanes);
299 tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), situationWorldModelCreator);
300 tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), situationWorldModelCreator);
301 tbb::parallel_for_each(mPedestrianMap.begin(), mPedestrianMap.end(), situationWorldModelCreator);
302 tbb::parallel_for_each(mArtificialObjectMap.begin(), mArtificialObjectMap.end(), situationWorldModelCreator);
303 situationCheckResult.world_model = situationWorldModelCreator.getWorldModel();
305 situationCreated(ego_vehicle, situationCheckResult);
307 catch (std::exception &e)
309 getLogger()->critical(
"RssRouteChecker::createSituationForRoute>> Exception caught'{}' {} {}",
311 ego_vehicle.mRssObjectData.id,
313 situationCheckResult.is_valid =
false;
318 "RssRouteChecker::createSituationForRoute>> Exception caught {} {}", ego_vehicle.mRssObjectData.id, rss_route);
319 situationCheckResult.is_valid =
false;
321 return situationCheckResult;
324 template <
class OBJECT_INSTANCE_TYPE>
RssObjectResultList RssRouteChecker<OBJECT_INSTANCE_TYPE>::createSituations()
327 mConnectingRoutesCache.clear();
328 for (
auto const &ego_vehicle : mEgoVehicleMap)
330 if (ego_vehicle.second.mActive)
332 RssObjectResult checkResult;
333 checkResult.object_data = ego_vehicle.second.mRssObjectData;
335 if (ego_vehicle.second.mRoutes.empty())
338 emptyRoute.likelihood = ::ad::physics::Probability(1.);
340 emptyRoute.route = ::ad::map::route::FullRoute();
342 auto const situationCheckResult = createSituationForRoute(ego_vehicle.second, emptyRoute);
343 checkResult.situation_check_results.push_back(situationCheckResult);
347 for (
auto const &rss_route : ego_vehicle.second.mRoutes)
349 auto const situationCheckResult = createSituationForRoute(ego_vehicle.second, rss_route);
350 checkResult.situation_check_results.push_back(situationCheckResult);
354 situationsCreated(ego_vehicle.second, checkResult);
355 resultList.push_back(checkResult);
359 situationsCreated(resultList);
363 template <
class OBJECT_INSTANCE_TYPE>
364 void RssRouteChecker<OBJECT_INSTANCE_TYPE>::appendObjectsToResults(
RssObjectResultList &objectResultList)
366 for (
auto const &vehicle : mVehicleMap)
368 if (vehicle.second.mActive)
370 RssObjectResult objectResult;
371 objectResult.object_data = vehicle.second.mRssObjectData;
372 objectResultList.push_back(objectResult);
375 for (
auto const &pedestrian : mPedestrianMap)
377 if (pedestrian.second.mActive)
379 RssObjectResult objectResult;
380 objectResult.object_data = pedestrian.second.mRssObjectData;
381 objectResultList.push_back(objectResult);
384 for (
auto const &artificialObject : mArtificialObjectMap)
386 if (artificialObject.second.mActive)
388 RssObjectResult objectResult;
389 objectResult.object_data = artificialObject.second.mRssObjectData;
390 objectResultList.push_back(objectResult);
395 template <
class OBJECT_INSTANCE_TYPE>
397 std::chrono::system_clock::time_point
const ¤tTime,
398 ::ad::physics::Distance
const vehicleSamplingDistance,
401 ::ad::physics::Distance
const pedestrianSamplingDistance,
411 currentTime, mEgoVehicleMap, egoVehicles);
413 currentTime, mVehicleMap, vehicles);
415 currentTime, mPedestrianMap, pedestrians);
419 vehicleSamplingDistance,
420 pedestrianSamplingDistance,
421 mArtificialObjectSamplingDistance,
423 tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), objectUpdater);
424 objectDataUpdated(mEgoVehicleMap);
425 tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), objectUpdater);
426 objectDataUpdated(mVehicleMap);
427 tbb::parallel_for_each(mPedestrianMap.begin(), mPedestrianMap.end(), objectUpdater);
428 objectDataUpdated(mPedestrianMap);
432 objectUpdater.getMinRoutePreviewDistance(), mMapAreaLanes, routeExtensionMode);
433 tbb::parallel_for_each(mEgoVehicleMap.begin(), mEgoVehicleMap.end(), routeUpdater);
434 routesUpdated(mEgoVehicleMap);
435 tbb::parallel_for_each(mVehicleMap.begin(), mVehicleMap.end(), routeUpdater);
436 routesUpdated(mVehicleMap);
441 core::shared_lock_guard
const lock_shared(mCallbackRwLock);
442 if (mArtificialObjectsInjectionCallback !=
nullptr)
444 artificialObjects = mArtificialObjectsInjectionCallback(mEgoVehicleMap, mVehicleMap, mPedestrianMap);
447 updateObjectMap<RssRouteCheckerArtificialObjectData<OBJECT_INSTANCE_TYPE>,
449 currentTime, mArtificialObjectMap, artificialObjects);
450 tbb::parallel_for_each(mArtificialObjectMap.begin(), mArtificialObjectMap.end(), objectUpdater);
451 objectDataUpdated(mArtificialObjectMap);
455 rssObjectResultList = createSituations();
458 tbb::parallel_for_each(rssObjectResultList.begin(), rssObjectResultList.end(), parallelChecker);
459 checksPerformed(rssObjectResultList);
461 appendObjectsToResults(rssObjectResultList);
463 catch (std::exception &e)
465 getLogger()->critical(
"RssRouteChecker::checkObjects>> Exception caught'{}'", e.what());
466 rssObjectResultList.clear();
470 getLogger()->critical(
"RssRouteChecker::checkObjects>> Exception caught");
471 rssObjectResultList.clear();
474 return rssObjectResultList;
477 template <
class OBJECT_INSTANCE_TYPE>
479 ::ad::map::lane::LaneIdSet
const &lanesToConsider)
481 mMapAreaLanes = lanesToConsider;
482 getLogger()->debug(
"RssRouteChecker::restrictOperationToMapArea>> {}", mMapAreaLanes);
485 template <
class OBJECT_INSTANCE_TYPE>
487 ::ad::map::point::BoundingSphere
const &bounding_sphere)
489 mMapAreaLanes = ad::map::lane::getLanesOfMapArea(bounding_sphere);
490 getLogger()->debug(
"RssRouteChecker::restrictOperationToMapArea({})>> {}", bounding_sphere, mMapAreaLanes);
491 return !mMapAreaLanes.empty();
494 template <
class OBJECT_INSTANCE_TYPE>
496 std::vector<::ad::map::lane::MapAreaPredictionStartPoint>
const &predictionStartPoints)
498 mMapAreaLanes = ad::map::lane::getLanesOfMapArea(predictionStartPoints);
499 getLogger()->debug(
"RssRouteChecker::restrictOperationToMapArea(PredictionStartPoints)>> results in {}",
501 return !mMapAreaLanes.empty();
504 template <
class OBJECT_INSTANCE_TYPE>
506 ::ad::map::point::ENUPoint
const &intersectionPoint, ::ad::physics::Distance
const &intersectionDistance)
508 mMapAreaLanes = ad::map::lane::getLanesOfMapArea(intersectionPoint, intersectionDistance);
509 getLogger()->debug(
"RssRouteChecker::restrictOperationToIntersectionArea({}@{})>> {}",
511 intersectionDistance,
513 return !mMapAreaLanes.empty();
518 mMapAreaLanes.clear();
519 getLogger()->debug(
"RssRouteChecker::clearOperationToMapAreaRestriction>> {}", mMapAreaLanes);
namespace ad
Definition: RouteAccelerations.hpp:33