LCOV - code coverage report
Current view: top level - include/ad/rss/map/detail - ParallelChecker.hpp (source / functions) Hit Total Coverage
Test: ad_rss_map_integration Lines: 67 116 57.8 %
Date: 2025-07-22 06:56:19 Functions: 4 4 100.0 %
Branches: 48 138 34.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 ParallelChecker
      18                 :            : {
      19                 :            : public:
      20                 :         11 :   ParallelChecker(RssRouteCheckerEgoVehicleDataMap<OBJECT_INSTANCE_TYPE> const &egoVehicleMap)
      21                 :         11 :     : mEgoVehicleMap(egoVehicleMap)
      22                 :            :   {
      23                 :         11 :   }
      24                 :            : 
      25                 :            :   ParallelChecker(ParallelChecker const &other) = delete;
      26                 :            :   ParallelChecker &operator=(ParallelChecker const &other) = delete;
      27                 :            : 
      28                 :         28 :   void analyseResultOfRoute(RssRouteCheckerEgoVehicleData<OBJECT_INSTANCE_TYPE> const &ego_vehicle,
      29                 :            :                             RssRouteCheckResult &situationCheckResult) const
      30                 :            :   {
      31         [ +  - ]:         28 :     if (situationCheckResult.is_valid)
      32                 :            :     {
      33                 :         28 :       situationCheckResult.result_analysis.dangerous_state = false;
      34                 :         28 :       situationCheckResult.result_analysis.dangerous_vehicle = false;
      35                 :         28 :       situationCheckResult.result_analysis.dangerous_opposite_state = false;
      36                 :         28 :       situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = false;
      37                 :         28 :       bool leftBorderIsDangerous = false;
      38                 :         28 :       bool rightBorderIsDangerous = false;
      39                 :         28 :       bool vehicleTriggeredLeftResponse = false;
      40                 :         28 :       bool vehicleTriggeredRightResponse = false;
      41                 :         28 :       bool vehicleTriggeredLongitudinalResponse = false;
      42         [ +  + ]:         75 :       for (auto const &state : situationCheckResult.rss_state_snapshot.individual_responses)
      43                 :            :       {
      44         [ +  + ]:         47 :         if (::ad::rss::state::isDangerous(state))
      45                 :            :         {
      46                 :         13 :           situationCheckResult.result_analysis.dangerous_state = true;
      47                 :            :           auto dangerousSitationIter
      48         [ +  - ]:         13 :             = std::find_if(situationCheckResult.rss_situation_snapshot.constellations.begin(),
      49                 :            :                            situationCheckResult.rss_situation_snapshot.constellations.end(),
      50                 :         15 :                            [&state](::ad::rss::core::RelativeConstellation const &constellation) {
      51                 :         15 :                              return constellation.constellation_id == state.constellation_id;
      52                 :            :                            });
      53         [ +  - ]:         13 :           if (dangerousSitationIter != situationCheckResult.rss_situation_snapshot.constellations.end())
      54                 :            :           {
      55         [ -  + ]:         13 :             if (dangerousSitationIter->object_id == ::ad::rss::structured::getRightBorderObjectId())
      56                 :            :             {
      57                 :          0 :               rightBorderIsDangerous = true;
      58   [ #  #  #  # ]:          0 :               if (state.lateral_state_right.rss_state_information.current_distance == ::ad::physics::Distance(0.))
      59                 :            :               {
      60   [ #  #  #  # ]:          0 :                 getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] right border is crossed",
      61                 :          0 :                                    ego_vehicle.mRssObjectData.id,
      62         [ #  # ]:          0 :                                    situationCheckResult.rss_route.route_id);
      63                 :          0 :                 situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
      64                 :            :               }
      65                 :            :             }
      66         [ -  + ]:         13 :             else if (dangerousSitationIter->object_id == ::ad::rss::structured::getLeftBorderObjectId())
      67                 :            :             {
      68                 :          0 :               leftBorderIsDangerous = true;
      69   [ #  #  #  # ]:          0 :               if (state.lateral_state_left.rss_state_information.current_distance == ::ad::physics::Distance(0.))
      70                 :            :               {
      71   [ #  #  #  # ]:          0 :                 getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] left border is crossed",
      72                 :          0 :                                    ego_vehicle.mRssObjectData.id,
      73         [ #  # ]:          0 :                                    situationCheckResult.rss_route.route_id);
      74                 :          0 :                 situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
      75                 :            :               }
      76                 :            :             }
      77                 :            :             else
      78                 :            :             {
      79                 :         13 :               situationCheckResult.result_analysis.dangerous_vehicle = true;
      80         [ +  + ]:         13 :               if (state.longitudinal_state.response != ::ad::rss::state::LongitudinalResponse::None)
      81                 :            :               {
      82                 :          9 :                 vehicleTriggeredLongitudinalResponse = true;
      83                 :            :               }
      84         [ +  + ]:         13 :               if (state.lateral_state_left.response != ::ad::rss::state::LateralResponse::None)
      85                 :            :               {
      86                 :          2 :                 vehicleTriggeredLeftResponse = true;
      87                 :            :               }
      88         [ +  + ]:         13 :               if (state.lateral_state_right.response != ::ad::rss::state::LateralResponse::None)
      89                 :            :               {
      90                 :          2 :                 vehicleTriggeredRightResponse = true;
      91                 :            :               }
      92                 :            :             }
      93         [ -  + ]:         13 :             if (dangerousSitationIter->constellation_type == ::ad::rss::world::ConstellationType::OppositeDirection)
      94                 :            :             {
      95                 :          0 :               situationCheckResult.result_analysis.dangerous_opposite_state = true;
      96                 :            :             }
      97                 :            :           }
      98                 :            :         }
      99                 :            :       }
     100                 :            : 
     101                 :            :       // border are restricting potentially too much, fix this
     102         [ +  + ]:         27 :       if (!vehicleTriggeredLongitudinalResponse
     103         [ -  + ]:         18 :           && (situationCheckResult.proper_response.longitudinal_response
     104                 :            :               != ::ad::rss::state::LongitudinalResponse::None))
     105                 :            :       {
     106         [ #  # ]:          0 :         getLogger()->debug(
     107                 :            :           "RssRouteChecker::analyseResultOfRoute[{}:{}] longitudinal_response only triggered by borders: ignore",
     108                 :          0 :           ego_vehicle.mRssObjectData.id,
     109         [ #  # ]:          0 :           situationCheckResult.rss_route.route_id);
     110                 :          0 :         situationCheckResult.proper_response.longitudinal_response = ::ad::rss::state::LongitudinalResponse::None;
     111                 :          0 :         situationCheckResult.proper_response.acceleration_restrictions.longitudinal_range.maximum
     112                 :            :           = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lon.accel_max;
     113                 :            :       }
     114   [ +  +  +  - ]:         27 :       if (!vehicleTriggeredLeftResponse && !leftBorderIsDangerous
     115         [ -  + ]:         25 :           && (situationCheckResult.proper_response.lateral_response_left != ::ad::rss::state::LateralResponse::None))
     116                 :            :       {
     117         [ #  # ]:          0 :         getLogger()->debug(
     118                 :            :           "RssRouteChecker::analyseResultOfRoute[{}:{}] lateral_response_left only triggered by right border: ignore",
     119                 :          0 :           ego_vehicle.mRssObjectData.id,
     120         [ #  # ]:          0 :           situationCheckResult.rss_route.route_id);
     121                 :          0 :         situationCheckResult.proper_response.lateral_response_left = ::ad::rss::state::LateralResponse::None;
     122                 :          0 :         situationCheckResult.proper_response.acceleration_restrictions.lateral_left_range.maximum
     123                 :            :           = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lat.accel_max;
     124                 :          0 :         situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
     125                 :            :       }
     126   [ +  +  +  - ]:         27 :       if (!vehicleTriggeredRightResponse && !rightBorderIsDangerous
     127         [ -  + ]:         25 :           && (situationCheckResult.proper_response.lateral_response_right != ::ad::rss::state::LateralResponse::None))
     128                 :            :       {
     129         [ #  # ]:          0 :         getLogger()->debug(
     130                 :            :           "RssRouteChecker::analyseResultOfRoute[{}:{}] lateral_response_right only triggered by left border: ignore",
     131                 :          0 :           ego_vehicle.mRssObjectData.id,
     132         [ #  # ]:          0 :           situationCheckResult.rss_route.route_id);
     133                 :          0 :         situationCheckResult.proper_response.lateral_response_right = ::ad::rss::state::LateralResponse::None;
     134                 :          0 :         situationCheckResult.proper_response.acceleration_restrictions.lateral_right_range.maximum
     135                 :            :           = ego_vehicle.mRssObjectData.rss_dynamics.alpha_lat.accel_max;
     136                 :          0 :         situationCheckResult.result_analysis.vehicle_crossing_road_boundaries = true;
     137                 :            :       }
     138                 :            : 
     139         [ +  + ]:         27 :       if (!situationCheckResult.proper_response.is_safe)
     140                 :            :       {
     141         [ +  - ]:         26 :         getLogger()->debug("RssRouteChecker::analyseResultOfRoute[{}:{}] Unsafe route: {}\n {}",
     142                 :         13 :                            ego_vehicle.mRssObjectData.id,
     143                 :         13 :                            situationCheckResult.rss_route.route_id,
     144         [ +  - ]:         13 :                            situationCheckResult.proper_response,
     145                 :            :                            situationCheckResult);
     146                 :            :       }
     147                 :            :       else
     148                 :            :       {
     149         [ +  - ]:         29 :         getLogger()->trace("RssRouteChecker::analyseResults[{}:{}] RouteResponse: {}\n {}",
     150                 :         15 :                            ego_vehicle.mRssObjectData.id,
     151                 :         15 :                            situationCheckResult.rss_route.route_id,
     152         [ +  - ]:         15 :                            situationCheckResult.proper_response,
     153                 :            :                            situationCheckResult);
     154                 :            :       }
     155                 :            :     }
     156                 :         28 :   }
     157                 :            : 
     158                 :         17 :   void operator()(RssObjectResult &objectResult) const
     159                 :            :   {
     160         [ +  - ]:         17 :     auto egoVehicleFindResult = mEgoVehicleMap.find(objectResult.object_data.id);
     161         [ -  + ]:         17 :     if (egoVehicleFindResult == mEgoVehicleMap.end())
     162                 :            :     {
     163   [ #  #  #  # ]:          0 :       getLogger()->error("RssRouteChecker::ParallelChecker[{}] unexpectedly did not find checker for object",
     164         [ #  # ]:          0 :                          objectResult.object_data.id);
     165                 :          0 :       return;
     166                 :            :     }
     167                 :         17 :     auto &egoVehicleData = egoVehicleFindResult->second;
     168                 :            : 
     169         [ +  + ]:         44 :     for (auto &situationCheckResult : objectResult.situation_check_results)
     170                 :            :     {
     171         [ +  - ]:         28 :       auto rssCheckFindResult = egoVehicleData.mRssRouteCheckMap.find(situationCheckResult.rss_route.route_id);
     172         [ -  + ]:         28 :       if (rssCheckFindResult == egoVehicleData.mRssRouteCheckMap.end())
     173                 :            :       {
     174   [ #  #  #  # ]:          0 :         getLogger()->error("RssRouteChecker::ParallelChecker[{}:{}] unexpectedly did not find checker for route",
     175                 :          0 :                            objectResult.object_data.id,
     176         [ #  # ]:          0 :                            situationCheckResult.rss_route.route_id);
     177                 :          0 :         continue;
     178                 :            :       }
     179                 :         28 :       auto &rssCheck = rssCheckFindResult->second;
     180                 :            : 
     181                 :         28 :       situationCheckResult.is_valid = rssCheck->mSituationExtraction.extractSituation(
     182         [ +  - ]:         28 :         situationCheckResult.world_model, situationCheckResult.rss_situation_snapshot);
     183         [ -  + ]:         28 :       if (!situationCheckResult.is_valid)
     184                 :            :       {
     185   [ #  #  #  # ]:          0 :         getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] extractSituation failed {}!",
     186                 :          0 :                           objectResult.object_data.id,
     187                 :          0 :                           situationCheckResult.rss_route.route_id,
     188         [ #  # ]:          0 :                           situationCheckResult.world_model);
     189                 :            :       }
     190                 :            : 
     191         [ +  - ]:         28 :       if (situationCheckResult.is_valid)
     192                 :            :       {
     193                 :         28 :         situationCheckResult.is_valid = rssCheck->mSituationChecking.checkSituation(
     194         [ +  - ]:         28 :           situationCheckResult.rss_situation_snapshot, situationCheckResult.rss_state_snapshot);
     195         [ -  + ]:         28 :         if (!situationCheckResult.is_valid)
     196                 :            :         {
     197   [ #  #  #  # ]:          0 :           getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] checkSituation failed {}!",
     198                 :          0 :                             objectResult.object_data.id,
     199                 :          0 :                             situationCheckResult.rss_route.route_id,
     200         [ #  # ]:          0 :                             situationCheckResult.rss_situation_snapshot);
     201                 :            :         }
     202                 :            :       }
     203                 :            : 
     204         [ +  - ]:         28 :       if (situationCheckResult.is_valid)
     205                 :            :       {
     206                 :         28 :         situationCheckResult.is_valid = rssCheck->mResponseResolving.provideProperResponse(
     207         [ +  - ]:         28 :           situationCheckResult.rss_state_snapshot, situationCheckResult.proper_response);
     208         [ -  + ]:         28 :         if (!situationCheckResult.is_valid)
     209                 :            :         {
     210   [ #  #  #  # ]:          0 :           getLogger()->warn("RssRouteChecker::ParallelChecker[{}:{}] provideProperResponse failed {}!",
     211                 :          0 :                             objectResult.object_data.id,
     212                 :          0 :                             situationCheckResult.rss_route.route_id,
     213         [ #  # ]:          0 :                             situationCheckResult.rss_state_snapshot);
     214                 :            :         }
     215                 :            :       }
     216                 :            : 
     217         [ +  - ]:         28 :       analyseResultOfRoute(egoVehicleData, situationCheckResult);
     218                 :            :     }
     219                 :            :   }
     220                 :            : 
     221                 :            : private:
     222                 :            :   RssRouteCheckerEgoVehicleDataMap<OBJECT_INSTANCE_TYPE> const &mEgoVehicleMap;
     223                 :            : };
     224                 :            : 
     225                 :            : } // namespace map
     226                 :            : } // namespace rss
     227                 :            : } // namespace ad

Generated by: LCOV version 1.14