LCOV - code coverage report
Current view: top level - src/libsumo - Helper.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 5 5
Test Date: 2024-11-21 15:56:26 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       200669 :                     bool onRoute_, bool sameEdge_, const MSEdge* prevEdge_, const MSEdge* nextEdge_) :
     193       200669 :             dist(dist_), perpendicularDist(perpendicularDist_), lanePos(lanePos_), angleDiff(angleDiff_), ID(ID_),
     194       200669 :             onRoute(onRoute_), sameEdge(sameEdge_), prevEdge(prevEdge_), nextEdge(nextEdge_) {}
     195       200669 :         ~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         6384 :     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 2.0-1