Ejemplo n.º 1
0
    def _build_master_scenario(self,
                               world,
                               ego_vehicle,
                               route,
                               town_name,
                               timeout=300,
                               debug_mode=False):
        """
        Create the MasterScenario
        """
        # We have to find the target.
        # we also have to convert the route to the expected format
        master_scenario_configuration = ScenarioConfiguration()
        master_scenario_configuration.target = route[-1][
            0]  # Take the last point and add as target.
        master_scenario_configuration.route = convert_transform_to_location(
            route)
        master_scenario_configuration.town = town_name
        # TODO THIS NAME IS BIT WEIRD SINCE THE EGO VEHICLE  IS ALREADY THERE, IT IS MORE ABOUT THE TRANSFORM
        master_scenario_configuration.ego_vehicle = ActorConfigurationData(
            'vehicle.lincoln.mkz2017', ego_vehicle.get_transform(), 'hero')
        master_scenario_configuration.trigger_points = [
            ego_vehicle.get_transform()
        ]

        # Provide an initial blackboard entry to ensure all scenarios are running correctly
        blackboard = py_trees.blackboard.Blackboard()
        blackboard.set('master_scenario_command', 'scenarios_running')

        return MasterScenario(world, [ego_vehicle],
                              master_scenario_configuration,
                              timeout=timeout,
                              debug_mode=debug_mode)
    def _build_scenario_instances(self, world, ego_vehicle, scenario_definitions, town,
                                  scenarios_per_tick=5, timeout=300, debug_mode=False):
        """
        Based on the parsed route and possible scenarios, build all the scenario classes.
        """
        scenario_instance_vec = []

        if debug_mode:
            for scenario in scenario_definitions:
                loc = carla.Location(scenario['trigger_position']['x'],
                                     scenario['trigger_position']['y'],
                                     scenario['trigger_position']['z']) + carla.Location(z=2.0)
                world.debug.draw_point(loc, size=1.0, color=carla.Color(255, 0, 0), life_time=100000)
                world.debug.draw_string(loc, str(scenario['name']), draw_shadow=False,
                                        color=carla.Color(0, 0, 255), life_time=100000, persistent_lines=True)

        for scenario_number, definition in enumerate(scenario_definitions):
            # Get the class possibilities for this scenario number
            scenario_class = NUMBER_CLASS_TRANSLATION[definition['name']]

            # Create the other actors that are going to appear
            if definition['other_actors'] is not None:
                list_of_actor_conf_instances = self._get_actors_instances(definition['other_actors'])
            else:
                list_of_actor_conf_instances = []
            # Create an actor configuration for the ego-vehicle trigger position

            egoactor_trigger_position = convert_json_to_transform(definition['trigger_position'])
            scenario_configuration = ScenarioConfiguration()
            scenario_configuration.other_actors = list_of_actor_conf_instances
            scenario_configuration.town = town
            scenario_configuration.trigger_points = [egoactor_trigger_position]
            scenario_configuration.subtype = definition['scenario_type']
            scenario_configuration.ego_vehicles = [ActorConfigurationData('vehicle.lincoln.mkz2017',
                                                                          ego_vehicle.get_transform(),
                                                                          'hero')]
            route_var_name = "ScenarioRouteNumber{}".format(scenario_number)
            scenario_configuration.route_var_name = route_var_name

            try:
                scenario_instance = scenario_class(world, [ego_vehicle], scenario_configuration,
                                                   criteria_enable=False, timeout=timeout)
                # Do a tick every once in a while to avoid spawning everything at the same time
                if scenario_number % scenarios_per_tick == 0:
                    sync_mode = world.get_settings().synchronous_mode
                    if sync_mode:
                        world.tick()
                    else:
                        world.wait_for_tick()

                scenario_number += 1
            except Exception as e:      # pylint: disable=broad-except
                if debug_mode:
                    traceback.print_exc()
                print("Skipping scenario '{}' due to setup error: {}".format(definition['name'], e))
                continue

            scenario_instance_vec.append(scenario_instance)

        return scenario_instance_vec
    def parse_scenario_configuration(scenario_config_file, scenario_name):
        """
        Parse scenario configuration file and provide a list of
        ScenarioConfigurations @return

        If scenario_name starts with "group:" all scenarios within
        the config file will be returned. Otherwise only the scenario,
        that matches the scenario_name.
        """

        single_scenario_only = True
        if scenario_name.startswith("group:"):
            single_scenario_only = False
            scenario_name = scenario_name[6:]

        tree = ET.parse(scenario_config_file)

        scenario_configurations = []

        for scenario in tree.iter("scenario"):

            new_config = ScenarioConfiguration()
            new_config.town = scenario.attrib.get('town', None)
            new_config.name = scenario.attrib.get('name', None)
            new_config.type = scenario.attrib.get('type', None)
            new_config.other_actors = []
            new_config.ego_vehicles = []
            new_config.trigger_points = []

            for weather in scenario.iter("weather"):
                new_config.weather.cloudiness = float(weather.attrib.get("cloudiness", 0))
                new_config.weather.precipitation = float(weather.attrib.get("precipitation", 0))
                new_config.weather.precipitation_deposits = float(weather.attrib.get("precipitation_deposits", 0))
                new_config.weather.wind_intensity = float(weather.attrib.get("wind_intensity", 0.35))
                new_config.weather.sun_azimuth_angle = float(weather.attrib.get("sun_azimuth_angle", 0.0))
                new_config.weather.sun_altitude_angle = float(weather.attrib.get("sun_altitude_angle", 15.0))

            for ego_vehicle in scenario.iter("ego_vehicle"):
                new_config.ego_vehicles.append(ActorConfiguration(ego_vehicle, 'hero'))
                new_config.trigger_points.append(new_config.ego_vehicles[-1].transform)

            for target in scenario.iter("target"):
                new_config.target = TargetConfiguration(target)

            for route in scenario.iter("route"):
                route_conf = RouteConfiguration()
                route_conf.parse_xml(route)
                new_config.route = route_conf

            for other_actor in scenario.iter("other_actor"):
                new_config.other_actors.append(ActorConfiguration(other_actor, 'scenario'))

            if single_scenario_only:
                if new_config.name == scenario_name:
                    scenario_configurations.append(new_config)
            else:
                scenario_configurations.append(new_config)

        return scenario_configurations
Ejemplo n.º 4
0
    def _build_scenario_instances(self,
                                  world,
                                  ego_vehicle,
                                  scenario_definitions,
                                  town,
                                  timeout=300,
                                  debug_mode=False):
        """
        Based on the parsed route and possible scenarios, build all the scenario classes.
        """
        scenario_instance_vec = []

        if debug_mode:
            for scenario in scenario_definitions:
                loc = carla.Location(
                    scenario['trigger_position']['x'],
                    scenario['trigger_position']['y'],
                    scenario['trigger_position']['z']) + carla.Location(z=2.0)
                world.debug.draw_point(loc,
                                       size=1.0,
                                       color=carla.Color(255, 0, 0),
                                       life_time=100000)
                world.debug.draw_string(loc,
                                        str(scenario['name']),
                                        draw_shadow=False,
                                        color=carla.Color(0, 0, 255),
                                        life_time=100000,
                                        persistent_lines=True)

        for definition in scenario_definitions:
            # Get the class possibilities for this scenario number
            possibility_vec = NUMBER_CLASS_TRANSLATION[definition['name']]

            scenario_class = possibility_vec[definition['type']]

            # Create the other actors that are going to appear
            if definition['other_actors'] is not None:
                list_of_actor_conf_instances = self._get_actors_instances(
                    definition['other_actors'])
            else:
                list_of_actor_conf_instances = []
            # Create an actor configuration for the ego-vehicle trigger position

            egoactor_trigger_position = convert_json_to_transform(
                definition['trigger_position'])
            scenario_configuration = ScenarioConfiguration()
            scenario_configuration.other_actors = list_of_actor_conf_instances
            scenario_configuration.town = town
            scenario_configuration.trigger_points = [egoactor_trigger_position]
            scenario_configuration.ego_vehicles = [
                ActorConfigurationData('vehicle.lincoln.mkz2017',
                                       ego_vehicle.get_transform(), 'hero')
            ]
            try:
                scenario_instance = scenario_class(world, [ego_vehicle],
                                                   scenario_configuration,
                                                   criteria_enable=False,
                                                   timeout=timeout)
            except Exception as e:
                print("Skipping scenario '{}' due to setup error: {}".format(
                    definition['name'], e))
                continue

            scenario_instance_vec.append(scenario_instance)

        return scenario_instance_vec