Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions flow/core/kernel/simulation/traci.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,13 @@ def pass_api(self, kernel_api):
# subscribe some simulation parameters needed to check for entering,
# exiting, and colliding vehicles
self.kernel_api.simulation.subscribe([
tc.VAR_DEPARTED_VEHICLES_IDS, tc.VAR_ARRIVED_VEHICLES_IDS,
tc.VAR_TELEPORT_STARTING_VEHICLES_IDS, tc.VAR_TIME_STEP,
tc.VAR_DELTA_T
tc.VAR_DEPARTED_VEHICLES_IDS,
tc.VAR_ARRIVED_VEHICLES_IDS,
tc.VAR_TELEPORT_STARTING_VEHICLES_IDS,
tc.VAR_TIME_STEP,
tc.VAR_DELTA_T,
tc.VAR_LOADED_VEHICLES_NUMBER,
tc.VAR_DEPARTED_VEHICLES_NUMBER
])

def simulation_step(self):
Expand Down
7 changes: 7 additions & 0 deletions flow/core/kernel/vehicle/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,13 @@ def get_departed_ids(self):
"""Return the ids of vehicles that departed in the last time step."""
raise NotImplementedError

def get_num_not_departed(self):
"""Return the number of vehicles not departed in the last time step.

This includes vehicles that were loaded but not departed.
"""
raise NotImplementedError

def get_speed(self, veh_id, error=-1001):
"""Return the speed of the specified vehicle.

Expand Down
37 changes: 29 additions & 8 deletions flow/core/kernel/vehicle/traci.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
STEPS = 10
rdelta = 255 / STEPS
# smoothly go from red to green as the speed increases
color_bins = [[int(255 - rdelta * i), int(rdelta * i), 0] for i in range(STEPS + 1)]
color_bins = [[int(255 - rdelta * i), int(rdelta * i), 0] for i in
range(STEPS + 1)]


class TraCIVehicle(KernelVehicle):
Expand Down Expand Up @@ -56,6 +57,8 @@ def __init__(self,
self.num_vehicles = 0
# number of rl vehicles in the network
self.num_rl_vehicles = 0
# number of vehicles loaded but not departed vehicles
self.num_not_departed = 0

# contains the parameters associated with each type of vehicle
self.type_parameters = {}
Expand Down Expand Up @@ -101,6 +104,7 @@ def initialize(self, vehicles):
self.minGap = vehicles.minGap
self.num_vehicles = 0
self.num_rl_vehicles = 0
self.num_not_departed = 0

self.__vehicles.clear()
for typ in vehicles.initial:
Expand Down Expand Up @@ -183,11 +187,12 @@ def update(self, reset):
self._departed_ids.clear()
self._arrived_ids.clear()
self._arrived_rl_ids.clear()
self.num_not_departed = 0

# add vehicles from a network template, if applicable
if hasattr(self.master_kernel.network.network,
"template_vehicles"):
for veh_id in self.master_kernel.network.network.\
for veh_id in self.master_kernel.network.network. \
template_vehicles:
vals = deepcopy(self.master_kernel.network.network.
template_vehicles[veh_id])
Expand All @@ -212,6 +217,10 @@ def update(self, reset):
self._departed_ids.append(sim_obs[tc.VAR_DEPARTED_VEHICLES_IDS])
self._arrived_ids.append(sim_obs[tc.VAR_ARRIVED_VEHICLES_IDS])

# update the number of not departed vehicles
self.num_not_departed += sim_obs[tc.VAR_LOADED_VEHICLES_NUMBER] - \
sim_obs[tc.VAR_DEPARTED_VEHICLES_NUMBER]

# update the "headway", "leader", and "follower" variables
for veh_id in self.__ids:
try:
Expand Down Expand Up @@ -321,8 +330,12 @@ def _add_departed(self, veh_id, veh_type):

# subscribe the new vehicle
self.kernel_api.vehicle.subscribe(veh_id, [
tc.VAR_LANE_INDEX, tc.VAR_LANEPOSITION, tc.VAR_ROAD_ID,
tc.VAR_SPEED, tc.VAR_EDGES, tc.VAR_POSITION, tc.VAR_ANGLE,
tc.VAR_LANE_INDEX, tc.VAR_LANEPOSITION,
tc.VAR_ROAD_ID,
tc.VAR_SPEED,
tc.VAR_EDGES,
tc.VAR_POSITION,
tc.VAR_ANGLE,
tc.VAR_SPEED_WITHOUT_TRACI
])
self.kernel_api.vehicle.subscribeLeader(veh_id, 2000)
Expand Down Expand Up @@ -523,6 +536,10 @@ def get_departed_ids(self):
else:
return 0

def get_num_not_departed(self):
"""See parent class."""
return self.num_not_departed

def get_previous_speed(self, veh_id, error=-1001):
"""See parent class."""
if isinstance(veh_id, (list, np.ndarray)):
Expand Down Expand Up @@ -1007,7 +1024,8 @@ def update_vehicle_colors(self):
for veh_id in self.get_rl_ids():
try:
# If vehicle is already being colored via argument to vehicles.add(), don't re-color it.
if self._force_color_update or 'color' not in self.type_parameters[self.get_type(veh_id)]:
if self._force_color_update or 'color' not in \
self.type_parameters[self.get_type(veh_id)]:
# color rl vehicles red
self.set_color(veh_id=veh_id, color=RED)
except (FatalTraCIError, TraCIException) as e:
Expand All @@ -1018,7 +1036,8 @@ def update_vehicle_colors(self):
try:
color = CYAN if veh_id in self.get_observed_ids() else WHITE
# If vehicle is already being colored via argument to vehicles.add(), don't re-color it.
if self._force_color_update or 'color' not in self.type_parameters[self.get_type(veh_id)]:
if self._force_color_update or 'color' not in \
self.type_parameters[self.get_type(veh_id)]:
self.set_color(veh_id=veh_id, color=color)
except (FatalTraCIError, TraCIException) as e:
print('Error when updating human vehicle colors:', e)
Expand All @@ -1028,7 +1047,8 @@ def update_vehicle_colors(self):
if 'av' in veh_id:
color = RED
# If vehicle is already being colored via argument to vehicles.add(), don't re-color it.
if self._force_color_update or 'color' not in self.type_parameters[self.get_type(veh_id)]:
if self._force_color_update or 'color' not in \
self.type_parameters[self.get_type(veh_id)]:
self.set_color(veh_id=veh_id, color=color)
except (FatalTraCIError, TraCIException) as e:
print('Error when updating human vehicle colors:', e)
Expand All @@ -1041,7 +1061,8 @@ def update_vehicle_colors(self):
veh_speed = self.get_speed(veh_id)
bin_index = np.digitize(veh_speed, speed_ranges)
# If vehicle is already being colored via argument to vehicles.add(), don't re-color it.
if self._force_color_update or 'color' not in self.type_parameters[self.get_type(veh_id)]:
if self._force_color_update or 'color' not in \
self.type_parameters[self.get_type(veh_id)]:
self.set_color(veh_id=veh_id, color=color_bins[bin_index])

# clear the list of observed vehicles
Expand Down