SUMO - Simulation of Urban MObility
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
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
// ===========================================================================
45
enum
LaneChangeAction
{
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
72
LCA_WANTS_LANECHANGE
=
LCA_LEFT
|
LCA_RIGHT
,
73
LCA_WANTS_LANECHANGE_OR_STAY
=
LCA_WANTS_LANECHANGE
|
LCA_STAY
,
75
78
80
LCA_BLOCKED_BY_LEFT_LEADER
= 1 << 9,
82
LCA_BLOCKED_BY_LEFT_FOLLOWER
= 1 << 10,
83
85
LCA_BLOCKED_BY_RIGHT_LEADER
= 1 << 11,
87
LCA_BLOCKED_BY_RIGHT_FOLLOWER
= 1 << 12,
88
89
// The vehicle is blocked being overlapping
90
LCA_OVERLAPPING
= 1 << 13,
91
92
LCA_BLOCKED_LEFT
=
LCA_BLOCKED_BY_LEFT_LEADER
|
LCA_BLOCKED_BY_LEFT_FOLLOWER
,
93
LCA_BLOCKED_RIGHT
=
LCA_BLOCKED_BY_RIGHT_LEADER
|
LCA_BLOCKED_BY_RIGHT_FOLLOWER
,
94
LCA_BLOCKED_BY_LEADER
=
LCA_BLOCKED_BY_LEFT_LEADER
|
LCA_BLOCKED_BY_RIGHT_LEADER
,
95
LCA_BLOCKED_BY_FOLLOWER
=
LCA_BLOCKED_BY_LEFT_FOLLOWER
|
LCA_BLOCKED_BY_RIGHT_FOLLOWER
,
96
LCA_BLOCKED
=
LCA_BLOCKED_LEFT
|
LCA_BLOCKED_RIGHT
97
99
100
};
101
102
103
104
105
106
// ===========================================================================
107
// class definitions
108
// ===========================================================================
113
class
MSAbstractLaneChangeModel
{
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
132
~MSLCMessager
() { }
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
:
170
MSVehicle
*
myLeader
;
172
MSVehicle
*
myNeighLeader
;
174
MSVehicle
*
myNeighFollower
;
175
176
};
177
182
static
MSAbstractLaneChangeModel
*
build
(
LaneChangeModel
lcm,
MSVehicle
& vehicle);
183
187
MSAbstractLaneChangeModel
(
MSVehicle
& v);
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
() {
236
myLastLaneChangeOffset
+=
DELTA_T
;
237
}
238
242
MSLane
*
getShadowLane
()
const
{
243
return
myShadowLane
;
244
}
245
246
247
inline
SUMOTime
getLastLaneChangeOffset
()
const
{
248
return
myLastLaneChangeOffset
;
249
}
250
251
253
inline
bool
isLaneChangeMidpointPassed
()
const
{
254
return
myLaneChangeMidpointPassed
;
255
}
256
258
inline
SUMOReal
getLaneChangeCompletion
()
const
{
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
() {
295
removeLaneChangeShadow
();
296
myLaneChangeCompletion
= 1;
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
:
316
MSVehicle
&
myVehicle
;
317
319
int
myOwnState
;
320
322
SUMOTime
myLastLaneChangeOffset
;
323
325
SUMOReal
myLaneChangeCompletion
;
326
328
int
myLaneChangeDirection
;
329
331
bool
myLaneChangeMidpointPassed
;
332
334
bool
myAlreadyMoved
;
335
337
MSLane
*
myShadowLane
;
338
340
bool
myHaveShadow
;
341
343
const
MSCFModel
&
myCarFollowModel
;
344
345
private
:
347
MSAbstractLaneChangeModel
&
operator=
(
const
MSAbstractLaneChangeModel
& s);
348
};
349
350
351
#endif
352
353
/****************************************************************************/
354
home
delphi
sumo
src
microsim
MSAbstractLaneChangeModel.h
Generated by
1.8.2