diff --git a/PythonAPI/examples/spawn_npc.py b/PythonAPI/examples/spawn_npc.py index d47ee0fec..fedc20213 100755 --- a/PythonAPI/examples/spawn_npc.py +++ b/PythonAPI/examples/spawn_npc.py @@ -47,6 +47,12 @@ def main(): default=10, type=int, help='number of vehicles (default: 10)') + argparser.add_argument( + '-w', '--number-of-walkers', + metavar='W', + default=50, + type=int, + help='number of walkers (default: 50)') argparser.add_argument( '-d', '--delay', metavar='D', @@ -117,14 +123,74 @@ def main(): print('spawned %d vehicles, press Ctrl+C to exit.' % len(actor_list)) + # Spawn Walkers + print (args.number_of_walkers) + spawn_points = [] + for i in range(args.number_of_walkers): + spawn_point = carla.Transform() + spawn_point.location = world.get_random_location_from_navigation() + spawn_points.append(spawn_point) + batch = [] + info = [] + for spawn_point in spawn_points: + walker_bp = random.choice(world.get_blueprint_library().filter('walker.pedestrian.*')) + batch.append(SpawnActor(walker_bp, spawn_point)) + + # apply + results = client.apply_batch_sync(batch, True) + for i in range(len(results)): + if results[i].error: + logging.error(results[i].error) + else: + info.append({ "id":results[i].actor_id, "trans":spawn_points[i], "con":None }) + + # Spawn walker controller + batch = [] + walker_controller_bp = world.get_blueprint_library().find('controller.ai.walker') + for i in range(len(info)): + batch.append(SpawnActor(walker_controller_bp, carla.Transform(), info[i]["id"])) + # apply + results = client.apply_batch_sync(batch, True) + for i in range(len(results)): + if results[i].error: + logging.error(results[i].error) + else: + info[i]["con"] = results[i].actor_id + + # get whole list of actors (child and parents) + all_id = [] + for i in range(len(info)): + all_id.append(info[i]["id"]) + all_id.append(info[i]["con"]) + all_actors = world.get_actors(all_id) + + # initialize each controller and set target to walk to + for i in range(len(all_id)): + # check it if it is a controller or a walker + index = -1 + for j in range(len(info)): + if (info[j]["con"] == all_id[i]): + index = j + break + if (index != -1): + # init + all_actors[i].start(info[index]["trans"].location) + # walk to random point + target = world.get_random_location_from_navigation() + all_actors[i].go_to_location(target) + + print('spawned %d walkers, press Ctrl+C to exit.' % len(info)) + while True: world.wait_for_tick() finally: - print('\ndestroying %d actors' % len(actor_list)) + print('\ndestroying %d vehicles' % len(actor_list)) client.apply_batch([carla.command.DestroyActor(x) for x in actor_list]) + print('\ndestroying %d walkers' % len(info)) + client.apply_batch([carla.command.DestroyActor(x) for x in all_id]) if __name__ == '__main__':