class ActorSource(AtomicBehavior): """ Implementation for a behavior that will indefinitely create actors at a given transform if no other actor exists in a given radius from the transform. Important parameters: - actor_type_list: Type of CARLA actors to be spawned - transform: Spawn location - threshold: Min available free distance between other actors and the spawn location - blackboard_queue_name: Name of the blackboard used to control this behavior - actor_limit [optional]: Maximum number of actors to be spawned (default=7) A parallel termination behavior has to be used. """ def __init__(self, actor_type_list, transform, threshold, blackboard_queue_name, actor_limit=7, name="ActorSource"): """ Setup class members """ super(ActorSource, self).__init__(name) self._world = CarlaDataProvider.get_world() self._actor_types = actor_type_list self._spawn_point = transform self._threshold = threshold self._queue = Blackboard().get(blackboard_queue_name) self._actor_limit = actor_limit self._last_blocking_actor = None def update(self): new_status = py_trees.common.Status.RUNNING if self._actor_limit > 0: world_actors = self._world.get_actors() spawn_point_blocked = False if (self._last_blocking_actor and self._spawn_point.location.distance(self._last_blocking_actor.get_location()) < self._threshold): spawn_point_blocked = True if not spawn_point_blocked: for actor in world_actors: if self._spawn_point.location.distance(actor.get_location()) < self._threshold: spawn_point_blocked = True self._last_blocking_actor = actor break if not spawn_point_blocked: try: new_actor = CarlaActorPool.request_new_actor(np.random.choice(self._actor_types), self._spawn_point) self._actor_limit -= 1 self._queue.put(new_actor) except: print("ActorSource unable to spawn actor") return new_status
class ActorSource(AtomicBehavior): """ Implementation for a behavior that will indefinitely create actors at a given transform if no other actor exists in a given radius from the transform. """ def __init__(self, world, actor_type_list, transform, threshold, blackboard_queue_name, actor_limit=7, name="ActorSource"): """ Setup class members """ super(ActorSource, self).__init__(name) self._world = world self._actor_types = actor_type_list self._spawn_point = transform self._threshold = threshold self._queue = Blackboard().get(blackboard_queue_name) self._actor_limit = actor_limit self._last_blocking_actor = None def update(self): new_status = py_trees.common.Status.RUNNING if self._actor_limit > 0: world_actors = self._world.get_actors() spawn_point_blocked = False if (self._last_blocking_actor and self._spawn_point.location.distance(self._last_blocking_actor.get_location()) < self._threshold): spawn_point_blocked = True if not spawn_point_blocked: for actor in world_actors: if self._spawn_point.location.distance(actor.get_location()) < self._threshold: spawn_point_blocked = True self._last_blocking_actor = actor break if not spawn_point_blocked: try: new_actor = CarlaActorPool.request_new_actor(np.random.choice(self._actor_types), self._spawn_point) self._actor_limit -= 1 self._queue.put(new_actor) except: print("ActorSource unable to spawn actor") return new_status
class ActorSource(AtomicBehavior): """ Implementation for a behavior that will indefinitely create actors at a given transform if no other actor exists in a given radius from the transform. Important parameters: - actor_type_list: Type of CARLA actors to be spawned - transform: Spawn location - threshold: Min available free distance between other actors and the spawn location - blackboard_queue_name: Name of the blackboard used to control this behavior - actor_limit [optional]: Maximum number of actors to be spawned (default=7) A parallel termination behavior has to be used. """ def __init__(self, actor_type_list, transform, threshold, blackboard_queue_name, actor_limit=999, name="ActorSource", # ======== additional args ======== init_speed=0., # initial speed of spawned vehicle randomize=False, ): """ Setup class members """ super(ActorSource, self).__init__(name) self._world = CarlaDataProvider.get_world() self._actor_types = actor_type_list self._spawn_point = transform self._threshold = threshold + 5. # todo fix this with accurate vehicle length self._queue = Blackboard().get(blackboard_queue_name) self._actor_limit = actor_limit self._last_blocking_actor = None # ========== additional attributes ========== self.init_speed = init_speed self.randomize = randomize self.distance_gap = None def update(self): if not self.distance_gap: self.distance_gap = self._threshold new_status = py_trees.common.Status.RUNNING # self._threshold = 20 if self._actor_limit > 0: world_actors = self._world.get_actors() vehicle_list = world_actors.filter('vehicle.*') vehicles = [] for veh in vehicle_list: if veh.attributes['role_name'] == 'scenario': # todo fix role_name if set by args vehicles.append(veh) spawn_point_blocked = False if (self._last_blocking_actor and self._spawn_point.location.distance(self._last_blocking_actor.get_location()) < self.distance_gap): spawn_point_blocked = True if not spawn_point_blocked: # for actor in world_actors: for actor in vehicles: if self._spawn_point.location.distance(actor.get_location()) < self.distance_gap: spawn_point_blocked = True self._last_blocking_actor = actor break if not spawn_point_blocked: try: new_actor = CarlaDataProvider.request_new_actor( np.random.choice(self._actor_types), self._spawn_point) self._actor_limit -= 1 self._queue.put(new_actor) set_vehicle_speed(new_actor, self.init_speed / 3.6) # update distance gap after generating a new actor if self.randomize: sigma = 0.1 self.distance_gap = random.uniform(self._threshold * (1-sigma), self._threshold * (1+sigma)) except: # pylint: disable=bare-except print("ActorSource unable to spawn actor") return new_status