예제 #1
0
    def _format_entities(entities: Iterable[Union[RobotFilter, BallFilter]]) -> List[Dict[str, Any]]:
        formatted_list = []
        for entity in entities:
            fields = dict()
            if type(entity) is RobotFilter:
                fields['pose'] = Pose.from_values(*entity.pose)
                fields['velocity'] = Pose.from_values(*entity.velocity)
            elif type(entity) is BallFilter:
                fields['position'] = Position(*entity.position)
                fields['velocity'] = Position(*entity.velocity)
            else:
                raise TypeError('Invalid type provided: {}'.format(type(entity)))

            fields['id'] = entity.id
            formatted_list.append(fields)
        return formatted_list
예제 #2
0
    def _find_best_passing_option(self):
        assignation_delay = (time.time() - self.target_assignation_last_time)

        if assignation_delay > TARGET_ASSIGNATION_DELAY:
            tentative_target_id = best_passing_option(self.player)
            if tentative_target_id is None:
                self.target = Pose.from_values(GameState().field.their_goal_x, 0, 0)
            else:
                self.target = Pose(GameState().get_player_position(tentative_target_id))

            self.target_assignation_last_time = time.time()
    def execute(self, robot: Robot, dt: float):

        pos_error = robot.position_error
        orientation_error = robot.orientation_error

        command = Pose.from_values(self.controllers['x'].execute(pos_error.x),
                                   self.controllers['y'].execute(pos_error.y),
                                   self.controllers['orientation'].execute(orientation_error))

        # Limit max linear speed
        command.position /= max(1.0, command.norm / MAX_LINEAR_SPEED)
        command.orientation /= max(1.0, abs(command.orientation) / MAX_ANGULAR_SPEED)
        return command
예제 #4
0
    def execute(self, robot: Robot, dt: float):

        pos_error = robot.position_error
        orientation_error = robot.orientation_error

        command = Pose.from_values(
            self.controllers['x'].execute(pos_error.x),
            self.controllers['y'].execute(pos_error.y),
            self.controllers['orientation'].execute(orientation_error))

        # Limit max linear speed
        command.position /= max(1.0, command.norm / MAX_LINEAR_SPEED)
        command.orientation /= max(
            1.0,
            abs(command.orientation) / MAX_ANGULAR_SPEED)
        return command
예제 #5
0
 def test_givenXYOrientation_whenFromValues_thenReturnNewPose(self):
     pose = Pose.from_values(A_X, A_Y, A_ORIENTATION)
     self.assertEqual(pose.x, A_X)
     self.assertEqual(pose.y, A_Y)
     self.assertEqual(pose.orientation, A_ORIENTATION)
예제 #6
0
import unittest
from time import sleep

from Util import Pose, Position
from ai.STA.Tactic.go_kick import GoKick, COMMAND_DELAY
from tests.STA.perfect_sim import PerfectSim

A_ROBOT_ID = 1
START_POSE = Pose.from_values(300, 0, 0)
START_BALL_POSITION = START_POSE.position + Position(100, 0)
GOAL_POSE = Pose.from_values(700, 0, 0)
MAX_TICK_UNTIL_KICK = 7


class TestGoKick(unittest.TestCase):
    def setUp(self):
        self.sim = PerfectSim(GoKick)

    def test_givenARobotAndABall_thenKickTheBall(self):
        self.sim.add_robot(A_ROBOT_ID, START_POSE)
        self.sim.move_ball(START_BALL_POSITION)
        self.sim.start(A_ROBOT_ID, target=GOAL_POSE)

        self.sim.tick()  # initialize

        for _ in range(0, MAX_TICK_UNTIL_KICK):
            self.sim.tick()
            if self.sim.has_kick() and self.sim.has_hit_ball:
                return
        assert False, "Reach max number of tick and no kick"
예제 #7
0
 def test_givenXYOrientation_whenFromValues_thenReturnNewPose(self):
     pose = Pose.from_values(A_X, A_Y, A_ORIENTATION)
     self.assertEqual(pose.x, A_X)
     self.assertEqual(pose.y, A_Y)
     self.assertEqual(pose.orientation, A_ORIENTATION)
예제 #8
0
import unittest
from time import sleep

from Util import Pose, Position
from ai.STA.Tactic.go_kick import GoKick, COMMAND_DELAY
from tests.STA.perfect_sim import PerfectSim

A_ROBOT_ID = 1
START_POSE = Pose.from_values(300, 0, 0)
START_BALL_POSITION = START_POSE.position + Position(100, 0)
GOAL_POSE = Pose.from_values(700, 0, 0)
MAX_TICK_UNTIL_KICK = 7


class TestGoKick(unittest.TestCase):

    def setUp(self):
        self.sim = PerfectSim(GoKick)

    def test_givenARobotAndABall_thenKickTheBall(self):
        self.sim.add_robot(A_ROBOT_ID, START_POSE)
        self.sim.move_ball(START_BALL_POSITION)
        self.sim.start(A_ROBOT_ID, target=GOAL_POSE)

        self.sim.tick() # initialize

        for _ in range(0, MAX_TICK_UNTIL_KICK):
            self.sim.tick()
            if self.sim.has_kick() and self.sim.has_hit_ball:
                return