예제 #1
0
  def test_one_agent_at_goal_sequential(self):
    param_server = ParameterServer()
    # Model Definition
    dynamic_model = SingleTrackModel(param_server)
    behavior_model = BehaviorMotionPrimitives(dynamic_model, param_server)
    idx = behavior_model.add_motion_primitive(np.array([1, 0]))
    behavior_model.action_to_behavior(idx)
    execution_model = ExecutionModelInterpolate(param_server)


    # Agent Definition
    agent_2d_shape = CarLimousine()
    init_state = np.array([0, 0, 0, 0, 0])
    agent_params = param_server.addChild("agent1")
    goal_frame = Polygon2d([0, 0, 0],
                             [Point2d(-1,-1),
                              Point2d(-1,1),
                              Point2d(1,1),
                              Point2d(1,-1)])

    goal_polygon1 = goal_frame.translate(Point2d(10, 0))
    goal_polygon2 = goal_frame.translate(Point2d(20, 0))
    goal_polygon3 = goal_frame.translate(Point2d(30, 0))

    goal_def1 = GoalDefinitionStateLimits(goal_polygon1, [-0.08, 0.08])
    goal_def2 = GoalDefinitionStateLimits(goal_polygon2, [-0.08, 0.08])
    goal_def3 = GoalDefinitionStateLimits(goal_polygon3, [-0.08, 0.08])

    goal_definition = GoalDefinitionSequential([goal_def1,
                                                goal_def2,
                                                goal_def3])

    self.assertEqual(len(goal_definition.sequential_goals),3)
    agent = Agent(init_state,
                behavior_model,
                dynamic_model,
                execution_model,
                agent_2d_shape,
                agent_params,
                goal_definition,
                  None)

    world = World(param_server)
    world.add_agent(agent)
    evaluator = EvaluatorGoalReached(agent.id)
    world.add_evaluator("success", evaluator)

    # just drive with the single motion primitive should be successful 
    for _ in range(0,1000):
        world.step(0.2)
        info = world.evaluate()
        if info["success"]:
            break
    
    self.assertEqual(info["success"], True)
    self.assertAlmostEqual(agent.state[int(StateDefinition.X_POSITION)], 30, delta=0.5)
예제 #2
0
    def test_one_agent_at_goal_state_limits(self):
        param_server = ParameterServer()
        # Model Definition
        behavior_model = BehaviorConstantVelocity(param_server)
        execution_model = ExecutionModelInterpolate(param_server)
        dynamic_model = SingleTrackModel(param_server)

        # Agent Definition
        agent_2d_shape = CarLimousine()
        init_state = np.array(
            [0, -191.789, -50.1725, 3.14 * 3.0 / 4.0, 150 / 3.6])
        agent_params = param_server.AddChild("agent1")
        goal_polygon = Polygon2d(
            [0, 0, 0],
            [Point2d(-1, -1),
             Point2d(-1, 1),
             Point2d(1, 1),
             Point2d(1, -1)])
        goal_polygon = goal_polygon.Translate(Point2d(-191.789, -50.1725))

        agent = Agent(
            init_state, behavior_model, dynamic_model, execution_model,
            agent_2d_shape, agent_params,
            GoalDefinitionStateLimits(
                goal_polygon,
                (3.14 * 3.0 / 4.0 - 0.08, 3.14 * 3.0 / 4.0 + 0.08)), None)

        world = World(param_server)
        world.AddAgent(agent)
        evaluator = EvaluatorGoalReached(agent.id)
        world.AddEvaluator("success", evaluator)

        info = world.Evaluate()
        self.assertEqual(info["success"], True)
예제 #3
0
    def create_single_scenario(self):
        scenario = Scenario(map_file_name=self._map_file_name,
                            json_params=self._params.ConvertToDict())
        world = scenario.get_world_state()
        agent_list = []
        scenario._agent_list = []
        for agent_json_ in self._local_params["Agents"]:
            agent_json = agent_json_["VehicleModel"].copy()
            agent_json["map_interface"] = world.map
            goal_polygon = Polygon2d([0, 0, 0],
                                     np.array(
                                         agent_json["goal"]["polygon_points"]))
            goal_polygon = goal_polygon.Translate(
                Point2d(agent_json["goal"]["center_pose"][0],
                        agent_json["goal"]["center_pose"][1]))

            sequential_goals = []
            goal = GoalDefinitionPolygon(goal_polygon)
            if "goal_type" in agent_json["goal"]:
                goal_type = agent_json["goal"]["goal_type"]
                if goal_type == "GoalDefinitionStateLimits":
                    goal = GoalDefinitionStateLimits(goal_polygon,
                                                     (1.49, 1.65))

            # state_limit_goal = GoalDefinitionStateLimits(goal_polygon, (1.49, 1.65))
            for _ in range(self._local_params["goal"]["num_reached", "num",
                                                      5]):
                sequential_goals.append(goal)
            sequential_goal = GoalDefinitionSequential(sequential_goals)
            agent_json["goal_definition"] = sequential_goal

            agent_state = np.array(agent_json["state"])
            if len(np.shape(agent_state)) > 1:
                agent_state = np.random.uniform(low=agent_state[:, 0],
                                                high=agent_state[:, 1])
            agent_json["state"] = agent_state.tolist()
            agent = self._json_converter.agent_from_json(
                agent_json, param_server=self._params)
            agent.SetAgentId(agent_json["id"])
            scenario._agent_list.append(agent)

        # TODO(@hart): this could be mult. agents
        scenario._eval_agent_ids = self._local_params[
            "controlled_ids", "IDs of agents to be controlled. ", [0]]
        return scenario
    def create_single_scenario(self):
        scenario = Scenario(map_file_name=self._map_file_name,
                            json_params=self._params.ConvertToDict())
        world = scenario.get_world_state()
        agent_list = []
        # OTHER AGENTS
        for idx, source in enumerate(self._others_source):
            connecting_center_line, s_start, s_end = \
              self.center_line_between_source_and_sink(world.map,
                                                       source,
                                                       self._others_sink[idx])
            goal_polygon = Polygon2d([0, 0, 0], [
                Point2d(-1.5, 0),
                Point2d(-1.5, 8),
                Point2d(1.5, 8),
                Point2d(1.5, 0)
            ])
            goal_polygon = goal_polygon.Translate(
                Point2d(self._others_sink[idx][0], self._others_sink[idx][1]))
            goal_definition = GoalDefinitionPolygon(goal_polygon)
            agent_list.extend(
                self.place_agents_along_linestring(world,
                                                   connecting_center_line,
                                                   s_start, s_end,
                                                   self._agent_params,
                                                   goal_definition))

        description = self._params.ConvertToDict()
        description["ScenarioGenerator"] = "UniformVehicleDistribution"

        # EGO AGENT
        ego_agent = None
        if len(self._ego_route) == 0:
            # take agent in the middle of list
            num_agents = len(agent_list)
            ego_agent = agent_list[math.floor(num_agents / 4)]
        else:
            connecting_center_line, s_start, s_end  = \
            self.center_line_between_source_and_sink(world.map,
                                                     self._ego_route[0],
                                                     self._ego_route[1])

            sego = self.sample_srange_uniform([s_start, s_end])
            xy_point = GetPointAtS(connecting_center_line, sego)
            angle = GetTangentAngleAtS(connecting_center_line, sego)
            velocity = self.sample_velocity_uniform(self._ego_velocity_range)
            agent_state = np.array(
                [0, xy_point.x(),
                 xy_point.y(), angle, velocity])

            agent_params = self._agent_params.copy()
            agent_params["state"] = agent_state
            # goal for driving corridor generation
            goal_polygon = Polygon2d([0, 0, 0], [
                Point2d(-1.5, 0),
                Point2d(-1.5, 8),
                Point2d(1.5, 8),
                Point2d(1.5, 0)
            ])
            goal_polygon = goal_polygon.Translate(
                Point2d(self._ego_route[1][0], self._ego_route[1][1]))
            goal_definition = GoalDefinitionPolygon(goal_polygon)
            agent_params["goal_definition"] = goal_definition
            agent_params["map_interface"] = world.map

            converter = ModelJsonConversion()
            ego_agent = converter.agent_from_json(agent_params,
                                                  self._params["Agent"])
            # TODO(@bernhard): ensure that ego agent not collides with others

        agent_list.append(ego_agent)

        # EGO Agent Goal Definition
        if len(self._ego_goal_start) == 0:
            if len(self._ego_route) == 0:
                # ego agent is one of the random agents, so the goal definition is
                # already set
                pass
            else:
                goal_polygon = Polygon2d([0, 0, 0], [
                    Point2d(-1.5, 0),
                    Point2d(-1.5, 8),
                    Point2d(1.5, 8),
                    Point2d(1.5, 0)
                ])
                goal_polygon = goal_polygon.Translate(
                    Point2d(self._ego_goal_end[0], self._ego_goal_end[1]))
                ego_agent.goal_definition = GoalDefinitionPolygon(goal_polygon)
        else:
            connecting_center_line, s_start, s_end = \
            self.center_line_between_source_and_sink(world.map,
                                                     self._ego_goal_start,
                                                     self._ego_goal_end)

            goal_center_line = GetLineFromSInterval(connecting_center_line,
                                                    s_start, s_end)

            # build polygon representing state limits
            lims = self._ego_goal_state_limits
            goal_limits_left = goal_center_line.Translate(
                Point2d(-lims[0], -lims[1]))
            goal_limits_right = goal_center_line.Translate(
                Point2d(lims[0], lims[1]))
            goal_limits_right.Reverse()
            goal_limits_left.AppendLinestring(goal_limits_right)
            polygon = Polygon2d([0, 0, 0], goal_limits_left)

            ego_agent.goal_definition = GoalDefinitionStateLimits(
                polygon, (1.57 - 0.08, 1.57 + 0.08))

        # only one agent is ego in the middle of all other agents
        scenario._agent_list = agent_list
        scenario._eval_agent_ids = [ego_agent.id]
        return scenario