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
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
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
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)
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"
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