LCOV - code coverage report
Current view: top level - include/ad/rss/map/detail - ParallelWorldModelCreator.hpp (source / functions) Hit Total Coverage
Test: ad_rss_map_integration Lines: 64 90 71.1 %
Date: 2025-07-22 06:56:19 Functions: 6 7 85.7 %
Branches: 27 80 33.8 %

           Branch data     Line data    Source code
       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"
      10                 :            : #include "ad/rss/map/RssRouteCheckerData.hpp"
      11                 :            : #include "ad/rss/map/RssWorldModelCreator.hpp"
      12                 :            : 
      13                 :            : namespace ad {
      14                 :            : namespace rss {
      15                 :            : namespace map {
      16                 :            : 
      17                 :            : template <class OBJECT_INSTANCE_TYPE> class ParallelWorldModelCreator
      18                 :            : {
      19                 :            : public:
      20                 :         28 :   ParallelWorldModelCreator(::ad::rss::world::TimeIndex const time_index,
      21                 :            :                             RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &egoVehicleData,
      22                 :            :                             RssRoute const &rss_route,
      23                 :            :                             ConnectingRoutesCache &connecting_routes_cache,
      24                 :            :                             ::ad::map::lane::LaneIdSet const &mapAreaLanes)
      25                 :         28 :     : mEgoVehicleData(egoVehicleData)
      26                 :         28 :     , mRssRoute(rss_route)
      27                 :         28 :     , mWorldModelCreation(time_index, mEgoVehicleData.mRssObjectData.rss_dynamics, connecting_routes_cache)
      28                 :         28 :     , mMapAreaLanes(mapAreaLanes)
      29                 :            :   {
      30                 :         28 :     mWorldModelCreation.setRouteId(mRssRoute.route_id);
      31                 :         28 :     auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
      32         [ -  + ]:         28 :     if (!bool(egoVehicleAdapter))
      33                 :            :     {
      34         [ #  # ]:          0 :       throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
      35                 :            :     }
      36                 :         28 :     mWorldModelCreation.setMinimumDistanceToObjectsThatHaveToBeAnalyzed(
      37         [ +  - ]:         28 :       egoVehicleAdapter->getMinimumDistanceToObjectsThatHaveToBeAnalyzed());
      38                 :            : 
      39         [ +  - ]:         28 :     mGreenTrafficLightsOnRoute = egoVehicleAdapter->getGreenTrafficLightsOnRoute(mRssRoute.route);
      40         [ +  - ]:         28 :     auto const roadBoundariesMode = egoVehicleAdapter->getRoadBoundariesMode(mRssRoute.route);
      41         [ +  - ]:         28 :     ::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                 :         28 :     egoObjectData.rss_dynamics.alpha_lat.accel_max = ::ad::physics::Acceleration(0.);
      45                 :         28 :     egoObjectData.rss_dynamics.lateral_fluctuation_margin = ::ad::physics::Distance(0.);
      46         [ +  - ]:         28 :     mWorldModelCreation.appendRoadBoundaries(egoObjectData, mRssRoute.route, roadBoundariesMode);
      47                 :         28 :   }
      48                 :            : 
      49                 :            :   ParallelWorldModelCreator(ParallelWorldModelCreator const &other) = delete;
      50                 :            :   ParallelWorldModelCreator &operator=(ParallelWorldModelCreator const &other) = delete;
      51                 :            : 
      52                 :            :   void
      53                 :          0 :   operator()(typename RssRouteCheckerPedestrianDataMap<OBJECT_INSTANCE_TYPE>::value_type &pedestrianToProcess) const
      54                 :            :   {
      55         [ #  # ]:          0 :     if (pedestrianToProcess.second.mActive)
      56                 :            :     {
      57                 :          0 :       auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
      58         [ #  # ]:          0 :       if (!bool(egoVehicleAdapter))
      59                 :            :       {
      60         [ #  # ]:          0 :         throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
      61                 :            :       }
      62                 :          0 :       auto pedestrianAdapter = pedestrianToProcess.second.getAdapter();
      63         [ #  # ]:          0 :       if (!bool(pedestrianAdapter))
      64                 :            :       {
      65         [ #  # ]:          0 :         throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> pedestrian adapter invalid");
      66                 :            :       }
      67         [ #  # ]:          0 :       ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
      68         [ #  # ]:          0 :       ::ad::rss::map::RssObjectData pedestrianData = pedestrianToProcess.second.mRssObjectData;
      69         [ #  # ]:          0 :       auto rssConstellationResult = egoVehicleAdapter->getPedestrianConstellationOnRoute(
      70                 :            :         mRssRoute, egoObjectData, pedestrianAdapter, pedestrianData);
      71                 :          0 :       egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
      72                 :          0 :       pedestrianData.rss_dynamics = rssConstellationResult.object_dynamics;
      73                 :            : 
      74                 :          0 :       mWorldModelCreation.appendConstellations(egoObjectData,
      75                 :          0 :                                                mRssRoute.route,
      76                 :            :                                                pedestrianData,
      77                 :            :                                                rssConstellationResult.restrict_speed_limit_mode,
      78         [ #  # ]:          0 :                                                mGreenTrafficLightsOnRoute,
      79                 :            :                                                rssConstellationResult.constellation_creation_mode,
      80                 :            :                                                mMapAreaLanes);
      81                 :          0 :     }
      82                 :          0 :   }
      83                 :            : 
      84                 :          4 :   void operator()(
      85                 :            :     typename RssRouteCheckerArtificialObjectDataMap<OBJECT_INSTANCE_TYPE>::value_type &artificialObjectToProcess) const
      86                 :            :   {
      87         [ +  - ]:          4 :     if (artificialObjectToProcess.second.mActive)
      88                 :            :     {
      89                 :          4 :       auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
      90         [ -  + ]:          4 :       if (!bool(egoVehicleAdapter))
      91                 :            :       {
      92         [ #  # ]:          0 :         throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
      93                 :            :       }
      94                 :          4 :       auto artificialObjectAdapter = artificialObjectToProcess.second.getAdapter();
      95         [ -  + ]:          4 :       if (!bool(artificialObjectAdapter))
      96                 :            :       {
      97         [ #  # ]:          0 :         throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> artificialObject adapter invalid");
      98                 :            :       }
      99         [ +  - ]:          4 :       ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
     100         [ +  - ]:          4 :       ::ad::rss::map::RssObjectData artificialObjectData = artificialObjectToProcess.second.mRssObjectData;
     101         [ +  - ]:          4 :       auto rssConstellationResult = egoVehicleAdapter->getArtificialObjectConstellationOnRoute(
     102                 :            :         mRssRoute, egoObjectData, artificialObjectAdapter, artificialObjectData);
     103                 :          4 :       egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
     104                 :          4 :       artificialObjectData.rss_dynamics = rssConstellationResult.object_dynamics;
     105                 :            : 
     106                 :          4 :       mWorldModelCreation.appendConstellations(egoObjectData,
     107                 :          4 :                                                mRssRoute.route,
     108                 :            :                                                artificialObjectData,
     109                 :            :                                                rssConstellationResult.restrict_speed_limit_mode,
     110         [ +  - ]:          4 :                                                mGreenTrafficLightsOnRoute,
     111                 :            :                                                rssConstellationResult.constellation_creation_mode,
     112                 :            :                                                mMapAreaLanes);
     113                 :          4 :     }
     114                 :          4 :   }
     115                 :            : 
     116                 :         24 :   void operator()(typename RssRouteCheckerVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &vehicleToProcess) const
     117                 :            :   {
     118         [ +  - ]:         24 :     if (vehicleToProcess.second.mActive)
     119                 :            :     {
     120                 :         24 :       process(vehicleToProcess.second);
     121                 :            :     }
     122                 :         24 :   }
     123                 :            : 
     124                 :         48 :   void operator()(typename RssRouteCheckerEgoVehicleDataMap<OBJECT_INSTANCE_TYPE>::value_type &vehicleToProcess) const
     125                 :            :   {
     126         [ +  - ]:         48 :     if ((vehicleToProcess.second.mActive)
     127         [ +  + ]:         48 :         && (vehicleToProcess.second.mRssObjectData.id != mEgoVehicleData.mRssObjectData.id))
     128                 :            :     {
     129                 :         20 :       process(vehicleToProcess.second);
     130                 :            :     }
     131                 :         48 :   }
     132                 :            : 
     133                 :         44 :   void process(RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE> const &vehicleToProcess) const
     134                 :            :   {
     135                 :         44 :     auto egoVehicleAdapter = mEgoVehicleData.getAdapter();
     136         [ -  + ]:         44 :     if (!bool(egoVehicleAdapter))
     137                 :            :     {
     138         [ #  # ]:          0 :       throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> ego_vehicle adapter invalid");
     139                 :            :     }
     140                 :         44 :     auto vehicleAdapter = vehicleToProcess.getAdapter();
     141         [ -  + ]:         44 :     if (!bool(vehicleAdapter))
     142                 :            :     {
     143         [ #  # ]:          0 :       throw std::runtime_error("RssRouteChecker::ParallelWorldModelCreator>> vehicle adapter invalid");
     144                 :            :     }
     145         [ +  - ]:         44 :     ::ad::rss::map::RssObjectData egoObjectData = mEgoVehicleData.mRssObjectData;
     146         [ +  - ]:         44 :     ::ad::rss::map::RssObjectData vehicleData = vehicleToProcess.mRssObjectData;
     147         [ +  + ]:         44 :     if (vehicleData.type == ::ad::rss::world::ObjectType::EgoVehicle)
     148                 :            :     {
     149                 :         20 :       vehicleData.type = ::ad::rss::world::ObjectType::OtherVehicle;
     150                 :            :     }
     151                 :            :     auto rssConstellationResult
     152         [ +  - ]:         44 :       = egoVehicleAdapter->getVehicleConstellationOnRoute(mRssRoute, egoObjectData, vehicleAdapter, vehicleData);
     153                 :         44 :     egoObjectData.rss_dynamics = rssConstellationResult.ego_vehicle_dynamics;
     154                 :         44 :     vehicleData.rss_dynamics = rssConstellationResult.object_dynamics;
     155                 :            : 
     156         [ +  - ]:         44 :     if ((mEgoVehicleData.mRouteExtensionMode
     157                 :            :          == RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE>::RouteExtensionMode::eAllowMultipleRoutes)
     158         [ +  - ]:         44 :         && (vehicleToProcess.mRouteExtensionMode
     159                 :            :             == RssRouteCheckerVehicleData<OBJECT_INSTANCE_TYPE>::RouteExtensionMode::eAllowMultipleRoutes))
     160                 :            :     {
     161                 :            :       // only can deploy the routes if all routes have been considered
     162                 :         44 :       mWorldModelCreation.appendConstellations(egoObjectData,
     163                 :         44 :                                                mRssRoute.route,
     164                 :            :                                                vehicleData,
     165                 :            :                                                rssConstellationResult.restrict_speed_limit_mode,
     166                 :         44 :                                                mGreenTrafficLightsOnRoute,
     167                 :            :                                                rssConstellationResult.constellation_creation_mode,
     168                 :         44 :                                                mEgoVehicleData.mRoutes,
     169         [ +  - ]:         44 :                                                vehicleToProcess.mRoutes,
     170                 :            :                                                mMapAreaLanes);
     171                 :            :     }
     172                 :            :     else
     173                 :            :     {
     174                 :          0 :       mWorldModelCreation.appendConstellations(egoObjectData,
     175                 :          0 :                                                mRssRoute.route,
     176                 :            :                                                vehicleData,
     177                 :            :                                                rssConstellationResult.restrict_speed_limit_mode,
     178         [ #  # ]:          0 :                                                mGreenTrafficLightsOnRoute,
     179                 :            :                                                rssConstellationResult.constellation_creation_mode,
     180                 :            :                                                mMapAreaLanes);
     181                 :            :     }
     182                 :         44 :   }
     183                 :            : 
     184                 :         28 :   ::ad::rss::world::WorldModel getWorldModel()
     185                 :            :   {
     186                 :         28 :     return mWorldModelCreation.getWorldModel();
     187                 :            :   }
     188                 :            : 
     189                 :            : private:
     190                 :            :   RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &mEgoVehicleData;
     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

Generated by: LCOV version 1.14