Eclipse SUMO - Simulation of Urban MObility
Helper.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2012-2020 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 /****************************************************************************/
19 // C++ TraCI client API implementation
20 /****************************************************************************/
21 #pragma once
22 #include <config.h>
23 
24 #include <vector>
25 #include <memory>
26 #include <libsumo/Subscription.h>
27 #include <microsim/MSNet.h>
28 
29 
30 // ===========================================================================
31 // class declarations
32 // ===========================================================================
33 class Position;
34 class PositionVector;
35 class RGBColor;
36 class MSEdge;
37 class SUMOTrafficObject;
38 class MSPerson;
39 class MSVehicle;
40 class MSBaseVehicle;
41 class MSVehicleType;
42 
43 
44 // ===========================================================================
45 // type definitions
46 // ===========================================================================
47 typedef std::map<const MSLane*, std::pair<double, double> > LaneCoverageInfo; // also declared in MSLane.h!
48 
49 // ===========================================================================
50 // class definitions
51 // ===========================================================================
52 
54 public:
56  LaneStoringVisitor(std::set<const Named*>& objects, const PositionVector& shape,
57  const double range, const int domain)
58  : myObjects(objects), myShape(shape), myRange(range), myDomain(domain) {}
59 
62 
64  void add(const MSLane* const l) const;
65 
67  std::set<const Named*>& myObjects;
69  const double myRange;
70  const int myDomain;
71 
72 private:
75 
78 };
79 
80 #define LANE_RTREE_QUAL RTree<MSLane*, MSLane, float, 2, LaneStoringVisitor>
81 template<>
82 inline float LANE_RTREE_QUAL::RectSphericalVolume(Rect* a_rect) {
83  ASSERT(a_rect);
84  const float extent0 = a_rect->m_max[0] - a_rect->m_min[0];
85  const float extent1 = a_rect->m_max[1] - a_rect->m_min[1];
86  return .78539816f * (extent0 * extent0 + extent1 * extent1);
87 }
88 
89 template<>
90 inline LANE_RTREE_QUAL::Rect LANE_RTREE_QUAL::CombineRect(Rect* a_rectA, Rect* a_rectB) {
91  ASSERT(a_rectA && a_rectB);
92  Rect newRect;
93  newRect.m_min[0] = rtree_min(a_rectA->m_min[0], a_rectB->m_min[0]);
94  newRect.m_max[0] = rtree_max(a_rectA->m_max[0], a_rectB->m_max[0]);
95  newRect.m_min[1] = rtree_min(a_rectA->m_min[1], a_rectB->m_min[1]);
96  newRect.m_max[1] = rtree_max(a_rectA->m_max[1], a_rectB->m_max[1]);
97  return newRect;
98 }
99 
100 namespace libsumo {
101 
106 class Helper {
107 public:
108  static void subscribe(const int commandId, const std::string& id, const std::vector<int>& variables,
109  const double beginTime, const double endTime, const libsumo::TraCIResults& params,
110  const int contextDomain = 0, const double range = 0.);
111 
112  static void addSubscriptionParam(double param);
113 
114  static void addSubscriptionParam(const std::string& param);
115 
116  static void handleSubscriptions(const SUMOTime t);
117 
118  static bool needNewSubscription(libsumo::Subscription& s, std::vector<Subscription>& subscriptions, libsumo::Subscription*& modifiedSubscription);
119 
120  static void clearSubscriptions();
121 
123 
125  static TraCIPositionVector makeTraCIPositionVector(const PositionVector& positionVector);
126  static TraCIPosition makeTraCIPosition(const Position& position, const bool includeZ = false);
127  static Position makePosition(const TraCIPosition& position);
128 
130  static TraCIColor makeTraCIColor(const RGBColor& color);
131  static RGBColor makeRGBColor(const TraCIColor& color);
132 
133  static MSEdge* getEdge(const std::string& edgeID);
134  static const MSLane* getLaneChecking(const std::string& edgeID, int laneIndex, double pos);
135  static std::pair<MSLane*, double> convertCartesianToRoadMap(const Position& pos, const SUMOVehicleClass vClass);
136  static double getDrivingDistance(std::pair<const MSLane*, double>& roadPos1, std::pair<const MSLane*, double>& roadPos2);
137 
138  static MSBaseVehicle* getVehicle(const std::string& id);
139  static MSPerson* getPerson(const std::string& id);
140  static SUMOTrafficObject* getTrafficObject(int domain, const std::string& id);
141  static const MSVehicleType& getVehicleType(const std::string& vehicleID);
142 
143  static void findObjectShape(int domain, const std::string& id, PositionVector& shape);
144 
145  static void collectObjectsInRange(int domain, const PositionVector& shape, double range, std::set<const Named*>& into);
146  static void collectObjectIDsInRange(int domain, const PositionVector& shape, double range, std::set<std::string>& into);
147 
156  static void applySubscriptionFilters(const Subscription& s, std::set<std::string>& objIDs);
157 
158  static void applySubscriptionFilterFieldOfVision(const Subscription& s, std::set<std::string>& objIDs);
159 
161  std::set<std::string>& objIDs,
162  std::set<const SUMOTrafficObject*>& vehs,
163  const std::vector<const MSLane*>& lanes,
164  double posOnLane, double posLat, bool isDownstream);
165 
166  static void setRemoteControlled(MSVehicle* v, Position xyPos, MSLane* l, double pos, double posLat, double angle,
167  int edgeOffset, ConstMSEdgeVector route, SUMOTime t);
168 
169  static void setRemoteControlled(MSPerson* p, Position xyPos, MSLane* l, double pos, double posLat, double angle,
170  int edgeOffset, ConstMSEdgeVector route, SUMOTime t);
171 
172  static void postProcessRemoteControl();
173 
174  static void cleanup();
175 
176  static void registerVehicleStateListener();
177 
178  static const std::vector<std::string>& getVehicleStateChanges(const MSNet::VehicleState state);
179 
180  static void clearVehicleStates();
181 
184  static bool moveToXYMap(const Position& pos, double maxRouteDistance, bool mayLeaveNetwork, const std::string& origID,
185  const double angle, double speed, const ConstMSEdgeVector& currentRoute, const int routePosition,
186  const MSLane* currentLane, double currentLanePos, bool onRoad, SUMOVehicleClass vClass, bool setLateralPos,
187  double& bestDistance, MSLane** lane, double& lanePos, int& routeOffset, ConstMSEdgeVector& edges);
188 
189  static bool moveToXYMap_matchingRoutePosition(const Position& pos, const std::string& origID,
190  const ConstMSEdgeVector& currentRoute, int routeIndex,
191  SUMOVehicleClass vClass, bool setLateralPos,
192  double& bestDistance, MSLane** lane, double& lanePos, int& routeOffset);
193 
194  static bool findCloserLane(const MSEdge* edge, const Position& pos, SUMOVehicleClass vClass, double& bestDistance, MSLane** lane);
195 
196  class LaneUtility {
197  public:
198  LaneUtility(double dist_, double perpendicularDist_, double lanePos_, double angleDiff_, bool ID_,
199  bool onRoute_, bool sameEdge_, const MSEdge* prevEdge_, const MSEdge* nextEdge_) :
200  dist(dist_), perpendicularDist(perpendicularDist_), lanePos(lanePos_), angleDiff(angleDiff_), ID(ID_),
201  onRoute(onRoute_), sameEdge(sameEdge_), prevEdge(prevEdge_), nextEdge(nextEdge_) {}
203 
204  double dist;
206  double lanePos;
207  double angleDiff;
208  bool ID;
209  bool onRoute;
210  bool sameEdge;
211  const MSEdge* prevEdge;
212  const MSEdge* nextEdge;
213  };
215 
216  class SubscriptionWrapper final : public VariableWrapper {
217  public:
219  void setContext(const std::string& refID);
220  void setParams(const std::vector<unsigned char>* params);
221  const std::vector<unsigned char>* getParams() const {
222  return myParams;
223  }
224  void clear();
225  bool wrapDouble(const std::string& objID, const int variable, const double value);
226  bool wrapInt(const std::string& objID, const int variable, const int value);
227  bool wrapString(const std::string& objID, const int variable, const std::string& value);
228  bool wrapStringList(const std::string& objID, const int variable, const std::vector<std::string>& value);
229  bool wrapPosition(const std::string& objID, const int variable, const TraCIPosition& value);
230  bool wrapColor(const std::string& objID, const int variable, const TraCIColor& value);
231  bool wrapRoadPosition(const std::string& objID, const int variable, const TraCIRoadPosition& value);
232  private:
236  const std::vector<unsigned char>* myParams = nullptr;
237  private:
240  };
241 
242 private:
243  static void handleSingleSubscription(const Subscription& s);
244 
250  static void fuseLaneCoverage(std::shared_ptr<LaneCoverageInfo> aggregatedLaneCoverage, const std::shared_ptr<LaneCoverageInfo> newLaneCoverage);
251 
252  static void debugPrint(const SUMOTrafficObject* veh);
253 
254 private:
256  public:
257  void vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& info = "");
259  std::map<MSNet::VehicleState, std::vector<std::string> > myVehicleStateChanges;
260  };
261 
263  static std::vector<Subscription> mySubscriptions;
264 
267 
269  static std::map<int, std::shared_ptr<VariableWrapper> > myWrapper;
270 
273 
276 
277  static std::map<std::string, MSVehicle*> myRemoteControlledVehicles;
278  static std::map<std::string, MSPerson*> myRemoteControlledPersons;
279 
281  Helper() = delete;
282 };
283 
284 }
std::map< const MSLane *, std::pair< double, double > > LaneCoverageInfo
Definition: Helper.h:41
#define LANE_RTREE_QUAL
Definition: Helper.h:80
std::vector< const MSEdge * > ConstMSEdgeVector
Definition: MSEdge.h:74
#define rtree_min(a, b)
Definition: RTree.h:20
#define rtree_max(a, b)
Definition: RTree.h:21
#define ASSERT
Definition: RTree.h:12
long long int SUMOTime
Definition: SUMOTime.h:31
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
LaneStoringVisitor(const LaneStoringVisitor &src)
invalidated copy constructor
const double myRange
Definition: Helper.h:69
~LaneStoringVisitor()
Destructor.
Definition: Helper.h:61
const int myDomain
Definition: Helper.h:70
std::set< const Named * > & myObjects
The container.
Definition: Helper.h:67
void add(const MSLane *const l) const
Adds the given object to the container.
Definition: Helper.cpp:62
const PositionVector & myShape
Definition: Helper.h:68
LaneStoringVisitor & operator=(const LaneStoringVisitor &src)
invalidated assignment operator
LaneStoringVisitor(std::set< const Named * > &objects, const PositionVector &shape, const double range, const int domain)
Constructor.
Definition: Helper.h:56
The base class for microscopic and mesoscopic vehicles.
Definition: MSBaseVehicle.h:51
A road/street connecting two junctions.
Definition: MSEdge.h:77
Representation of a lane in the micro simulation.
Definition: MSLane.h:82
Interface for objects listening to vehicle state changes.
Definition: MSNet.h:620
VehicleState
Definition of a vehicle state.
Definition: MSNet.h:587
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:77
The car-following model and parameter.
Definition: MSVehicleType.h:62
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:36
A list of positions.
Representation of a vehicle, person, or container.
Representation of a vehicle.
Definition: SUMOVehicle.h:58
LaneUtility(double dist_, double perpendicularDist_, double lanePos_, double angleDiff_, bool ID_, bool onRoute_, bool sameEdge_, const MSEdge *prevEdge_, const MSEdge *nextEdge_)
Definition: Helper.h:198
const MSEdge * nextEdge
Definition: Helper.h:212
const MSEdge * prevEdge
Definition: Helper.h:211
const std::vector< unsigned char > * getParams() const
Definition: Helper.h:221
void setContext(const std::string &refID)
Definition: Helper.cpp:1530
SubscriptionResults & myResults
Definition: Helper.h:233
bool wrapDouble(const std::string &objID, const int variable, const double value)
Definition: Helper.cpp:1550
const std::vector< unsigned char > * myParams
Definition: Helper.h:236
bool wrapColor(const std::string &objID, const int variable, const TraCIColor &value)
Definition: Helper.cpp:1587
bool wrapInt(const std::string &objID, const int variable, const int value)
Definition: Helper.cpp:1557
bool wrapStringList(const std::string &objID, const int variable, const std::vector< std::string > &value)
Definition: Helper.cpp:1571
bool wrapPosition(const std::string &objID, const int variable, const TraCIPosition &value)
Definition: Helper.cpp:1580
bool wrapString(const std::string &objID, const int variable, const std::string &value)
Definition: Helper.cpp:1564
void setParams(const std::vector< unsigned char > *params)
Definition: Helper.cpp:1536
bool wrapRoadPosition(const std::string &objID, const int variable, const TraCIRoadPosition &value)
Definition: Helper.cpp:1594
ContextSubscriptionResults & myContextResults
Definition: Helper.h:234
SubscriptionWrapper(VariableWrapper::SubscriptionHandler handler, SubscriptionResults &into, ContextSubscriptionResults &context)
Definition: Helper.cpp:1523
SubscriptionResults * myActiveResults
Definition: Helper.h:235
SubscriptionWrapper & operator=(const SubscriptionWrapper &s)=delete
Invalidated assignment operator.
std::map< MSNet::VehicleState, std::vector< std::string > > myVehicleStateChanges
Changes in the states of simulated vehicles.
Definition: Helper.h:259
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
Definition: Helper.cpp:1601
C++ TraCI client API implementation.
Definition: Helper.h:106
static Position makePosition(const TraCIPosition &position)
Definition: Helper.cpp:398
static MSEdge * getEdge(const std::string &edgeID)
Definition: Helper.cpp:404
static void postProcessRemoteControl()
Definition: Helper.cpp:1102
static void cleanup()
Definition: Helper.cpp:526
static double getDrivingDistance(std::pair< const MSLane *, double > &roadPos1, std::pair< const MSLane *, double > &roadPos2)
Definition: Helper.cpp:463
static void collectObjectsInRange(int domain, const PositionVector &shape, double range, std::set< const Named * > &into)
Definition: Helper.cpp:603
static TraCIPosition makeTraCIPosition(const Position &position, const bool includeZ=false)
Definition: Helper.cpp:388
static LANE_RTREE_QUAL * myLaneTree
A storage of lanes.
Definition: Helper.h:275
static void findObjectShape(int domain, const std::string &id, PositionVector &shape)
Definition: Helper.cpp:560
static PositionVector makePositionVector(const TraCIPositionVector &vector)
Definition: Helper.cpp:358
static void fuseLaneCoverage(std::shared_ptr< LaneCoverageInfo > aggregatedLaneCoverage, const std::shared_ptr< LaneCoverageInfo > newLaneCoverage)
Adds lane coverage information from newLaneCoverage into aggregatedLaneCoverage.
Definition: Helper.cpp:330
static bool moveToXYMap_matchingRoutePosition(const Position &pos, const std::string &origID, const ConstMSEdgeVector &currentRoute, int routeIndex, SUMOVehicleClass vClass, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset)
Definition: Helper.cpp:1413
static void debugPrint(const SUMOTrafficObject *veh)
Definition: Helper.cpp:125
static MSPerson * getPerson(const std::string &id)
Definition: Helper.cpp:499
static void subscribe(const int commandId, const std::string &id, const std::vector< int > &variables, const double beginTime, const double endTime, const libsumo::TraCIResults &params, const int contextDomain=0, const double range=0.)
Definition: Helper.cpp:137
Helper()=delete
invalidated standard constructor
static TraCIPositionVector makeTraCIPositionVector(const PositionVector &positionVector)
helper functions
Definition: Helper.cpp:348
static void registerVehicleStateListener()
Definition: Helper.cpp:538
static std::map< int, std::shared_ptr< VariableWrapper > > myWrapper
Map of commandIds -> their executors; applicable if the executor applies to the method footprint.
Definition: Helper.h:269
static void clearVehicleStates()
Definition: Helper.cpp:552
static void clearSubscriptions()
Definition: Helper.cpp:238
static MSBaseVehicle * getVehicle(const std::string &id)
Definition: Helper.cpp:485
static void applySubscriptionFilterLateralDistanceSinglePass(const Subscription &s, std::set< std::string > &objIDs, std::set< const SUMOTrafficObject * > &vehs, const std::vector< const MSLane * > &lanes, double posOnLane, double posLat, bool isDownstream)
Definition: Helper.cpp:1020
static TraCIColor makeTraCIColor(const RGBColor &color)
Definition: Helper.cpp:371
static void applySubscriptionFilterFieldOfVision(const Subscription &s, std::set< std::string > &objIDs)
Definition: Helper.cpp:981
static Subscription * myLastContextSubscription
The last context subscription.
Definition: Helper.h:266
static void setRemoteControlled(MSVehicle *v, Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, ConstMSEdgeVector route, SUMOTime t)
Definition: Helper.cpp:1087
static void applySubscriptionFilters(const Subscription &s, std::set< std::string > &objIDs)
Filter the given ID-Set (which was obtained from an R-Tree search) according to the filters set by th...
Definition: Helper.cpp:641
static std::map< std::string, MSVehicle * > myRemoteControlledVehicles
Definition: Helper.h:277
static const MSVehicleType & getVehicleType(const std::string &vehicleID)
Definition: Helper.cpp:520
static bool moveToXYMap(const Position &pos, double maxRouteDistance, bool mayLeaveNetwork, const std::string &origID, const double angle, double speed, const ConstMSEdgeVector &currentRoute, const int routePosition, const MSLane *currentLane, double currentLanePos, bool onRoad, SUMOVehicleClass vClass, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset, ConstMSEdgeVector &edges)
Definition: Helper.cpp:1123
static std::pair< MSLane *, double > convertCartesianToRoadMap(const Position &pos, const SUMOVehicleClass vClass)
Definition: Helper.cpp:431
static SUMOTrafficObject * getTrafficObject(int domain, const std::string &id)
Definition: Helper.cpp:509
static VehicleStateListener myVehicleStateListener
Changes in the states of simulated vehicles.
Definition: Helper.h:272
static std::vector< Subscription > mySubscriptions
The list of known, still valid subscriptions.
Definition: Helper.h:263
static void handleSingleSubscription(const Subscription &s)
Definition: Helper.cpp:256
static const std::vector< std::string > & getVehicleStateChanges(const MSNet::VehicleState state)
Definition: Helper.cpp:546
static void collectObjectIDsInRange(int domain, const PositionVector &shape, double range, std::set< std::string > &into)
Definition: Helper.cpp:593
static void handleSubscriptions(const SUMOTime t)
Definition: Helper.cpp:188
static void addSubscriptionParam(double param)
Definition: Helper.cpp:170
static Subscription * addSubscriptionFilter(SubscriptionFilterType filter)
Definition: Helper.cpp:245
static const MSLane * getLaneChecking(const std::string &edgeID, int laneIndex, double pos)
Definition: Helper.cpp:414
static RGBColor makeRGBColor(const TraCIColor &color)
Definition: Helper.cpp:382
static std::map< std::string, MSPerson * > myRemoteControlledPersons
Definition: Helper.h:278
static bool needNewSubscription(libsumo::Subscription &s, std::vector< Subscription > &subscriptions, libsumo::Subscription *&modifiedSubscription)
Definition: Helper.cpp:213
static bool findCloserLane(const MSEdge *edge, const Position &pos, SUMOVehicleClass vClass, double &bestDistance, MSLane **lane)
Definition: Helper.cpp:1382
Representation of a subscription.
Definition: Subscription.h:67
bool(* SubscriptionHandler)(const std::string &objID, const int variable, VariableWrapper *wrapper)
Definition of a method to be called for serving an associated commandID.
Definition: Subscription.h:147
std::map< int, std::shared_ptr< TraCIResult > > TraCIResults
{variable->value}
Definition: TraCIDefs.h:248
std::vector< TraCIPosition > TraCIPositionVector
Definition: TraCIDefs.h:196
std::map< std::string, TraCIResults > SubscriptionResults
{object->{variable->value}}
Definition: TraCIDefs.h:250
SubscriptionFilterType
Filter types for context subscriptions.
Definition: Subscription.h:34
std::map< std::string, SubscriptionResults > ContextSubscriptionResults
Definition: TraCIDefs.h:251
A 3D-position.
Definition: TraCIDefs.h:141
An edgeId, position and laneIndex.
Definition: TraCIDefs.h:153