SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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-sim.org/
14 // Copyright (C) 2001-2013 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 "MSVehicle.h"
37 class MSLane;
38 
39 // ===========================================================================
40 // used enumeration
41 // ===========================================================================
48 
50  LCA_NONE = 0,
52  LCA_STAY = 1 << 0,
54  LCA_LEFT = 1 << 1,
56  LCA_RIGHT = 1 << 2,
57 
59  LCA_STRATEGIC = 1 << 3,
61  LCA_COOPERATIVE = 1 << 4,
63  LCA_SPEEDGAIN = 1 << 5,
65  LCA_KEEPRIGHT = 1 << 6,
67  LCA_TRACI = 1 << 7,
68 
70  LCA_URGENT = 1 << 8,
71 
75 
78 
83 
88 
89  // The vehicle is blocked being overlapping
90  LCA_OVERLAPPING = 1 << 13,
91 
97 
99 
100 };
101 
102 
103 
104 
105 
106 // ===========================================================================
107 // class definitions
108 // ===========================================================================
114 public:
115 
119  class MSLCMessager {
120  public:
126  MSLCMessager(MSVehicle* leader, MSVehicle* neighLead, MSVehicle* neighFollow)
127  : myLeader(leader), myNeighLeader(neighLead),
128  myNeighFollower(neighFollow) { }
129 
130 
133 
134 
140  void* informLeader(void* info, MSVehicle* sender) {
141  assert(myLeader != 0);
142  return myLeader->getLaneChangeModel().inform(info, sender);
143  }
144 
145 
151  void* informNeighLeader(void* info, MSVehicle* sender) {
152  assert(myNeighLeader != 0);
153  return myNeighLeader->getLaneChangeModel().inform(info, sender);
154  }
155 
156 
162  void* informNeighFollower(void* info, MSVehicle* sender) {
163  assert(myNeighFollower != 0);
164  return myNeighFollower->getLaneChangeModel().inform(info, sender);
165  }
166 
167 
168  private:
175 
176  };
177 
183 
188 
190  virtual ~MSAbstractLaneChangeModel();
191 
192  inline int getOwnState() const {
193  return myOwnState;
194  }
195 
196  inline void setOwnState(int state) {
197  myOwnState = state;
198  }
199 
200  virtual void prepareStep() { }
201 
206  virtual int wantsChange(
207  int laneOffset,
208  MSAbstractLaneChangeModel::MSLCMessager& msgPass, int blocked,
209  const std::pair<MSVehicle*, SUMOReal>& leader,
210  const std::pair<MSVehicle*, SUMOReal>& neighLead,
211  const std::pair<MSVehicle*, SUMOReal>& neighFollow,
212  const MSLane& neighLane,
213  const std::vector<MSVehicle::LaneQ>& preb,
214  MSVehicle** lastBlocked,
215  MSVehicle** firstBlocked) = 0;
216 
217  virtual void* inform(void* info, MSVehicle* sender) = 0;
218 
230  virtual SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max,
231  const MSCFModel& cfModel) = 0;
232 
233  virtual void changed() = 0;
234 
235  void unchanged() {
237  }
238 
243  return myShadowLane;
244  }
245 
246 
248  return myLastLaneChangeOffset;
249  }
250 
251 
253  inline bool isLaneChangeMidpointPassed() const {
255  }
256 
259  return myLaneChangeCompletion;
260  }
261 
263  inline bool isChangingLanes() const {
264  return myLaneChangeCompletion < (1 - NUMERICAL_EPS);
265  }
266 
268  inline int getLaneChangeDirection() const {
269  return myLaneChangeDirection;
270  }
271 
273  inline bool alreadyMoved() const {
274  return myAlreadyMoved;
275  }
276 
278  void resetMoved() {
279  myAlreadyMoved = false;
280  }
281 
282 
284  bool startLaneChangeManeuver(MSLane* source, MSLane* target, int direction);
285 
286 
287  /* @brief continue the lane change maneuver
288  * @param[in] moved Whether the vehicle has moved to a new lane
289  */
290  void continueLaneChangeManeuver(bool moved);
291 
292  /* @brief finish the lane change maneuver
293  */
294  inline void endLaneChangeManeuver() {
297  myShadowLane = 0;
298  }
299 
301  void removeLaneChangeShadow();
302 
304  virtual void saveBlockerLength(SUMOReal length) {
305  UNUSED_PARAMETER(length);
306  };
307 
308 protected:
309  virtual bool congested(const MSVehicle* const neighLeader);
310 
311  virtual bool predInteraction(const MSVehicle* const leader);
312 
313 
314 protected:
317 
320 
323 
326 
329 
332 
335 
338 
341 
344 
345 private:
348 };
349 
350 
351 #endif
352 
353 /****************************************************************************/
354