SUMO - Simulation of Urban MObility
MSAbstractLaneChangeModel.h
Go to the documentation of this file.
1 /****************************************************************************/
11 // Interface for lane-change models
12 /****************************************************************************/
13 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
14 // Copyright (C) 2001-2015 DLR (http://www.dlr.de/) and contributors
15 /****************************************************************************/
16 //
17 // This file is part of SUMO.
18 // SUMO is free software: you can redistribute it and/or modify
19 // it under the terms of the GNU General Public License as published by
20 // the Free Software Foundation, either version 3 of the License, or
21 // (at your option) any later version.
22 //
23 /****************************************************************************/
24 #ifndef MSAbstractLaneChangeModel_h
25 #define MSAbstractLaneChangeModel_h
26 
27 // ===========================================================================
28 // included modules
29 // ===========================================================================
30 #ifdef _MSC_VER
31 #include <windows_config.h>
32 #else
33 #include <config.h>
34 #endif
35 
36 #include <microsim/MSVehicle.h>
37 
38 class MSLane;
39 
40 // ===========================================================================
41 // used enumeration
42 // ===========================================================================
49 
51  LCA_NONE = 0,
53  LCA_STAY = 1 << 0,
55  LCA_LEFT = 1 << 1,
57  LCA_RIGHT = 1 << 2,
58 
60  LCA_STRATEGIC = 1 << 3,
62  LCA_COOPERATIVE = 1 << 4,
64  LCA_SPEEDGAIN = 1 << 5,
66  LCA_KEEPRIGHT = 1 << 6,
68  LCA_TRACI = 1 << 7,
69 
71  LCA_URGENT = 1 << 8,
72 
76 
79 
84 
89 
90  // The vehicle is blocked being overlapping
91  LCA_OVERLAPPING = 1 << 13,
92 
98 
100 
101 };
102 
103 
104 
105 
106 
107 // ===========================================================================
108 // class definitions
109 // ===========================================================================
115 public:
116 
120  class MSLCMessager {
121  public:
127  MSLCMessager(MSVehicle* leader, MSVehicle* neighLead, MSVehicle* neighFollow)
128  : myLeader(leader), myNeighLeader(neighLead),
129  myNeighFollower(neighFollow) { }
130 
131 
134 
135 
141  void* informLeader(void* info, MSVehicle* sender) {
142  assert(myLeader != 0);
143  return myLeader->getLaneChangeModel().inform(info, sender);
144  }
145 
146 
152  void* informNeighLeader(void* info, MSVehicle* sender) {
153  assert(myNeighLeader != 0);
154  return myNeighLeader->getLaneChangeModel().inform(info, sender);
155  }
156 
157 
163  void* informNeighFollower(void* info, MSVehicle* sender) {
164  assert(myNeighFollower != 0);
165  return myNeighFollower->getLaneChangeModel().inform(info, sender);
166  }
167 
168 
169  private:
176 
177  };
178 
180  void static initGlobalOptions(const OptionsCont& oc);
181 
187 
192 
194  virtual ~MSAbstractLaneChangeModel();
195 
196  inline int getOwnState() const {
197  return myOwnState;
198  }
199 
200  inline void setOwnState(int state) {
201  myOwnState = state;
202  }
203 
204  virtual void prepareStep() { }
205 
210  virtual int wantsChange(
211  int laneOffset,
212  MSAbstractLaneChangeModel::MSLCMessager& msgPass, int blocked,
213  const std::pair<MSVehicle*, SUMOReal>& leader,
214  const std::pair<MSVehicle*, SUMOReal>& neighLead,
215  const std::pair<MSVehicle*, SUMOReal>& neighFollow,
216  const MSLane& neighLane,
217  const std::vector<MSVehicle::LaneQ>& preb,
218  MSVehicle** lastBlocked,
219  MSVehicle** firstBlocked) = 0;
220 
221  virtual void* inform(void* info, MSVehicle* sender) = 0;
222 
234  virtual SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max,
235  const MSCFModel& cfModel) = 0;
236 
237  virtual void changed(int dir) = 0;
238 
239  void unchanged() {
240  if (myLastLaneChangeOffset > 0) {
242  } else if (myLastLaneChangeOffset < 0) {
244  }
245  }
246 
251  return myShadowLane;
252  }
253 
254 
256  return myLastLaneChangeOffset;
257  }
258 
259 
261  inline bool isLaneChangeMidpointPassed() const {
263  }
264 
267  return myLaneChangeCompletion;
268  }
269 
271  inline bool isChangingLanes() const {
272  return myLaneChangeCompletion < (1 - NUMERICAL_EPS);
273  }
274 
276  inline int getLaneChangeDirection() const {
277  return myLaneChangeDirection;
278  }
279 
281  inline bool alreadyMoved() const {
282  return myAlreadyMoved;
283  }
284 
286  void resetMoved() {
287  myAlreadyMoved = false;
288  }
289 
290 
292  bool startLaneChangeManeuver(MSLane* source, MSLane* target, int direction);
293 
294 
295  /* @brief continue the lane change maneuver
296  * @param[in] moved Whether the vehicle has moved to a new lane
297  */
298  void continueLaneChangeManeuver(bool moved);
299 
300  /* @brief finish the lane change maneuver
301  */
302  inline void endLaneChangeManeuver() {
305  myShadowLane = 0;
306  }
307 
309  void removeLaneChangeShadow();
310 
312  virtual void saveBlockerLength(SUMOReal length) {
313  UNUSED_PARAMETER(length);
314  };
315 
316 protected:
317  virtual bool congested(const MSVehicle* const neighLeader);
318 
319  virtual bool predInteraction(const MSVehicle* const leader);
320 
322  bool cancelRequest(int state);
323 
324 
325 protected:
328 
331 
334 
337 
340 
343 
346 
349 
352 
353  /* @brief to be called by derived classes in their changed() method.
354  * If dir=0 is given, the current value remains unchanged */
355  void initLastLaneChangeOffset(int dir);
356 
359 
360 private:
361  /* @brief information how long ago the vehicle has performed a lane-change,
362  * sign indicates direction of the last change
363  */
365 
366 
367 
368 private:
371 };
372 
373 
374 #endif
375 
376 /****************************************************************************/
377 
No action desired.
MSAbstractLaneChangeModel(MSVehicle &v)
Constructor.
bool myHaveShadow
Wether a vehicle shadow exists.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:80
#define min(a, b)
Definition: polyfonts.c:66
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
virtual void * inform(void *info, MSVehicle *sender)=0
The action is done to help someone else.
MSVehicle * myNeighLeader
The leader on the lane the vehicle want to change to.
The car-following model abstraction.
Definition: MSCFModel.h:59
void * informNeighFollower(void *info, MSVehicle *sender)
Informs the follower on the desired lane.
MSLCMessager(MSVehicle *leader, MSVehicle *neighLead, MSVehicle *neighFollow)
Constructor.
virtual bool predInteraction(const MSVehicle *const leader)
MSLane * myShadowLane
The lane the vehicle shadow is on during a continuous lane change.
The action is due to a TraCI request.
The action is urgent (to be defined by lc-model)
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:39
MSAbstractLaneChangeModel & getLaneChangeModel()
Definition: MSVehicle.cpp:1884
MSVehicle * myNeighFollower
The follower on the lane the vehicle want to change to.
static bool myAllowOvertakingRight
whether overtaking on the right is permitted
A class responsible for exchanging messages between cars involved in lane-change interaction.
LaneChangeModel
Wants go to the left.
#define max(a, b)
Definition: polyfonts.c:65
bool cancelRequest(int state)
whether the influencer cancels the given request
void removeLaneChangeShadow()
remove the shadow copy of a lane change maneuver
bool alreadyMoved() const
reset the flag whether a vehicle already moved to false
bool myLaneChangeMidpointPassed
whether myLane has already been set to the target of the lane-change maneuver
The vehicle is blocked by left follower.
int myLaneChangeDirection
direction of the lane change maneuver -1 means right, 1 means left
static void initGlobalOptions(const OptionsCont &oc)
init global model parameters
MSLane * getShadowLane() const
Returns the lane the vehicles shadow is on during continuouss lane change.
int myOwnState
The current state of the vehicle.
bool myAlreadyMoved
whether the vehicle has already moved this step
SUMOReal getLaneChangeCompletion() const
return whether the vehicle passed the midpoint of a continuous lane change maneuver ...
Wants go to the right.
LaneChangeAction
A try to store the state of a vehicle's lane-change wish in an int.
virtual void saveBlockerLength(SUMOReal length)
reserve space at the end of the lane to avoid dead locks
bool startLaneChangeManeuver(MSLane *source, MSLane *target, int direction)
start the lane change maneuver and return whether it continues
MSAbstractLaneChangeModel & operator=(const MSAbstractLaneChangeModel &s)
Invalidated assignment operator.
MSVehicle & myVehicle
The vehicle this lane-changer belongs to.
void * informNeighLeader(void *info, MSVehicle *sender)
Informs the leader on the desired lane.
The action is needed to follow the route (navigational lc)
bool isLaneChangeMidpointPassed() const
return whether the vehicle passed the midpoint of a continuous lane change maneuver ...
void * informLeader(void *info, MSVehicle *sender)
Informs the leader on the same lane.
The action is due to the default of keeping right "Rechtsfahrgebot".
A storage for options typed value containers)
Definition: OptionsCont.h:108
virtual SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)=0
Called to adapt the speed in order to allow a lane change.
Needs to stay on the current lane.
int SUMOTime
Definition: SUMOTime.h:43
void resetMoved()
reset the flag whether a vehicle already moved to false
virtual void changed(int dir)=0
#define SUMOReal
Definition: config.h:218
The vehicle is blocked by right follower.
#define NUMERICAL_EPS
Definition: config.h:162
virtual int wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, SUMOReal > &leader, const std::pair< MSVehicle *, SUMOReal > &neighLead, const std::pair< MSVehicle *, SUMOReal > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked)=0
Called to examine whether the vehicle wants to change using the given laneOffset. This method gets th...
#define DELTA_T
Definition: SUMOTime.h:50
The vehicle is blocked by left leader.
SUMOReal myLaneChangeCompletion
progress of the lane change maneuver 0:started, 1:complete
static MSAbstractLaneChangeModel * build(LaneChangeModel lcm, MSVehicle &vehicle)
Factory method for instantiating new lane changing models.
Representation of a lane in the micro simulation.
Definition: MSLane.h:77
const MSCFModel & myCarFollowModel
The vehicle's car following model.
The vehicle is blocked by right leader.
Interface for lane-change models.
MSVehicle * myLeader
The leader on the informed vehicle's lane.
int getLaneChangeDirection() const
return the direction of the current lane change maneuver
virtual bool congested(const MSVehicle *const neighLeader)
The action is due to the wish to be faster (tactical lc)
virtual ~MSAbstractLaneChangeModel()
Destructor.