| 84 | # ============================================================================== |
| 85 | |
| 86 | class World(object): |
| 87 | def __init__(self, carla_world, hud, actor_filter): |
| 88 | self.world = carla_world |
| 89 | self.map = self.world.get_map() |
| 90 | self.hud = hud |
| 91 | self.player = None |
| 92 | self.collision_sensor = None |
| 93 | self.lane_invasion_sensor = None |
| 94 | self.gnss_sensor = None |
| 95 | self.camera_manager = None |
| 96 | self._weather_presets = find_weather_presets() |
| 97 | self._weather_index = 0 |
| 98 | self._actor_filter = actor_filter |
| 99 | self.restart() |
| 100 | self.world.on_tick(hud.on_world_tick) |
| 101 | self.recording_enabled = False |
| 102 | self.recording_start = 0 |
| 103 | |
| 104 | def restart(self): |
| 105 | # Keep same camera config if the camera manager exists. |
| 106 | cam_index = self.camera_manager.index if self.camera_manager is not None else 0 |
| 107 | cam_pos_index = self.camera_manager.transform_index if self.camera_manager is not None else 0 |
| 108 | # Get a random blueprint. |
| 109 | blueprint = random.choice(self.world.get_blueprint_library().filter(self._actor_filter)) |
| 110 | blueprint.set_attribute('role_name', 'hero') |
| 111 | if blueprint.has_attribute('color'): |
| 112 | color = random.choice(blueprint.get_attribute('color').recommended_values) |
| 113 | blueprint.set_attribute('color', color) |
| 114 | # Spawn the player. |
| 115 | if self.player is not None: |
| 116 | spawn_point = self.player.get_transform() |
| 117 | spawn_point.location.z += 2.0 |
| 118 | spawn_point.rotation.roll = 0.0 |
| 119 | spawn_point.rotation.pitch = 0.0 |
| 120 | self.destroy() |
| 121 | self.player = self.world.try_spawn_actor(blueprint, spawn_point) |
| 122 | while self.player is None: |
| 123 | spawn_points = self.map.get_spawn_points() |
| 124 | spawn_point = random.choice(spawn_points) if spawn_points else carla.Transform() |
| 125 | self.player = self.world.try_spawn_actor(blueprint, spawn_point) |
| 126 | # Set up the sensors. |
| 127 | self.collision_sensor = CollisionSensor(self.player, self.hud) |
| 128 | self.lane_invasion_sensor = LaneInvasionSensor(self.player, self.hud) |
| 129 | self.gnss_sensor = GnssSensor(self.player) |
| 130 | self.camera_manager = CameraManager(self.player, self.hud) |
| 131 | self.camera_manager.transform_index = cam_pos_index |
| 132 | self.camera_manager.set_sensor(cam_index, notify=False) |
| 133 | actor_type = get_actor_display_name(self.player) |
| 134 | self.hud.notification(actor_type) |
| 135 | |
| 136 | def next_weather(self, reverse=False): |
| 137 | self._weather_index += -1 if reverse else 1 |
| 138 | self._weather_index %= len(self._weather_presets) |
| 139 | preset = self._weather_presets[self._weather_index] |
| 140 | self.hud.notification('Weather: %s' % preset[1]) |
| 141 | self.player.get_world().set_weather(preset[0]) |
| 142 | |
| 143 | def tick(self, clock): |