 |
Eclipse SUMO - Simulation of Urban MObility
|
Go to the documentation of this file.
60 double departPos,
double arrivalPos,
double departPosLat) :
63 "person '" + personID +
"' walking to " + route.back()->getID()),
64 MOVING_WITHOUT_VEHICLE),
65 myWalkingTime(walkingTime),
67 myCurrentInternalEdge(nullptr),
68 myDepartPos(departPos),
69 myDepartPosLat(departPosLat),
71 myPedestrianState(&myDummyState) {
73 "person '" + personID +
"' walking from " + route.front()->getID());
74 if (walkingTime > 0) {
82 delete myPedestrianState;
88 return new MSPersonStage_Walking(
"dummyID", myRoute, myDestinationStop, myWalkingTime, mySpeed, myDepartPos, myArrivalPos, myDepartPosLat);
93 if (myCurrentInternalEdge !=
nullptr) {
94 return myCurrentInternalEdge;
103 return myRoute.front();
109 return myPedestrianState ==
nullptr ? -1 : myPedestrianState->getEdgePos(*
this, now);
115 return myPedestrianState->getPosition(*
this, now);
121 return myPedestrianState->getAngle(*
this, now);
127 return myPedestrianState->getWaitingTime(*
this, now);
133 return myPedestrianState->getSpeed(*
this);
146 myRouteStep = myRoute.begin();
147 myLastEdgeEntryTime = now;
148 if (myWalkingTime == 0) {
149 if (!person->
proceed(net, now)) {
156 if (myWalkingTime > 0) {
157 mySpeed = computeAverageSpeed();
161 if (myPedestrianState ==
nullptr) {
165 const MSEdge* edge = *myRouteStep;
167 if (lane !=
nullptr) {
190 return walkDistance() /
STEPS2TIME(myWalkingTime + 1);
197 for (
const MSEdge* edge : myRoute) {
198 length += edge->getLength();
202 for (ConstMSEdgeVector::const_iterator i = myRoute.begin(); i != myRoute.end() - 1; ++i) {
203 const MSEdge* fromEdge = *i;
204 const MSEdge* toEdge = *(i + 1);
205 const MSLane* from = getSidewalk<MSEdge, MSLane>(fromEdge);
206 const MSLane* to = getSidewalk<MSEdge, MSLane>(toEdge);
209 if (from !=
nullptr && to !=
nullptr) {
232 const double lengthFwd = (length - myDepartPos - (
235 : myRoute.back()->getLength() - myArrivalPos));
236 const double lengthBwd = (length - (myRoute.front()->getLength() - myDepartPos) - (
239 : myRoute.back()->getLength() - myArrivalPos));
241 if (myRoute.size() == 1) {
242 if (myDepartPos > myArrivalPos) {
248 if (mayStartForward && mayStartBackward) {
249 length = lengthFwd < lengthBwd ? lengthFwd : lengthBwd;
250 }
else if (mayStartForward) {
252 }
else if (mayStartBackward) {
272 const double distance = walkDistance();
274 const SUMOTime duration = myArrived - myDeparted;
275 const SUMOTime timeLoss = myArrived == -1 ? 0 : duration -
TIME2STEPS(distance / maxSpeed);
281 os.
writeAttr(
"arrivalPos", myArrivalPos);
282 os.
writeAttr(
"duration", myDeparted < 0 ?
"-1" :
294 std::string comment =
"";
295 if (myDestinationStop !=
nullptr) {
297 if (myDestinationStop->getMyName() !=
"") {
301 if (myWalkingTime > 0) {
303 }
else if (mySpeed > 0) {
306 if (withRouteLength) {
307 os.
writeAttr(
"routeLength", walkDistance());
316 .
writeAttr(
"agent", p.
getID()).writeAttr(
"link", myRoute.front()->getID()).closeTag();
323 .
writeAttr(
"agent", p.
getID()).writeAttr(
"link", myRoute.back()->getID()).closeTag();
331 const bool arrived = myRouteStep == myRoute.end() - 1;
332 if (lane !=
nullptr) {
334 rem->updateDetector(*person, 0.0, lane->
getLength(), myLastEdgeEntryTime, currentTime, currentTime,
true);
335 rem->notifyLeave(*person,
340 myLastEdgeEntryTime = currentTime;
343 if (myDestinationStop !=
nullptr) {
344 myDestinationStop->addTransportable(person);
352 if (nextInternal ==
nullptr) {
354 myCurrentInternalEdge =
nullptr;
356 myCurrentInternalEdge = nextInternal;
358 const MSLane* nextLane = getSidewalk<MSEdge, MSLane>(
getEdge());
359 if (nextLane !=
nullptr) {
371 assert(routeOffset >= 0);
372 assert(routeOffset < (
int)myRoute.size());
374 myRouteStep = myRoute.begin() + routeOffset;
385 const std::string dest = (getDestinationStop() ==
nullptr ?
387 " stop '" + getDestinationStop()->getID() +
"'" + (
388 getDestinationStop()->getMyName() !=
"" ?
" (" + getDestinationStop()->getMyName() +
")" :
""));
389 return "walking to " + dest;
397 MSStoppingPlace* toStop,
const double arrivalPos,
const std::vector<std::string>& lines,
398 const std::string& intendedVeh,
SUMOTime intendedDepart) :
403 intendedVeh, intendedDepart) {
411 return new MSPersonStage_Driving(myDestination, myDestinationStop, myArrivalPos, std::vector<std::string>(myLines.begin(), myLines.end()),
412 myIntendedVehicleID, myIntendedDepart);
420 if (start !=
nullptr) {
426 myWaitingEdge = previous->
getEdge();
430 myWaitingSince = now;
433 setVehicle(availableVehicle);
434 myVehicle->addPerson(person);
440 myWaitingEdge->addPerson(person);
453 const std::string dest = (getDestinationStop() ==
nullptr ?
455 " stop '" + getDestinationStop()->getID() +
"'" + (
456 getDestinationStop()->getMyName() !=
"" ?
" (" + getDestinationStop()->getMyName() +
")" :
""));
457 const std::string intended = myIntendedVehicleID !=
"" ?
458 " (vehicle " + myIntendedVehicleID +
" at time " +
time2string(myIntendedDepart) +
")" :
461 "waiting for " +
joinToString(myLines,
",") + intended +
" then drive to " + dest :
462 "driving to " + dest;
469 const SUMOTime departed = myDeparted >= 0 ? myDeparted : now;
470 const SUMOTime waitingTime = myWaitingSince >= 0 && myDeparted >= 0 ? departed - myWaitingSince : -1;
471 const SUMOTime duration = myArrived - myDeparted;
480 (myDeparted >= 0 ?
time2string(now - myDeparted) :
"-1"));
481 os.
writeAttr(
"routeLength", myVehicleDistance);
493 std::string comment =
"";
494 if (myDestinationStop !=
nullptr) {
496 if (myDestinationStop->getMyName() !=
"") {
501 if (myIntendedVehicleID !=
"") {
504 if (myIntendedDepart >= 0) {
507 if (withRouteLength) {
508 os.
writeAttr(
"routeLength", myVehicleDistance);
518 const double arrivalPos,
const double dist,
const bool isExit) :
520 myDist(dist), myAmExit(isExit) {
533 return new MSPersonStage_Access(myDestination, myDestinationStop, myArrivalPos, myDist, myAmExit);
541 myDestinationStop->getLane().getEdge().addPerson(person);
553 return (myAmExit ?
"access from stop '" :
"access to stop '") + getDestinationStop()->getID() +
"'";
559 return myPath.positionAtOffset(myPath.length() * (now - myDeparted) / (myEstimatedArrival - myDeparted));
565 return myPath.angleAt2D(0);
581 myStopEdge->removePerson(myPerson);
621 if (accessDist > 0.) {
632 if (accessDist > 0.) {
637 (*myStep)->proceed(net,
this, time, prior);
666 if (nextEdge !=
nullptr) {
667 return nextEdge->
getID();
677 assert(walkingStage != 0);
692 for (MSTransportablePlan::const_iterator i =
myPlan->begin(); i !=
myPlan->end(); ++i) {
693 (*i)->tripInfoOutput(os,
this);
706 for (MSTransportablePlan::const_iterator i =
myPlan->begin(); i !=
myPlan->end(); ++i) {
707 (*i)->routeOutput(os, withRouteLength);
716 assert(nextIndex > firstIndex);
732 for (
int i = nextIndex - 1; i >= firstIndex; i--) {
766 myRemoteXYPos = xyPos;
769 myRemotePosLat = posLat;
770 myRemoteAngle = angle;
771 myRemoteEdgeOffset = edgeOffset;
772 myRemoteRoute = route;
773 myLastRemoteAccess = t;
785 return myLastRemoteAccess >= t -
TIME2STEPS(10);
807 s->
getPedestrianState()->
moveToXY(p, myRemoteXYPos, myRemoteLane, myRemotePos, myRemotePosLat, myRemoteAngle, myRemoteEdgeOffset, myRemoteRoute,
The car-following model and parameter.
virtual void endEventOutput(const MSTransportable &p, SUMOTime t, OutputDevice &os) const
Called for writing the events output (end of an action)
const MSLane & getLane() const
Returns the lane this stop is located at.
const std::string & getID() const
Returns the name of the vehicle type.
A lane area vehicles can halt at.
double computeAverageSpeed() const
const MSEdge * getDestination() const
Returns the current destination.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static int canTraverse(int dir, const ConstMSEdgeVector &route)
static const int BACKWARD
Representation of a lane in the micro simulation.
const std::string DEFAULT_PEDTYPE_ID
const std::string & getNextEdge() const
return the list of internal edges if this person is walking and the pedestrian model allows it
~MSPersonStage_Access()
destructor
void tripInfoOutput(OutputDevice &os, const MSTransportable *const transportable) const
Called on writing tripinfo output.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
void appendStage(Stage *stage, int next=-1)
Appends the given stage to the current plan.
double getEndLanePosition() const
Returns the end position of this stop.
Static storage of an output device and its base (abstract) implementation.
MSStoppingPlace * myDestinationStop
the stop to reach by getting transported (if any)
static const Position INVALID
used to indicate that a position is valid
MSPersonStage_Driving(const MSEdge *destination, MSStoppingPlace *toStop, const double arrivalPos, const std::vector< std::string > &lines, const std::string &intendedVeh="", SUMOTime intendedDepart=-1)
constructor
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
const SUMOVehicleParameter * myParameter
the plan of the transportable
void removeWaiting(const MSEdge *const edge, const SUMOVehicle *vehicle)
Removes a vehicle from the list of waiting vehicles for the given edge.
void postProcessRemoteControl(MSPerson *p)
virtual void erase(MSTransportable *transportable)
removes a single transportable
The simulated network and simulation perfomer.
double getBeginLanePosition() const
Returns the begin position of this stop.
~MSPersonStage_Walking()
destructor
MSInsertionControl & getInsertionControl()
Returns the insertion control.
std::string getStageDescription() const
returns the stage description as a string
MSPersonStage_Walking(const std::string &personID, const ConstMSEdgeVector &route, MSStoppingPlace *toStop, SUMOTime walkingTime, double speed, double departPos, double arrivalPos, double departPosLat)
constructor
Representation of a vehicle.
std::vector< const MSEdge * > ConstMSEdgeVector
std::string getStageSummary() const
return string summary of the current stage
static OptionsCont & getOptions()
Retrieves the options.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
void removeTransportable(MSTransportable *p)
Removes a transportable from this stop.
virtual void addPerson(MSTransportable *p) const
void setRemoteControlled(Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, const ConstMSEdgeVector &route, SUMOTime t)
virtual void setArrived(MSNet *net, MSTransportable *transportable, SUMOTime now)
logs end of the step
virtual double getEdgePos(SUMOTime now) const
Structure representing possible vehicle parameter.
virtual bool proceed(MSNet *net, SUMOTime time)=0
SUMOTime execute(SUMOTime currentTime)
Executes the command.
const MSEdge * getFromEdge() const
StageType getStageType(int next) const
the stage type for the nth next stage
StageType getCurrentStageType() const
the current stage type of the transportable
virtual void tripInfoOutput(OutputDevice &os, const MSTransportable *const transportable) const
Called on writing tripinfo output.
const MSEdge * getDestination() const
returns the destination edge
Something on a lane to be noticed about vehicle movement.
static void addPedestrianData(double walkLength, SUMOTime walkDuration, SUMOTime walkTimeLoss)
record tripinfo data for pedestrians
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Changes the wished person speed and position.
virtual const MSEdge * getEdge() const
Returns the current edge.
virtual double getSpeedFactor() const
the current speed factor of the transportable (where applicable)
double walkDistance() const
compute total walking distance
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
const MSJunction * getFromJunction() const
const MSEdge * getEdge() const
Returns the current edge.
Influencer & getInfluencer()
Returns the velocity/lane influencer.
double getSpeed() const
the speed of the transportable
virtual void proceed(MSNet *net, MSTransportable *person, SUMOTime now, Stage *previous)
proceeds to the next step
SUMOTime getWaitingTime(SUMOTime now) const
the time this transportable spent waiting
virtual void tripInfoOutput(OutputDevice &os) const
Called on writing tripinfo output.
MSTransportable::Stage * getCurrentStage() const
Return the current stage.
virtual void beginEventOutput(const MSTransportable &p, SUMOTime t, OutputDevice &os) const
Called for writing the events output.
void abort(MSTransportable *)
abort this stage (TraCI)
bool isRemoteAffected(SUMOTime t) const
const std::vector< MSMoveReminder * > & getMoveReminders() const
Return the list of this lane's move reminders.
double getMaxSpeed() const
Returns the vehicle's maximum speed.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
virtual PedestrianState * add(MSPerson *person, MSPerson::MSPersonStage_Walking *stage, SUMOTime now)=0
register the given person as a pedestrian
std::string getStageSummary() const
return string summary of the current stage
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
double getLength() const
Returns the lane's length.
~MSPersonStage_Driving()
destructor
double getMaxSpeed(const MSTransportable *const person) const
accessors to be used by MSPModel
A point in 2D or 3D with translation and scaling methods.
Position getPosition(SUMOTime now) const
returns the position of the transportable
Position getPosition(SUMOTime now) const
returns the position of the transportable
std::string getStageSummary() const
return string summary of the current stage
std::string time2string(SUMOTime t)
bool isWaiting4Vehicle() const
Whether the transportable waits for a vehicle.
virtual void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
void setSpeed(double speed)
sets the walking speed (ignored in other stages)
A road/street connecting two junctions.
The departure is person triggered.
void add(SUMOVehicle *veh)
Adds a single vehicle for departure.
const MSJunction * getToJunction() const
virtual const MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for Stage_Trip
double getAccessDistance(const MSEdge *edge) const
the distance from the access on the given edge to the stop, -1 on failure
MSPersonStage_Access(const MSEdge *destination, MSStoppingPlace *toStop, const double arrivalPos, const double dist, const bool isExit)
constructor
The vehicle has departed (was inserted into the network)
const double myChosenSpeedFactor
double getAngle(SUMOTime now) const
returns the angle of the transportable
StageType getStageType() const
virtual void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag tag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
virtual void removePerson(MSTransportable *p) const
virtual void remove(PedestrianState *state)=0
remove the specified person from the pedestrian simulation
MSEdge & getEdge() const
Returns the lane's edge.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
static DummyState myDummyState
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
const PositionVector & getShape() const
Returns this lane's shape.
MSPerson(const SUMOVehicleParameter *pars, MSVehicleType *vtype, MSTransportable::MSTransportablePlan *plan, const double speedFactor)
constructor
std::vector< MSTransportable::Stage * > MSTransportablePlan
the structure holding the plan of a transportable
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
virtual MSTransportableControl & getPersonControl()
Returns the person control.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
The vehicle arrived at its destination (is deleted)
virtual void proceed(MSNet *net, MSTransportable *person, SUMOTime now, Stage *previous)
proceeds to the next step
double getArrivalPos() const
returns the final arrival pos
bool moveToNextEdge(MSPerson *person, SUMOTime currentTime, MSEdge *nextInternal=nullptr)
move forward and return whether the person arrived
PositionVector reverse() const
reverse position vector
const MSVehicleType & getVehicleType() const
Returns the vehicle's type.
MSTransportable::Stage * getNextStage(int next) const
Return the current stage.
bool hasArrived() const
return whether the person has reached the end of its plan
void addWaiting(const MSEdge *edge, MSTransportable *person)
adds a transportable to the list of transportables waiting for a vehicle on the specified edge
static const int UNDEFINED_DIRECTION
SUMOTime getDesiredDepart() const
Returns the desired departure time.
void lf()
writes a line feed if applicable
const MSEdge * getNextEdgePtr() const
returns the next edge ptr if this person is walking and the pedestrian model allows it
const std::string & getID() const
returns the id of the transportable
double getAccessPos(const MSEdge *edge) const
the position on the given edge which is connected to this stop, -1 on failure
static std::string emptyString
An empty string.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
double getMaxSpeed() const
Get vehicle's maximum speed [m/s].
double getWaitingPositionOnLane(MSTransportable *t) const
Returns the lane position corresponding to getWaitPosition()
static MSPModel * getModel()
MSTransportablePlan::iterator myStep
the iterator over the route
virtual void moveToXY(MSPerson *p, Position pos, MSLane *lane, double lanePos, double lanePosLat, double angle, int routeOffset, const ConstMSEdgeVector &edges, SUMOTime t)
try to move person to the given position
virtual Position getWaitPosition(MSTransportable *person) const
Returns the next free waiting place for pedestrians / containers.
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
void removeStage(int next)
removes the nth next stage
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
MSTransportablePlan * myPlan
the plan of the transportable
SUMOVehicle * getWaitingVehicle(MSTransportable *transportable, const MSEdge *const edge, const double position)
const MSEdge * getFromEdge() const
Returns the departure edge.
const MSEdge * getEdge() const
Returns the current edge.
void reroute(ConstMSEdgeVector &newEdges, double departPos, int firstIndex, int nextIndex)
set new walk and replace the stages with relative indices in the interval [firstIndex,...
virtual ~MSPerson()
destructor
ConstMSEdgeVector getEdges() const
the edges of the current stage
double getAngle(SUMOTime now) const
returns the angle of the transportable
double getEdgePos(SUMOTime now) const
const std::string & getID() const
Returns the id.
static void addRideData(double rideLength, SUMOTime rideDuration, SUMOVehicleClass vClass, const std::string &line, SUMOTime waitingTime)
record tripinfo data for rides
The vehicle arrived at a junction.
virtual bool usingInternalLanes()=0
whether movements on intersections are modelled
void setRouteIndex(MSPerson *person, int routeOffset)
place person on a previously passed edge
bool isRemoteControlled() const
virtual const MSEdge * getNextEdge(const MSPerson::MSPersonStage_Walking &stage) const =0
return the list of internal edges if the pedestrian is on an intersection
static double interpretEdgePos(double pos, double maximumValue, SumoXMLAttr attr, const std::string &id)
Interprets negative edge positions and fits them onto a given edge.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
std::string getStageDescription() const
returns the stage description as a string
bool proceed(MSNet *net, SUMOTime time)
Influencer * myInfluencer
An instance of a speed/position influencing instance; built in "getInfluencer".
void unregisterOneWaiting(const bool isPerson)
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
virtual void tripInfoOutput(OutputDevice &os, const MSTransportable *const transportable) const
Called on writing tripinfo output.
virtual void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
virtual void proceed(MSNet *net, MSTransportable *person, SUMOTime now, Stage *previous)
proceeds to the next step
PedestrianState * getPedestrianState() const