Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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]
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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]