SUMO - Simulation of Urban MObility
MSCModel_NonInteracting.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2014-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
16 // The container following model for tranship (prototype)
17 /****************************************************************************/
18 
19 // ===========================================================================
20 // included modules
21 // ===========================================================================
22 #include <config.h>
23 //
24 #include <cmath>
25 #include <algorithm>
27 #include <utils/geom/GeomHelper.h>
29 #include <microsim/MSNet.h>
30 #include <microsim/MSEdge.h>
31 #include <microsim/MSLane.h>
32 #include <microsim/MSJunction.h>
35 
36 // ===========================================================================
37 // static members
38 // ===========================================================================
40 
41 
42 // named constants
43 const int CState::FORWARD(1);
44 const int CState::BACKWARD(-1);
45 const int CState::UNDEFINED_DIRECTION(0);
46 const double CState::LATERAL_OFFSET(0);
47 
48 // ===========================================================================
49 // MSCModel_NonInteracting method definitions
50 // ===========================================================================
51 
53  myNet(net) {
54  assert(myNet != 0);
55 }
56 
57 
59 }
60 
63  if (myModel == nullptr) {
64  MSNet* net = MSNet::getInstance();
66  }
67  return myModel;
68 }
69 
70 CState*
72  CState* state = new CState();
73  const SUMOTime firstEdgeDuration = state->computeTranshipTime(nullptr, *stage, now);
74  myNet->getBeginOfTimestepEvents()->addEvent(new MoveToNextEdge(container, *stage), now + firstEdgeDuration);
75  return state;
76 }
77 
78 
79 void
81  if (myModel != nullptr) {
82  delete myModel;
83  myModel = nullptr;
84  }
85 }
86 
87 
90  CState* state = myParent.getContainerState();
91  const MSEdge* old = myParent.getEdge();
92  const bool arrived = myParent.moveToNextEdge(myContainer, currentTime);
93  if (arrived) {
94  // tranship finished. clean up state
95  delete state;
96  return 0;
97  } else {
98  return state->computeTranshipTime(old, myParent, currentTime);
99  }
100 }
101 
102 
103 double
105  return myCurrentBeginPos + (myCurrentEndPos - myCurrentBeginPos) / myCurrentDuration * (now - myLastEntryTime);
106 }
107 
108 
109 Position
111  const double dist = myCurrentBeginPosition.distanceTo2D(myCurrentEndPosition); //distance between begin and end position of this tranship stage
112  double pos = MIN2(STEPS2TIME(now - myLastEntryTime) * stage.getMaxSpeed(), dist); //the containerd shall not go beyond its end position
113  return PositionVector::positionAtOffset2D(myCurrentBeginPosition, myCurrentEndPosition, pos, 0);
114 }
115 
116 
117 double
119  double angle = stage.getEdgeAngle(stage.getEdge(), getEdgePos(stage, now)) + (myCurrentEndPos < myCurrentBeginPos ? 1.5 * M_PI : 0.5 * M_PI);
120  if (angle > M_PI) {
121  angle -= 2 * M_PI;
122  }
123  return angle;
124 }
125 
126 
127 double
129  return stage.getMaxSpeed();
130 }
131 
132 
133 SUMOTime
135  myLastEntryTime = currentTime;
136 
137  myCurrentBeginPos = stage.getDepartPos();
138  myCurrentEndPos = stage.getArrivalPos();
139 
140  const MSLane* fromLane = stage.getFromEdge()->getLanes().front(); //the lane the container starts from during its tranship stage
141  myCurrentBeginPosition = stage.getLanePosition(fromLane, myCurrentBeginPos, LATERAL_OFFSET);
142  const MSLane* toLane = stage.getToEdge()->getLanes().front(); //the lane the container ends during its tranship stage
143  myCurrentEndPosition = stage.getLanePosition(toLane, myCurrentEndPos, LATERAL_OFFSET);
144 
145  myCurrentDuration = MAX2((SUMOTime)1, TIME2STEPS(fabs(myCurrentEndPosition.distanceTo(myCurrentBeginPosition)) / stage.getMaxSpeed()));
146  return myCurrentDuration;
147 }
148 
149 
150 
151 /****************************************************************************/
long long int SUMOTime
Definition: SUMOTime.h:36
MSCModel_NonInteracting(MSNet *net)
Constructor (it should not be necessary to construct more than one instance)
static MSCModel_NonInteracting * myModel
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
Definition: Position.h:244
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
const MSEdge * getToEdge() const
Returns last edge of the containers route.
const std::vector< MSLane * > & getLanes() const
Returns this edge&#39;s lanes.
Definition: MSEdge.h:162
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:165
T MAX2(T a, T b)
Definition: StdDefs.h:76
const MSEdge * getFromEdge() const
Returns first edge of the containers route.
#define TIME2STEPS(x)
Definition: SUMOTime.h:60
Position getLanePosition(const MSLane *lane, double at, double offset) const
get position on lane at length at with orthogonal offset
The simulated network and simulation perfomer.
Definition: MSNet.h:84
CState * add(MSTransportable *container, MSContainer::MSContainerStage_Tranship *stage, SUMOTime now)
register the given container as a transhiped container
static const int FORWARD
A road/street connecting two junctions.
Definition: MSEdge.h:75
static const int BACKWARD
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:39
MSNet * myNet
the net to which to issue moveToNextEdge commands
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:409
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
#define STEPS2TIME(x)
Definition: SUMOTime.h:58
T MIN2(T a, T b)
Definition: StdDefs.h:70
double getMaxSpeed() const
accessors to be used by MSCModel_NonInteracting
Definition: MSContainer.h:181
double getAngle(const MSContainer::MSContainerStage_Tranship &stage, SUMOTime now) const
return the direction in which the container heading to
#define M_PI
Definition: odrSpiral.cpp:40
static const double LATERAL_OFFSET
the offset for computing container positions when being transhiped
SUMOTime execute(SUMOTime currentTime)
Executes the command.
double getEdgeAngle(const MSEdge *e, double at) const
get angle of the edge at a certain position
SUMOTime computeTranshipTime(const MSEdge *prev, const MSContainer::MSContainerStage_Tranship &stage, SUMOTime currentTime)
compute tranship time on edge and update state members
const MSEdge * getEdge() const
Returns the current edge.
The container following model for tranship.
double getSpeed(const MSContainer::MSContainerStage_Tranship &stage) const
return the current speed of the container
Position getPosition(const MSContainer::MSContainerStage_Tranship &stage, SUMOTime now) const
return the network coordinate of the container
double getEdgePos(const MSContainer::MSContainerStage_Tranship &stage, SUMOTime now) const
return the offset from the start of the current edge measured in its natural direction ...
Representation of a lane in the micro simulation.
Definition: MSLane.h:78
static const int UNDEFINED_DIRECTION
static MSCModel_NonInteracting * getModel()
static void cleanup()
remove state at simulation end