def spawn_npcs(carla_client: carla.Client, wpp: WaypointProvider = None, n=10, role_name_prefix='npc') -> List[BasicAgent]: world: carla.World = carla_client.get_world() vehicle_blueprints = world.get_blueprint_library().filter('vehicle.*') if not wpp: wpp = WaypointProvider(world) wpp.update(free_only=True) start_points: List[carla.Transform] = [] end_points: List[carla.Transform] = [] agent_ids: List[int] = [] agents: List[BasicAgent] = [] batch: List[carla.command.SpawnActor] = [] for i in range(n): blueprint = random.choice(vehicle_blueprints) blueprint.set_attribute('role_name', f'{role_name_prefix}_{i}') if blueprint.has_attribute('color'): color = random.choice( blueprint.get_attribute('color').recommended_values) blueprint.set_attribute('color', color) start_points.append(wpp.get()) end_points.append(wpp.get()) batch.append(carla.command.SpawnActor(blueprint, start_points[-1])) results = carla_client.apply_batch_sync(batch, True) for i in range(len(results)): if results[i].error: logging.error(results[i].error) else: agent_ids.append(results[i].actor_id) world.wait_for_tick() agent_actors: carla.ActorList = world.get_actors(agent_ids) for i, actor in enumerate(agent_actors): agent: BasicAgent = BasicAgent(actor, target_speed=NPC_TARGET_SPEED) try: agent.set_location_destination(end_points[i].location) agents.append(agent) except AttributeError: logging.error(f'Failed to spawn NPC actor with id {actor.id}.') return agents
def spawn_vehicles(amount: int, blueprints: list, client: carla.Client, spawn_points: List[carla.Transform]) -> list: """Spawns vehicles, based on spawn_npc.py""" assert amount >= 0 traffic_manager = client.get_trafficmanager() batch = [] vehicles = [] random.shuffle(spawn_points) for i, transform in enumerate(spawn_points): if i >= amount: break blueprint = random.choice(blueprints) if blueprint.has_attribute('color'): color = random.choice( blueprint.get_attribute('color').recommended_values) blueprint.set_attribute('color', color) if blueprint.has_attribute('driver_id'): driver_id = random.choice( blueprint.get_attribute('driver_id').recommended_values) blueprint.set_attribute('driver_id', driver_id) blueprint.set_attribute('role_name', 'autopilot') # spawn the cars and set their autopilot batch.append( carla.command.SpawnActor(blueprint, transform).then( carla.command.SetAutopilot(carla.command.FutureActor, True, traffic_manager.get_port()))) for response in client.apply_batch_sync(batch, True): if response.error: print(response.error) else: vehicles.append(response.actor_id) return vehicles
def spawn_static_vehicles(carla_client: carla.Client, n=10, role_name_prefix='static') -> List[carla.Actor]: world: carla.World = carla_client.get_world() map: carla.Map = world.get_map() vehicle_blueprints = world.get_blueprint_library().filter('vehicle.*') actor_ids: List[int] = [] batch: List[carla.command.SpawnActor] = [] sidewalk_points: List[carla.Location] = [ world.get_random_location_from_navigation() for _ in range(n) ] street_points: List[carla.Transform] = [ map.get_waypoint(l).transform for l in sidewalk_points ] spawn_points: List[carla.Transform] = [ carla.Transform(location=sidewalk_points[i], rotation=street_points[i].rotation) for i in range(n) ] for i in range(len(spawn_points)): bp: carla.Blueprint = random.choice(vehicle_blueprints) bp.set_attribute('role_name', f'{role_name_prefix}_{i * 100}') batch.append(carla.command.SpawnActor(bp, spawn_points[i])) results = carla_client.apply_batch_sync(batch, True) for i in range(len(results)): if results[i].error: logging.error(results[i].error) else: actor_ids.append(results[i].actor_id) all_actors: carla.ActorList = world.get_actors(actor_ids) return [a for a in all_actors]
def spawn_pedestrians(amount: int, blueprints: list, client: carla.Client, running=0.0, crossing=0.0) -> list: """Spawns pedestrians, based on spawn_npc.py""" assert amount >= 0 assert 0.0 <= running <= 1.0 assert 0.0 <= crossing <= 1.0 percentage_pedestrians_running = running # how many pedestrians will run percentage_pedestrians_crossing = crossing # how many pedestrians will walk through the road traffic_manager = client.get_trafficmanager() world = client.get_world() # 1. Spawn point with random location (for navigation purpose) spawn_points = [] for i in range(amount): spawn_point = carla.Transform() loc = world.get_random_location_from_navigation() if loc is not None: spawn_point.location = loc spawn_points.append(spawn_point) # 2. spawn the walker object batch = [] walker_speed = [] for spawn_point in spawn_points: walker_bp = random.choice(blueprints) # set as not invincible if walker_bp.has_attribute('is_invincible'): walker_bp.set_attribute('is_invincible', 'false') # set the max speed if walker_bp.has_attribute('speed'): if random.random() > percentage_pedestrians_running: # walking walker_speed.append( walker_bp.get_attribute('speed').recommended_values[1]) else: # running walker_speed.append( walker_bp.get_attribute('speed').recommended_values[2]) else: print("Walker has no speed") walker_speed.append(0.0) batch.append(carla.command.SpawnActor(walker_bp, spawn_point)) results = client.apply_batch_sync(batch, True) walker_speed2 = [] walkers = [] for i in range(len(results)): if results[i].error: print(results[i].error) else: walkers.append(dict(id=results[i].actor_id, controller=None)) walker_speed2.append(walker_speed[i]) walker_speed = walker_speed2 # 3. Spawn the walker controller batch = [] walker_controller_bp = world.get_blueprint_library().find( 'controller.ai.walker') for i in range(len(walkers)): batch.append( carla.command.SpawnActor(walker_controller_bp, carla.Transform(), walkers[i]['id'])) results = client.apply_batch_sync(batch, True) for i in range(len(results)): if results[i].error: print(results[i].error) else: walkers[i]['controller'] = results[i].actor_id # 4. Put altogether the walkers and controllers id to get the objects from their id all_id = [] for i in range(len(walkers)): all_id.append(walkers[i]['controller']) all_id.append(walkers[i]['id']) all_actors = world.get_actors(all_id) # wait for a tick to ensure client receives the last transform of the walkers we have just created if not world.get_settings().synchronous_mode: world.wait_for_tick() else: world.tick() # 5. initialize each controller and set target to walk to (list is [controller, actor, controller, actor ...]) # set how many pedestrians can cross the road world.set_pedestrians_cross_factor(percentage_pedestrians_crossing) for i in range(0, len(all_id), 2): # start walker all_actors[i].start() # set walk to random point all_actors[i].go_to_location( world.get_random_location_from_navigation()) # max speed all_actors[i].set_max_speed(float(walker_speed[int(i / 2)])) return all_id
def multi_destroy(carla_client: carla.Client, actors: Iterable[carla.Actor]): batch = list(map(lambda a: carla.command.DestroyActor(a), actors)) carla_client.apply_batch_sync(batch, True)
def try_spawn_pedestrians(carla_client: carla.Client, n=10) -> List[carla.Actor]: # ------------- # Spawn Walkers # ------------- world: carla.World = carla_client.get_world() walker_blueprints = world.get_blueprint_library().filter( 'walker.pedestrian.000[1-7]*') walkers_list = [] all_id = [] # 1. take all the random locations to spawn spawn_points = [] for i in range(n): spawn_point = carla.Transform() loc = world.get_random_location_from_navigation() if loc is not None: spawn_point.location = loc spawn_points.append(spawn_point) # 2. we spawn the walker object batch = [] for spawn_point in spawn_points: walker_bp = random.choice(walker_blueprints) # set as not invincible if walker_bp.has_attribute('is_invincible'): walker_bp.set_attribute('is_invincible', 'false') batch.append(carla.command.SpawnActor(walker_bp, spawn_point)) results = carla_client.apply_batch_sync(batch, True) for i in range(len(results)): if results[i].error: logging.error(results[i].error) else: walkers_list.append({"id": results[i].actor_id}) # 3. we spawn the walker controller batch = [] walker_controller_bp = world.get_blueprint_library().find( 'controller.ai.walker') for i in range(len(walkers_list)): batch.append( carla.command.SpawnActor(walker_controller_bp, carla.Transform(), walkers_list[i]["id"])) results = carla_client.apply_batch_sync(batch, True) for i in range(len(results)): if results[i].error: logging.error(results[i].error) else: walkers_list[i]["con"] = results[i].actor_id # 4. we put altogether the walkers and controllers id to get the objects from their id for i in range(len(walkers_list)): all_id.append(walkers_list[i]["con"]) all_id.append(walkers_list[i]["id"]) all_actors: carla.ActorList = world.get_actors(all_id) # wait for a tick to ensure client receives the last transform of the walkers we have just created world.wait_for_tick() # 5. initialize each controller and set target to walk to (list is [controller, actor, controller, actor ...]) for i in range(0, len(all_id), 2): # start walker all_actors[i].start() try: # set walk to random point all_actors[i].go_to_location( world.get_random_location_from_navigation()) # random max speed all_actors[i].set_max_speed( 1 + random.random() ) # max speed between 1 and 2 (default is 1.4 m/s) except Exception as e: all_actors[i].stop() all_actors = all_actors[:i] + all_actors[i + 2:] return [a for a in all_actors]