diff --git a/Docs/CHANGELOG.md b/Docs/CHANGELOG.md index a17cb7aa4..48fca5268 100644 --- a/Docs/CHANGELOG.md +++ b/Docs/CHANGELOG.md @@ -53,6 +53,7 @@ - Added support for a default actor model, in case the stated model is not available - Added support for MiscObjects (besides vehicles and pedestrians) - Reworked traffic signal handling: The name has to start now either with "id=" or "pos=" depending on whether the position or id is used as unique identifier + - Actor physics can now be set via Object Properties () ### :bug: Bug Fixes * Fixed wrong handling of OpenSCENARIO ConditionGroups, which should be handled as parallel composites, not sequences * Fixed #443: Repetitions in OpenSCENARIO were not properly working diff --git a/srunner/scenarioconfigs/openscenario_configuration.py b/srunner/scenarioconfigs/openscenario_configuration.py index effe1033b..3d985696f 100644 --- a/srunner/scenarioconfigs/openscenario_configuration.py +++ b/srunner/scenarioconfigs/openscenario_configuration.py @@ -172,6 +172,12 @@ def _set_actor_information(self): for entity in self.xml_tree.iter("Entities"): for obj in entity.iter("Object"): rolename = obj.attrib.get('name', 'simulation') + args = dict() + for prop in obj.iter("Property"): + key = prop.get('name') + value = prop.get('value') + args[key] = value + for vehicle in obj.iter("Vehicle"): color = None model = vehicle.attrib.get('name', "vehicle.*") @@ -185,7 +191,7 @@ def _set_actor_information(self): speed = self._get_actor_speed(rolename) new_actor = ActorConfigurationData( - model, carla.Transform(), rolename, speed, color=color, category=category) + model, carla.Transform(), rolename, speed, color=color, category=category, args=args) new_actor.transform = self._get_actor_transform(rolename) if ego_vehicle: @@ -196,7 +202,8 @@ def _set_actor_information(self): for pedestrian in obj.iter("Pedestrian"): model = pedestrian.attrib.get('model', "walker.*") - new_actor = ActorConfigurationData(model, carla.Transform(), rolename, category="pedestrian") + new_actor = ActorConfigurationData( + model, carla.Transform(), rolename, category="pedestrian", args=args) new_actor.transform = self._get_actor_transform(rolename) self.other_actors.append(new_actor) @@ -209,7 +216,7 @@ def _set_actor_information(self): model = "static.prop.chainbarrier" else: model = misc.attrib.get('name') - new_actor = ActorConfigurationData(model, carla.Transform(), rolename) + new_actor = ActorConfigurationData(model, carla.Transform(), rolename, category="misc", args=args) new_actor.transform = self._get_actor_transform(rolename) self.other_actors.append(new_actor) diff --git a/srunner/scenarioconfigs/scenario_configuration.py b/srunner/scenarioconfigs/scenario_configuration.py index 3bb0476d5..e1ea47826 100644 --- a/srunner/scenarioconfigs/scenario_configuration.py +++ b/srunner/scenarioconfigs/scenario_configuration.py @@ -19,7 +19,7 @@ class ActorConfigurationData(object): """ def __init__(self, model, transform, rolename='other', speed=0, autopilot=False, - random=False, amount=1, color=None, category="car"): + random=False, amount=1, color=None, category="car", args=None): self.model = model self.rolename = rolename self.transform = transform @@ -29,6 +29,7 @@ def __init__(self, model, transform, rolename='other', speed=0, autopilot=False, self.amount = amount self.color = color self.category = category + self.args = args class ActorConfiguration(ActorConfigurationData): diff --git a/srunner/scenariomanager/carla_data_provider.py b/srunner/scenariomanager/carla_data_provider.py index dd9bca6e3..a8c533d6f 100644 --- a/srunner/scenariomanager/carla_data_provider.py +++ b/srunner/scenariomanager/carla_data_provider.py @@ -495,7 +495,7 @@ def handle_actor_batch(batch): if not response.error: actor_ids.append(response.actor_id) else: - print("WARNING: Could not spawn an actor") + raise RuntimeError("Error: Unable to spawn actor") carla_actors = CarlaActorPool._world.get_actors(actor_ids) for actor in carla_actors: @@ -551,7 +551,10 @@ def setup_actors(actor_list): Function to setup a complete list of actors """ - SpawnActor = carla.command.SpawnActor # pylint: disable=invalid-name + SpawnActor = carla.command.SpawnActor # pylint: disable=invalid-name + PhysicsCommand = carla.command.SetSimulatePhysics # pylint: disable=invalid-name + FutureActor = carla.command.FutureActor # pylint: disable=invalid-name + ApplyTransform = carla.command.ApplyTransform # pylint: disable=invalid-name batch = [] actors = [] for actor in actor_list: @@ -567,7 +570,13 @@ def setup_actors(actor_list): _spawn_point.location.x = actor.transform.location.x _spawn_point.location.y = actor.transform.location.y _spawn_point.location.z = actor.transform.location.z + 0.2 - batch.append(SpawnActor(blueprint, _spawn_point)) + + if 'physics' in actor.args and actor.args['physics'] == "off": + command = SpawnActor(blueprint, _spawn_point).then( + ApplyTransform(FutureActor, actor.transform)).then(PhysicsCommand(FutureActor, False)) + else: + command = SpawnActor(blueprint, _spawn_point).then(PhysicsCommand(FutureActor, True)) + batch.append(command) actors = CarlaActorPool.handle_actor_batch(batch) @@ -654,7 +663,6 @@ def request_new_actor(model, spawn_point, rolename='scenario', hero=False, autop return None CarlaActorPool._carla_actor_pool[actor.id] = actor - actor.set_simulate_physics(True) return actor @staticmethod @@ -670,7 +678,6 @@ def request_new_actors(actor_list): for actor in actors: CarlaActorPool._carla_actor_pool[actor.id] = actor - actor.set_simulate_physics(True) return actors @staticmethod