LCOV - code coverage report
Current view: top level - src/libsumo - Helper.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 5 5 100.0 %
Date: 2024-04-27 15:34:54 Functions: 0 0 -

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2012-2024 German Aerospace Center (DLR) and others.
       4             : // This program and the accompanying materials are made available under the
       5             : // terms of the Eclipse Public License 2.0 which is available at
       6             : // https://www.eclipse.org/legal/epl-2.0/
       7             : // This Source Code may also be made available under the following Secondary
       8             : // Licenses when the conditions for such availability set forth in the Eclipse
       9             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10             : // or later which is available at
      11             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13             : /****************************************************************************/
      14             : /// @file    Helper.h
      15             : /// @author  Robert Hilbrich
      16             : /// @author  Leonhard Luecken
      17             : /// @date    15.09.2017
      18             : ///
      19             : // C++ TraCI client API implementation
      20             : /****************************************************************************/
      21             : #pragma once
      22             : #include <vector>
      23             : #include <memory>
      24             : #include <libsumo/Subscription.h>
      25             : #include <microsim/MSLane.h>
      26             : #include <microsim/MSNet.h>
      27             : #include <microsim/traffic_lights/MSTLLogicControl.h>
      28             : #include <microsim/trigger/MSCalibrator.h>
      29             : #include <utils/vehicle/SUMOVehicleParameter.h>
      30             : 
      31             : 
      32             : // ===========================================================================
      33             : // class declarations
      34             : // ===========================================================================
      35             : class Position;
      36             : class PositionVector;
      37             : class RGBColor;
      38             : class MSEdge;
      39             : class SUMOTrafficObject;
      40             : class MSPerson;
      41             : class MSVehicle;
      42             : class MSBaseVehicle;
      43             : class MSVehicleType;
      44             : class MSStoppingPlace;
      45             : 
      46             : 
      47             : // ===========================================================================
      48             : // class definitions
      49             : // ===========================================================================
      50             : namespace libsumo {
      51             : 
      52             : /**
      53             : * @class Helper
      54             : * @brief C++ TraCI client API implementation
      55             : */
      56             : class Helper {
      57             : public:
      58             :     static void subscribe(const int commandId, const std::string& id, const std::vector<int>& variables,
      59             :                           const double beginTime, const double endTime, const libsumo::TraCIResults& params,
      60             :                           const int contextDomain = 0, const double range = 0.);
      61             : 
      62             :     static void handleSubscriptions(const SUMOTime t);
      63             : 
      64             :     static bool needNewSubscription(libsumo::Subscription& s, std::vector<Subscription>& subscriptions, libsumo::Subscription*& modifiedSubscription);
      65             : 
      66             :     static void clearSubscriptions();
      67             : 
      68             :     static Subscription* addSubscriptionFilter(SubscriptionFilterType filter);
      69             : 
      70             :     /// @brief helper functions
      71             :     static TraCIPositionVector makeTraCIPositionVector(const PositionVector& positionVector);
      72             :     static TraCIPosition makeTraCIPosition(const Position& position, const bool includeZ = false);
      73             :     static Position makePosition(const TraCIPosition& position);
      74             : 
      75             :     static PositionVector makePositionVector(const TraCIPositionVector& vector);
      76             :     static TraCIColor makeTraCIColor(const RGBColor& color);
      77             :     static RGBColor makeRGBColor(const TraCIColor& color);
      78             : 
      79             :     static MSEdge* getEdge(const std::string& edgeID);
      80             :     static const MSLane* getLaneChecking(const std::string& edgeID, int laneIndex, double pos);
      81             :     static std::pair<MSLane*, double> convertCartesianToRoadMap(const Position& pos, const SUMOVehicleClass vClass);
      82             :     static double getDrivingDistance(std::pair<const MSLane*, double>& roadPos1, std::pair<const MSLane*, double>& roadPos2);
      83             : 
      84             :     static MSBaseVehicle* getVehicle(const std::string& id);
      85             :     static MSPerson* getPerson(const std::string& id);
      86             :     static SUMOTrafficObject* getTrafficObject(int domain, const std::string& id);
      87             :     static const MSVehicleType& getVehicleType(const std::string& vehicleID);
      88             :     static MSTLLogicControl::TLSLogicVariants& getTLS(const std::string& id);
      89             :     static MSStoppingPlace* getStoppingPlace(const std::string& id, const SumoXMLTag type);
      90             : 
      91             :     static SUMOVehicleParameter::Stop buildStopParameters(const std::string& edgeOrStoppingPlaceID,
      92             :             double pos, int laneIndex, double startPos, int flags, double duration, double until);
      93             : 
      94             :     static TraCINextStopData buildStopData(const SUMOVehicleParameter::Stop& stopPar);
      95             : 
      96             :     static void findObjectShape(int domain, const std::string& id, PositionVector& shape);
      97             : 
      98             :     static void collectObjectsInRange(int domain, const PositionVector& shape, double range, std::set<const Named*>& into);
      99             :     static void collectObjectIDsInRange(int domain, const PositionVector& shape, double range, std::set<std::string>& into);
     100             : 
     101             :     /**
     102             :      * @brief Filter the given ID-Set (which was obtained from an R-Tree search)
     103             :      *        according to the filters set by the subscription or firstly build the object ID list if
     104             :      *        the filters rather demand searching along the road network than considering a geometric range.
     105             :      * @param[in] s Subscription which holds the filter specification to be applied
     106             :      * @param[in/out] objIDs Set of object IDs that is to be filtered. Result is stored in place.
     107             :      * @note Currently this assumes that the objects are vehicles.
     108             :      */
     109             :     static void applySubscriptionFilters(const Subscription& s, std::set<std::string>& objIDs);
     110             : 
     111             :     /**
     112             :      * @brief Apply the subscription filter "lanes": Only return vehicles on list of lanes relative to ego vehicle.
     113             :      *        Search all predecessor and successor lanes along the road network up until upstreamDist and downstreamDist,
     114             :      *        respectively,
     115             :      * @param[in] s Subscription which holds the filter specification to be applied.
     116             :      * @param[in/out] vehs Set of SUMO traffic objects into which the result is inserted.
     117             :      * @param[in] filterLanes Lane offsets to consider.
     118             :      * @param[in] downstreamDist Downstream distance.
     119             :      * @param[in] upstreamDist Upstream distance.
     120             :      * @param[in] disregardOppositeDirection Whether vehicles on opposite lanes shall be taken into account.
     121             :      */
     122             :     static void applySubscriptionFilterLanes(const Subscription& s, std::set<const SUMOTrafficObject*>& vehs, std::vector<int>& filterLanes,
     123             :             double downstreamDist, double upstreamDist, bool disregardOppositeDirection);
     124             : 
     125             :     /**
     126             :      * @brief Apply the subscription filter "turn": Gather upcoming junctions and vialanes within downstream
     127             :      *        distance and find approaching foes within foeDistToJunction.
     128             :      * @param[in] s Subscription which holds the filter specification to be applied.
     129             :      * @param[in/out] vehs Set of SUMO traffic objects into which the result is inserted.
     130             :      */
     131             :     static void applySubscriptionFilterTurn(const Subscription& s, std::set<const SUMOTrafficObject*>& vehs);
     132             : 
     133             :     static void applySubscriptionFilterFieldOfVision(const Subscription& s, std::set<std::string>& objIDs);
     134             : 
     135             :     /**
     136             :      * @brief Apply the subscription filter "lateral distance": Only return vehicles within the given lateral distance.
     137             :      *        Search myRoute (right-most lane) upstream and bestLanesCont downstream up until upstreamDist and
     138             :      *        downstreamDist, respectively.
     139             :      * @param[in] s Subscription which holds the filter specification to be applied.
     140             :      * @param[in/out] vehs Set of SUMO traffic objects into which the result is inserted.
     141             :      * @param[in] downstreamDist Downstream distance.
     142             :      * @param[in] upstreamDist Upstream distance.
     143             :      * @param[in] lateralDist Lateral distance.
     144             :      */
     145             :     static void applySubscriptionFilterLateralDistance(const Subscription& s, std::set<const SUMOTrafficObject*>& vehs, double downstreamDist,
     146             :             double upstreamDist, double lateralDist);
     147             : 
     148             :     static void applySubscriptionFilterLateralDistanceSinglePass(const Subscription& s,
     149             :             std::set<std::string>& objIDs,
     150             :             std::set<const SUMOTrafficObject*>& vehs,
     151             :             const std::vector<const MSLane*>& lanes,
     152             :             double posOnLane, double posLat, bool isDownstream);
     153             : 
     154             :     static void setRemoteControlled(MSVehicle* v, Position xyPos, MSLane* l, double pos, double posLat, double angle,
     155             :                                     int edgeOffset, ConstMSEdgeVector route, SUMOTime t);
     156             : 
     157             :     static void setRemoteControlled(MSPerson* p, Position xyPos, MSLane* l, double pos, double posLat, double angle,
     158             :                                     int edgeOffset, ConstMSEdgeVector route, SUMOTime t);
     159             : 
     160             :     /// @brief return number of remote-controlled entities
     161             :     static int postProcessRemoteControl();
     162             : 
     163             :     static void cleanup();
     164             : 
     165             :     static void registerStateListener();
     166             : 
     167             :     static const std::vector<std::string>& getVehicleStateChanges(const MSNet::VehicleState state);
     168             : 
     169             :     static const std::vector<std::string>& getTransportableStateChanges(const MSNet::TransportableState state);
     170             : 
     171             :     static void clearStateChanges();
     172             : 
     173             :     static MSCalibrator::AspiredState getCalibratorState(const MSCalibrator* c);
     174             : 
     175             :     /// @name functions for moveToXY
     176             :     /// @{
     177             :     static bool moveToXYMap(const Position& pos, double maxRouteDistance, bool mayLeaveNetwork, const std::string& origID,
     178             :                             const double angle, double speed, const ConstMSEdgeVector& currentRoute, const int routePosition,
     179             :                             const MSLane* currentLane, double currentLanePos, bool onRoad, SUMOVehicleClass vClass, bool setLateralPos,
     180             :                             double& bestDistance, MSLane** lane, double& lanePos, int& routeOffset, ConstMSEdgeVector& edges);
     181             : 
     182             :     static bool moveToXYMap_matchingRoutePosition(const Position& pos, const std::string& origID,
     183             :             const ConstMSEdgeVector& currentRoute, int routeIndex,
     184             :             SUMOVehicleClass vClass, bool setLateralPos,
     185             :             double& bestDistance, MSLane** lane, double& lanePos, int& routeOffset);
     186             : 
     187             :     static bool findCloserLane(const MSEdge* edge, const Position& pos, SUMOVehicleClass vClass, double& bestDistance, MSLane** lane);
     188             : 
     189             :     class LaneUtility {
     190             :     public:
     191             :         LaneUtility(double dist_, double perpendicularDist_, double lanePos_, double angleDiff_, bool ID_,
     192      241394 :                     bool onRoute_, bool sameEdge_, const MSEdge* prevEdge_, const MSEdge* nextEdge_) :
     193      241394 :             dist(dist_), perpendicularDist(perpendicularDist_), lanePos(lanePos_), angleDiff(angleDiff_), ID(ID_),
     194      241394 :             onRoute(onRoute_), sameEdge(sameEdge_), prevEdge(prevEdge_), nextEdge(nextEdge_) {}
     195      241394 :         ~LaneUtility() {}
     196             : 
     197             :         double dist;
     198             :         double perpendicularDist;
     199             :         double lanePos;
     200             :         double angleDiff;
     201             :         bool ID;
     202             :         bool onRoute;
     203             :         bool sameEdge;
     204             :         const MSEdge* prevEdge;
     205             :         const MSEdge* nextEdge;
     206             :     };
     207             :     /// @}
     208             : 
     209        6408 :     class SubscriptionWrapper final : public VariableWrapper {
     210             :     public:
     211             :         SubscriptionWrapper(VariableWrapper::SubscriptionHandler handler, SubscriptionResults& into, ContextSubscriptionResults& context);
     212             :         void setContext(const std::string* const refID);
     213             :         void clear();
     214             :         bool wrapDouble(const std::string& objID, const int variable, const double value);
     215             :         bool wrapInt(const std::string& objID, const int variable, const int value);
     216             :         bool wrapString(const std::string& objID, const int variable, const std::string& value);
     217             :         bool wrapStringList(const std::string& objID, const int variable, const std::vector<std::string>& value);
     218             :         bool wrapDoubleList(const std::string& objID, const int variable, const std::vector<double>& value);
     219             :         bool wrapPosition(const std::string& objID, const int variable, const TraCIPosition& value);
     220             :         bool wrapPositionVector(const std::string& objID, const int variable, const TraCIPositionVector& value);
     221             :         bool wrapColor(const std::string& objID, const int variable, const TraCIColor& value);
     222             :         bool wrapStringDoublePair(const std::string& objID, const int variable, const std::pair<std::string, double>& value);
     223             :         bool wrapStringPair(const std::string& objID, const int variable, const std::pair<std::string, std::string>& value);
     224             :         void empty(const std::string& objID);
     225             :     private:
     226             :         SubscriptionResults& myResults;
     227             :         ContextSubscriptionResults& myContextResults;
     228             :         SubscriptionResults* myActiveResults;
     229             :     private:
     230             :         /// @brief Invalidated assignment operator
     231             :         SubscriptionWrapper& operator=(const SubscriptionWrapper& s) = delete;
     232             :     };
     233             : 
     234             : private:
     235             :     static void handleSingleSubscription(const Subscription& s);
     236             : 
     237             :     /// @brief Adds lane coverage information from newLaneCoverage into aggregatedLaneCoverage
     238             :     /// @param[in/out] aggregatedLaneCoverage - aggregated lane coverage info, to which the new will be added
     239             :     /// @param[in] newLaneCoverage - new lane coverage to be added
     240             :     /// @todo Disjunct ranges are not handled (LaneCoverageInfo definition would need to allow several intervals per lane) but
     241             :     ///       the intermediate range is simply assimilated.
     242             :     static void fuseLaneCoverage(std::shared_ptr<LaneCoverageInfo> aggregatedLaneCoverage, const std::shared_ptr<LaneCoverageInfo> newLaneCoverage);
     243             : 
     244             :     static void debugPrint(const SUMOTrafficObject* veh);
     245             : 
     246             : private:
     247             :     class VehicleStateListener : public MSNet::VehicleStateListener {
     248             :     public:
     249             :         void vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& info = "");
     250             :         /// @brief Changes in the states of simulated vehicles
     251             :         std::map<MSNet::VehicleState, std::vector<std::string> > myVehicleStateChanges;
     252             :     };
     253             : 
     254             :     class TransportableStateListener : public MSNet::TransportableStateListener {
     255             :     public:
     256             :         void transportableStateChanged(const MSTransportable* const transportable, MSNet::TransportableState to, const std::string& info = "");
     257             :         /// @brief Changes in the states of simulated transportables
     258             :         std::map<MSNet::TransportableState, std::vector<std::string> > myTransportableStateChanges;
     259             :     };
     260             : 
     261             :     /// @brief The list of known, still valid subscriptions
     262             :     static std::vector<Subscription> mySubscriptions;
     263             : 
     264             :     /// @brief The last context subscription
     265             :     static Subscription* myLastContextSubscription;
     266             : 
     267             :     /// @brief Map of commandIds -> their executors; applicable if the executor applies to the method footprint
     268             :     static std::map<int, std::shared_ptr<VariableWrapper> > myWrapper;
     269             : 
     270             :     /// @brief Changes in the states of simulated vehicles
     271             :     static VehicleStateListener myVehicleStateListener;
     272             : 
     273             :     /// @brief Changes in the states of simulated transportables
     274             :     static TransportableStateListener myTransportableStateListener;
     275             : 
     276             :     /// @brief A lookup tree of lanes
     277             :     static LANE_RTREE_QUAL* myLaneTree;
     278             : 
     279             :     static std::map<std::string, MSVehicle*> myRemoteControlledVehicles;
     280             :     static std::map<std::string, MSPerson*> myRemoteControlledPersons;
     281             : 
     282             :     /// @brief invalidated standard constructor
     283             :     Helper() = delete;
     284             : };
     285             : 
     286             : }

Generated by: LCOV version 1.14