18
18
19
19
20
20
class TrafficMode :
21
+ # Traffic vehicles will be spawned once
22
+ Basic = "basic"
23
+
21
24
# Traffic vehicles will be respawned, once they arrive at the destinations
22
25
Respawn = "respawn"
23
26
24
- # Traffic vehicles will be triggered only once
27
+ # Traffic vehicles will be triggered only once, and will be triggered when agent comes close
25
28
Trigger = "trigger"
26
29
27
30
# Hybrid, some vehicles are triggered once on map and disappear when arriving at destination, others exist all time
@@ -63,13 +66,15 @@ def reset(self):
63
66
if abs (traffic_density ) < 1e-2 :
64
67
return
65
68
self .respawn_lanes = self ._get_available_respawn_lanes (map )
66
- if self .mode == TrafficMode .Respawn :
67
- # add respawn vehicle
68
- self ._create_respawn_vehicles (map , traffic_density )
69
- elif self .mode == TrafficMode .Trigger or self .mode == TrafficMode .Hybrid :
70
- self ._create_vehicles_once (map , traffic_density )
69
+
70
+ logging .debug (f"Resetting Traffic Manager with mode { self .mode } and density { traffic_density } " )
71
+
72
+ if self .mode in {TrafficMode .Basic , TrafficMode .Respawn }:
73
+ self ._create_basic_vehicles (map , traffic_density )
74
+ elif self .mode in {TrafficMode .Trigger , TrafficMode .Hybrid }:
75
+ self ._create_trigger_vehicles (map , traffic_density )
71
76
else :
72
- raise ValueError ("No such mode named {}" . format ( self .mode ) )
77
+ raise ValueError (f "No such mode named { self .mode } " )
73
78
74
79
def before_step (self ):
75
80
"""
@@ -78,14 +83,15 @@ def before_step(self):
78
83
"""
79
84
# trigger vehicles
80
85
engine = self .engine
81
- if self .mode != TrafficMode .Respawn :
86
+ if self .mode in { TrafficMode .Trigger , TrafficMode . Hybrid } :
82
87
for v in engine .agent_manager .active_agents .values ():
83
88
if len (self .block_triggered_vehicles ) > 0 :
84
89
ego_lane_idx = v .lane_index [:- 1 ]
85
90
ego_road = Road (ego_lane_idx [0 ], ego_lane_idx [1 ])
86
91
if ego_road == self .block_triggered_vehicles [- 1 ].trigger_road :
87
92
block_vehicles = self .block_triggered_vehicles .pop ()
88
93
self ._traffic_vehicles += list (self .get_objects (block_vehicles .vehicles ).values ())
94
+
89
95
for v in self ._traffic_vehicles :
90
96
p = self .engine .get_policy (v .name )
91
97
v .before_step (p .act ())
@@ -99,17 +105,15 @@ def after_step(self, *args, **kwargs):
99
105
for v in self ._traffic_vehicles :
100
106
v .after_step ()
101
107
if not v .on_lane :
102
- if self .mode == TrafficMode .Trigger :
103
- v_to_remove .append (v )
104
- elif self .mode == TrafficMode .Respawn or self .mode == TrafficMode .Hybrid :
105
- v_to_remove .append (v )
106
- else :
107
- raise ValueError ("Traffic mode error: {}" .format (self .mode ))
108
+ v_to_remove .append (v )
109
+
108
110
for v in v_to_remove :
109
111
vehicle_type = type (v )
110
112
self .clear_objects ([v .id ])
111
113
self ._traffic_vehicles .remove (v )
112
- if self .mode == TrafficMode .Respawn or self .mode == TrafficMode .Hybrid :
114
+
115
+ # Spawn new vehicles to replace the removed one
116
+ if self .mode in {TrafficMode .Respawn , TrafficMode .Hybrid }:
113
117
lane = self .respawn_lanes [self .np_random .randint (0 , len (self .respawn_lanes ))]
114
118
lane_idx = lane .index
115
119
long = self .np_random .rand () * lane .length / 2
@@ -136,7 +140,7 @@ def get_vehicle_num(self):
136
140
Get the vehicles on road
137
141
:return:
138
142
"""
139
- if self .mode == TrafficMode .Respawn :
143
+ if self .mode in { TrafficMode .Basic , TrafficMode . Respawn } :
140
144
return len (self ._traffic_vehicles )
141
145
return sum (len (block_vehicle_set .vehicles ) for block_vehicle_set in self .block_triggered_vehicles )
142
146
@@ -151,7 +155,7 @@ def get_global_states(self) -> Dict:
151
155
traffic_states [vehicle .index ] = vehicle .get_state ()
152
156
153
157
# collect other vehicles
154
- if self .mode != TrafficMode .Respawn :
158
+ if self .mode in { TrafficMode .Trigger , TrafficMode . Hybrid } :
155
159
for v_b in self .block_triggered_vehicles :
156
160
for vehicle in v_b .vehicles :
157
161
traffic_states [vehicle .index ] = vehicle .get_state ()
@@ -188,7 +192,7 @@ def get_global_init_states(self) -> Dict:
188
192
vehicles [vehicle .index ] = init_state
189
193
190
194
# collect other vehicles
191
- if self .mode != TrafficMode .Respawn :
195
+ if self .mode in { TrafficMode .Trigger , TrafficMode . Hybrid } :
192
196
for v_b in self .block_triggered_vehicles :
193
197
for vehicle in v_b .vehicles :
194
198
init_state = vehicle .get_state ()
@@ -208,7 +212,7 @@ def _propose_vehicle_configs(self, lane: AbstractLane):
208
212
potential_vehicle_configs .append (random_vehicle_config )
209
213
return potential_vehicle_configs
210
214
211
- def _create_respawn_vehicles (self , map : BaseMap , traffic_density : float ):
215
+ def _create_basic_vehicles (self , map : BaseMap , traffic_density : float ):
212
216
total_num = len (self .respawn_lanes )
213
217
for lane in self .respawn_lanes :
214
218
_traffic_vehicles = []
@@ -227,7 +231,7 @@ def _create_respawn_vehicles(self, map: BaseMap, traffic_density: float):
227
231
self .add_policy (random_v .id , IDMPolicy , random_v , self .generate_seed ())
228
232
self ._traffic_vehicles .append (random_v )
229
233
230
- def _create_vehicles_once (self , map : BaseMap , traffic_density : float ) -> None :
234
+ def _create_trigger_vehicles (self , map : BaseMap , traffic_density : float ) -> None :
231
235
"""
232
236
Trigger mode, vehicles will be triggered only once, and disappear when arriving destination
233
237
:param map: Map
@@ -365,10 +369,10 @@ def set_state(self, state: dict, old_name_to_current=None):
365
369
366
370
367
371
class MixedPGTrafficManager (PGTrafficManager ):
368
- def _create_respawn_vehicles (self , * args , ** kwargs ):
372
+ def _create_basic_vehicles (self , * args , ** kwargs ):
369
373
raise NotImplementedError ()
370
374
371
- def _create_vehicles_once (self , map : BaseMap , traffic_density : float ) -> None :
375
+ def _create_trigger_vehicles (self , map : BaseMap , traffic_density : float ) -> None :
372
376
vehicle_num = 0
373
377
for block in map .blocks [1 :]:
374
378
0 commit comments