Added flag to show trigger boxes for traffic signs

This commit is contained in:
bernatx 2019-03-28 18:21:43 +01:00 committed by nsubiron
parent 30cc42686b
commit a821963ccf
1 changed files with 42 additions and 26 deletions

View File

@ -168,6 +168,20 @@ class Util(object):
@staticmethod
def length(v):
return math.sqrt(v.x**2 + v.y**2 + v.z**2)
@staticmethod
def get_bounding_box(actor):
bb = actor.trigger_volume.extent
corners = [carla.Location(x=-bb.x, y=-bb.y),
carla.Location(x=bb.x, y=-bb.y),
carla.Location(x=bb.x, y=bb.y),
carla.Location(x=-bb.x, y=bb.y),
carla.Location(x=-bb.x, y=-bb.y)]
corners = [x + actor.trigger_volume.location for x in corners]
t = actor.get_transform()
t.transform(corners)
return corners
# ==============================================================================
# -- ModuleManager -------------------------------------------------------------
# ==============================================================================
@ -417,9 +431,10 @@ class TrafficLightSurfaces(object):
class MapImage(object):
def __init__(self, carla_world, carla_map, pixels_per_meter=10):
def __init__(self, carla_world, carla_map, pixels_per_meter=10, show_triggers=False):
self._pixels_per_meter = pixels_per_meter
self.scale = 1.0
self.show_triggers = show_triggers
waypoints = carla_map.generate_waypoints(2)
margin = 50
@ -533,7 +548,8 @@ class MapImage(object):
world_to_pixel(x) for x in [
left, start, right]], 4)
def draw_stop(surface, font_surface, transform, color=COLOR_ALUMINIUM_2):
def draw_traffic_signs(surface, font_surface, actor, color=COLOR_ALUMINIUM_2, trigger_color=COLOR_CHAMELEON_0):
transform = actor.get_transform()
waypoint = carla_map.get_waypoint(transform.location)
angle = -waypoint.transform.rotation.yaw - 90.0
@ -553,6 +569,13 @@ class MapImage(object):
line_pixel = [world_to_pixel(p) for p in line]
pygame.draw.lines(surface, color, True, line_pixel, 2)
# draw bounding box
if self.show_triggers:
corners = Util.get_bounding_box(actor)
corners = [world_to_pixel(p) for p in corners]
pygame.draw.lines(surface, trigger_color, True, corners, 2)
def lateral_shift(transform, shift):
transform.rotation.yaw += 90
return transform.location + shift * transform.get_forward_vector()
@ -612,8 +635,8 @@ class MapImage(object):
font_size = world_to_pixel_width(1)
font = pygame.font.SysFont('Arial', font_size, True)
stops_transform = [actor.get_transform() for actor in actors if 'stop' in actor.type_id]
yields_transform = [actor.get_transform() for actor in actors if 'yield' in actor.type_id]
stops = [actor for actor in actors if 'stop' in actor.type_id]
yields = [actor for actor in actors if 'yield' in actor.type_id]
stop_font_surface = font.render("STOP", False, COLOR_ALUMINIUM_2)
stop_font_surface = pygame.transform.scale(stop_font_surface, (stop_font_surface.get_width(), stop_font_surface.get_height() * 2))
@ -621,11 +644,11 @@ class MapImage(object):
yield_font_surface = font.render("YIELD", False, COLOR_ALUMINIUM_2)
yield_font_surface = pygame.transform.scale(yield_font_surface, (yield_font_surface.get_width(), yield_font_surface.get_height() * 2))
for ts_stop in stops_transform:
draw_stop(map_surface, stop_font_surface, ts_stop)
for ts_stop in stops:
draw_traffic_signs(map_surface, stop_font_surface, ts_stop)
for ts_yield in yields_transform:
draw_stop(map_surface, yield_font_surface, ts_yield)
for ts_yield in yields:
draw_traffic_signs(map_surface, yield_font_surface, ts_yield)
def world_to_pixel(self, location, offset=(0, 0)):
x = self.scale * self._pixels_per_meter * (location.x - self._world_offset[0])
@ -643,7 +666,7 @@ class MapImage(object):
class ModuleWorld(object):
def __init__(self, name, host, port, map_name, timeout, actor_filter, no_rendering=True):
def __init__(self, name, host, port, map_name, timeout, actor_filter, no_rendering=True, show_triggers=False):
self.client = None
self.name = name
self.host = host
@ -654,7 +677,7 @@ class ModuleWorld(object):
self.no_rendering = no_rendering
self.server_fps = 0.0
self.simulation_time = 0
self.show_triggers = show_triggers
self.server_clock = pygame.time.Clock()
# World data
@ -712,7 +735,7 @@ class ModuleWorld(object):
self.world.apply_settings(settings)
# Create Surfaces
self.map_image = MapImage(self.world, self.town_map, PIXELS_PER_METER)
self.map_image = MapImage(self.world, self.town_map, PIXELS_PER_METER, self.show_triggers)
# Store necessary modules
self.module_hud = module_manager.get_module(MODULE_HUD)
@ -873,26 +896,14 @@ class ModuleWorld(object):
return (vehicles, traffic_lights, speed_limits, walkers)
def get_bounding_box(self, actor):
bb = actor.trigger_volume.extent
corners = [carla.Location(x=-bb.x, y=-bb.y),
carla.Location(x=bb.x, y=-bb.y),
carla.Location(x=bb.x, y=bb.y),
carla.Location(x=-bb.x, y=bb.y),
carla.Location(x=-bb.x, y=-bb.y)]
corners = [x + actor.trigger_volume.location for x in corners]
t = actor.get_transform()
t.transform(corners)
return corners
def _render_traffic_lights(self, surface, list_tl, world_to_pixel):
self.affected_traffic_light = None
for tl in list_tl:
world_pos = tl.get_location()
pos = world_to_pixel(world_pos)
if self.hero_actor is not None and hasattr(tl, 'trigger_volume'):
corners = self.get_bounding_box(tl)
if self.hero_actor is not None:
corners = Util.get_bounding_box(tl)
corners = [world_to_pixel(p) for p in corners]
tl_t = tl.get_transform()
@ -1253,7 +1264,8 @@ def game_loop(args):
args.map,
2.0,
args.filter,
args.no_rendering)
args.no_rendering,
args.show_triggers)
# Register Modules
module_manager.register_module(world_module)
@ -1321,6 +1333,10 @@ def main():
'--no-rendering',
action='store_true',
help='switch off server rendering')
argparser.add_argument(
'--show-triggers',
action='store_true',
help='show trigger boxes of traffic signs')
args = argparser.parse_args()
args.description = argparser.description