Esempio n. 1
0
    def __init__(self, ball: 'Ball'):
        self.ball = ball
        self.debug_interface = DebugInterface()
        cfg = ConfigService()

        if cfg.config_dict["GAME"]["our_side"] == "positive":
            self.our_side = FieldSide.POSITIVE
            self.constant = positive_side_constant
        else:
            self.our_side = FieldSide.NEGATIVE
            self.constant = negative_side_constant
Esempio n. 2
0
    def __init__(self):
        """
        Initialise le coach de l'IA.

        :param mode_debug_active: (bool) indique si les commandes de debug sont actives
        :param pathfinder:  (str) indique le nom du pathfinder par défault
        :param is_simulation:   (bool) indique si en simulation (true) ou en vrai vie (false)
        """
        cfg = ConfigService()
        self.mode_debug_active = cfg.config_dict["DEBUG"][
            "using_debug"] == "true"
        self.is_simulation = cfg.config_dict["GAME"]["type"] == "sim"

        # init the states
        self.world_state = WorldState()

        # init the executors
        self.debug_executor = DebugExecutor(self.world_state)
        self.play_executor = PlayExecutor(self.world_state)
        self.module_executor = ModuleExecutor(self.world_state)
        self.motion_executor = MotionExecutor(self.world_state)
        self.robot_command_executor = CommandExecutor(self.world_state)

        # logging
        DebugInterface().add_log(
            1, "\nCoach initialized with \nmode_debug_active = " +
            str(self.mode_debug_active) + "\nis_simulation = " +
            str(self.is_simulation))
Esempio n. 3
0
    def __init__(self):
        """ Constructeur de la classe, établis les propriétés de bases et
        construit les objets qui sont toujours necéssaire à son fonctionnement
        correct.
        """
        # config
        self.cfg = ConfigService()

        # time
        self.last_frame_number = 0
        self.time_stamp = None  # time.time()
        self.last_camera_time = time.time()
        self.time_of_last_loop = time.time()
        self.ai_timestamp = float(self.cfg.config_dict["GAME"]["ai_timestamp"])

        # thread
        self.ia_running_thread = None
        self.thread_terminate = threading.Event()

        # Communication
        self.robot_command_sender = None
        self.vision = None
        self.referee_command_receiver = None
        self.uidebug_command_sender = None
        self.uidebug_command_receiver = None
        self.uidebug_vision_sender = None
        self.uidebug_robot_monitor = None
        # because this thing below is a callable! can be used without being set
        self.vision_redirection_routine = lambda *args: None
        self.vision_routine = self._sim_vision  # self._normal_vision # self._test_vision self._redirected_vision
        self._choose_vision_routines()

        # Debug
        self.incoming_debug = []
        self.debug = DebugInterface()
        self.outgoing_debug = self.debug.debug_state
        self._init_communication()

        # Game elements
        self.reference_transfer_object = None
        self.game = None
        self.ai_coach = None
        self.referee = None
        self.team_color_service = None

        self._create_game_world()

        # VISION
        self.image_transformer = ImageTransformerFactory.get_image_transformer(
        )

        # ia couplage
        self.ia_coach_mainloop = None
        self.ia_coach_initializer = None

        # for testing purposes
        self.frame_number = 0
Esempio n. 4
0
    def __init__(self, world_state):
        """
            Reçoit une référence vers InfoManager. Cette référence est renomée
            comme étant *state*.

            :param world_state: (WorldState) Référence vers le worldstate.
        """

        self.ws = world_state
        self.debug_interface = DebugInterface()
Esempio n. 5
0
    def __init__(self,
                 game_state: GameState,
                 player: OurPlayer,
                 target: Pose = Pose(),
                 args=None):
        Tactic.__init__(self, game_state, player, target, args)
        self.current_state = self.get_behind_ball
        self.next_state = self.get_behind_ball
        self.debug_interface = DebugInterface()

        self.target = target
Esempio n. 6
0
    def __init__(self, mode_debug_active: bool = True):
        """
        initialisation du worldstate

        :param mode_debug_active: (bool) indique si le mode debug est activé
        """
        self.module_state = ModuleState()
        self.play_state = PlayState()
        self.game_state = GameState()

        # pour passer une interface de debug deja recuperer
        self.debug_interface = DebugInterface()
Esempio n. 7
0
    def __init__(self, game_state: GameState, player: OurPlayer, target: Pose=Pose(), args: List[str]=None):
        super().__init__(game_state, player, target, args)
        self.current_state = self.get_behind_ball
        self.next_state = self.get_behind_ball
        self.debug_interface = DebugInterface()
        self.move_action = self._generate_move_to()
        self.move_action.status_flag = Flags.SUCCESS
        self.last_ball_position = self.game_state.get_ball_position()
        self.charge_time = 0
        self.last_time = time.time()

        self.orientation_target = 0
        self.target = target
Esempio n. 8
0
class Field:
    def __init__(self, ball: 'Ball'):
        self.ball = ball
        self.debug_interface = DebugInterface()
        cfg = ConfigService()

        if cfg.config_dict["GAME"]["our_side"] == "positive":
            self.our_side = FieldSide.POSITIVE
            self.constant = positive_side_constant
        else:
            self.our_side = FieldSide.NEGATIVE
            self.constant = negative_side_constant


    def set_collision_body(self):
        x_their_goal = self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"]
        x_our_goal = self.constant["FIELD_OUR_GOAL_X_EXTERNAL"]
        radius = self.constant["FIELD_GOAL_RADIUS"]

        self.field_collision_body = [CollisionBody(Position(x_their_goal, 0), Position(0, 0), radius, CollisionType.ZONE),
                                     CollisionBody(Position(x_our_goal, 0), Position(0, 0), radius, CollisionType.ZONE)]

        self.debug_interface.add_circle((x_their_goal, 0), radius=radius, timeout=0, color=(255, 0, 0))
        self.debug_interface.add_circle((x_our_goal, 0), radius=radius, timeout=0, color=(255, 0, 0))


    def move_ball(self, position, delta):
        self.ball.set_position(position, delta)

    def is_inside_goal_area(self, position, dist_from_goal_area=0, our_goal=True):
        assert (isinstance(position, Position))
        assert (isinstance(our_goal, bool))
        x1 = self.constant["FIELD_OUR_GOAL_X_EXTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"]
        x2 = self.constant["FIELD_OUR_GOAL_X_INTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_INTERNAL"]

        x_right = max(x1, x2) + dist_from_goal_area
        x_left = min(x1, x2) - dist_from_goal_area

        top_circle = self.constant["FIELD_OUR_GOAL_TOP_CIRCLE"] if our_goal\
            else self.constant["FIELD_THEIR_GOAL_TOP_CIRCLE"]
        bot_circle = self.constant["FIELD_OUR_GOAL_BOTTOM_CIRCLE"] if our_goal\
            else self.constant["FIELD_THEIR_GOAL_BOTTOM_CIRCLE"]
        if isInsideSquare(position, self.constant["FIELD_GOAL_Y_TOP"], self.constant["FIELD_GOAL_Y_BOTTOM"],
                          x_left, x_right):
            if is_inside_circle(position, top_circle, self.constant["FIELD_GOAL_RADIUS"] + dist_from_goal_area):
                return True
            elif is_inside_circle(position, bot_circle, self.constant["FIELD_GOAL_RADIUS"] + dist_from_goal_area):
                return True
            return True
        else:
            return False

    def is_outside_goal_area(self, position, dist_from_goal_area=0, our_goal=True):
        return not self.is_inside_goal_area(position, dist_from_goal_area, our_goal)

    def stay_inside_goal_area(self, position, our_goal=True):
        # TODO Not tested: stayInsideGoalArea
        if self.is_inside_goal_area(position, our_goal):
            return Position(position.x, position.y)
        else:
            x1 = self.constant["FIELD_OUR_GOAL_X_EXTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"]
            x2 = self.constant["FIELD_OUR_GOAL_X_INTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_INTERNAL"]

            x_right = max(x1, x2)
            x_left = min(x1, x2)

            position = stayInsideSquare(position, self.constant["FIELD_GOAL_Y_TOP"],
                                        self.constant["FIELD_GOAL_Y_BOTTOM"], x_left, x_right)
            if isInsideSquare(position, self.constant["FIELD_GOAL_Y_TOP"], self.constant["FIELD_GOAL_Y_BOTTOM"],
                              x_left, x_right):
                return position
            else:
                circle_top = self.constant["FIELD_OUR_GOAL_TOP_CIRCLE"] if our_goal\
                    else self.constant["FIELD_THEIR_GOAL_TOP_CIRCLE"]
                circle_bot = self.constant["FIELD_OUR_GOAL_BOTTOM_CIRCLE"] if our_goal\
                    else self.constant["FIELD_THEIR_GOAL_BOTTOM_CIRCLE"]
                dst_top = get_distance(circle_top, position)
                dst_bot = get_distance(circle_bot, position)

                if dst_top >= dst_bot:
                    return stayInsideCircle(position, circle_top, self.constant["FIELD_GOAL_RADIUS"])
                else:
                    return stayInsideCircle(position, circle_bot, self.constant["FIELD_GOAL_RADIUS"])

    def stay_outside_goal_area(self, position, dist_from_goal_area=200, our_goal=True):
        # TODO Not tested: stayOutsideGoalArea
        if self.is_outside_goal_area(position, dist_from_goal_area, our_goal):
            return Position(position.x, position.y)
        else:
            x1 = self.constant["FIELD_OUR_GOAL_X_EXTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"]
            x2 = self.constant["FIELD_OUR_GOAL_X_INTERNAL"] if our_goal else self.constant["FIELD_THEIR_GOAL_X_INTERNAL"]
            x1 = 2*x1-x2

            x_right = max(x1, x2) + dist_from_goal_area
            x_left = min(x1, x2) - dist_from_goal_area

            y_top = self.constant["FIELD_GOAL_SEGMENT"] / 2
            y_bottom = (self.constant["FIELD_GOAL_SEGMENT"] / 2) * -1

            circle_top = self.constant["FIELD_OUR_GOAL_TOP_CIRCLE"] if our_goal\
                else self.constant["FIELD_THEIR_GOAL_TOP_CIRCLE"]
            circle_bot = self.constant["FIELD_OUR_GOAL_BOTTOM_CIRCLE"] if our_goal\
                else self.constant["FIELD_THEIR_GOAL_BOTTOM_CIRCLE"]

            position = stayOutsideSquare(position, y_top, y_bottom, x_left, x_right)
            position = stayOutsideCircle(position, circle_top, self.constant["FIELD_GOAL_RADIUS"] + dist_from_goal_area)
            position = stayOutsideCircle(position, circle_bot, self.constant["FIELD_GOAL_RADIUS"] + dist_from_goal_area)
            return Position(position.x, position.y)

    def stay_inside_play_field(self, position):
        return stayInsideSquare(position, Y_TOP=self.constant["FIELD_Y_TOP"],
                                          Y_BOTTOM=self.constant["FIELD_Y_BOTTOM"],
                                          X_LEFT=self.constant["FIELD_X_LEFT"],
                                          X_RIGHT=self.constant["FIELD_X_RIGHT"])

    def stay_inside_full_field(self, position):
        return stayInsideSquare(position, Y_TOP=self.constant["FIELD_Y_TOP"] + self.constant["FIELD_BOUNDARY_WIDTH"],
                                Y_BOTTOM=self.constant["FIELD_Y_BOTTOM"] - self.constant["FIELD_BOUNDARY_WIDTH"],
                                X_LEFT=self.constant["FIELD_X_LEFT"] - self.constant["FIELD_BOUNDARY_WIDTH"],
                                X_RIGHT=self.constant["FIELD_X_RIGHT"] + self.constant["FIELD_BOUNDARY_WIDTH"])

    def respect_field_rules(self, position):
        new_position = self.stay_outside_goal_area(position, our_goal=False)
        return self.stay_inside_play_field(new_position)


    def update_field_dimensions(self, packets):
        for packet in packets:
            if not packet.HasField("geometry"):
                continue
            field = packet.geometry.field
            if len(field.field_lines) == 0:
                raise RuntimeError("Receiving legacy geometry message instead of the new geometry message. Update your grsim or check your vision port.")

            self.field_lines = self._convert_field_line_segments(field.field_lines)
            self.field_arcs = self._convert_field_circular_arc(field.field_arcs)

            if "RightFieldLeftPenaltyArc" not in self.field_arcs:
                # This is a new type of field for Robocup 2018, it does not have a circular goal zone
                self._defense_radius = self.field_lines["LeftFieldLeftPenaltyStretch"].length
            else:
                self._defense_radius = self.field_arcs['RightFieldLeftPenaltyArc'].radius


            self._field_length = field.field_length
            self._field_width = field.field_width
            self._boundary_width = field.boundary_width
            self._goal_width = field.goal_width
            self._goal_depth = field.goal_depth
            self._center_circle_radius = self.field_arcs['CenterCircle'].radius
            self._defense_stretch = 100 # hard coded parce que cette valeur d'est plus valide et que plusieurs modules en ont de besoin
            #la valeur qu'on avait apres le fix a Babin était de 9295 mm, ce qui est 90 fois la grandeur d'avant.

            self.constant["FIELD_Y_TOP"] = self._field_width / 2
            self.constant["FIELD_Y_BOTTOM"] = -self._field_width / 2
            self.constant["FIELD_X_LEFT"] = -self._field_length / 2
            self.constant["FIELD_X_RIGHT"] = self._field_length / 2

            self.constant["CENTER_CENTER_RADIUS"] = self._center_circle_radius

            self.constant["FIELD_Y_POSITIVE"] = self._field_width / 2
            self.constant["FIELD_Y_NEGATIVE"] = -self._field_width / 2
            self.constant["FIELD_X_NEGATIVE"] = -self._field_length / 2
            self.constant["FIELD_X_POSITIVE"] = self._field_length / 2

            self.constant["FIELD_BOUNDARY_WIDTH"] = self._boundary_width

            self.constant["FIELD_GOAL_RADIUS"] = self._defense_radius
            self.constant["FIELD_GOAL_SEGMENT"] = self._defense_stretch
            self.constant["FIELD_GOAL_WIDTH"] = self._goal_width

            self.constant["FIELD_GOAL_Y_TOP"] = self._defense_radius + (self._defense_stretch / 2)
            self.constant["FIELD_GOAL_Y_BOTTOM"] = -self.constant["FIELD_GOAL_Y_TOP"]


            if self.our_side == FieldSide.POSITIVE:
                self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"] = self.constant["FIELD_X_NEGATIVE"]
                self.constant["FIELD_THEIR_GOAL_X_INTERNAL"] = self.constant["FIELD_X_NEGATIVE"] + self.constant["FIELD_GOAL_RADIUS"]

                self.constant["FIELD_OUR_GOAL_X_INTERNAL"] = self.constant["FIELD_X_POSITIVE"] - self.constant["FIELD_GOAL_RADIUS"]
                self.constant["FIELD_OUR_GOAL_X_EXTERNAL"] = self.constant["FIELD_X_POSITIVE"]

                self.constant["FIELD_THEIR_GOAL_TOP_CIRCLE"] = Position(self.constant["FIELD_X_NEGATIVE"], self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_THEIR_GOAL_BOTTOM_CIRCLE"] = Position(self.constant["FIELD_X_NEGATIVE"], -self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_THEIR_GOAL_MID_GOAL"] = Position(self.constant["FIELD_X_NEGATIVE"], 0)

                self.constant["FIELD_OUR_GOAL_TOP_CIRCLE"] = Position(self.constant["FIELD_X_POSITIVE"], self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_OUR_GOAL_BOTTOM_CIRCLE"] = Position(self.constant["FIELD_X_POSITIVE"], -self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_OUR_GOAL_MID_GOAL"] = Position(self.constant["FIELD_X_POSITIVE"], 0)

            else:
                self.constant["FIELD_OUR_GOAL_X_EXTERNAL"] = self.constant["FIELD_X_NEGATIVE"]
                self.constant["FIELD_OUR_GOAL_X_INTERNAL"] = self.constant["FIELD_X_NEGATIVE"] + self.constant["FIELD_GOAL_RADIUS"]

                self.constant["FIELD_THEIR_GOAL_X_INTERNAL"] = self.constant["FIELD_X_POSITIVE"] - self.constant["FIELD_GOAL_RADIUS"]
                self.constant["FIELD_THEIR_GOAL_X_EXTERNAL"] = self.constant["FIELD_X_POSITIVE"]

                self.constant["FIELD_OUR_GOAL_TOP_CIRCLE"] = Position(self.constant["FIELD_X_NEGATIVE"], self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_OUR_GOAL_BOTTOM_CIRCLE"] = Position(self.constant["FIELD_X_NEGATIVE"], -self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_OUR_GOAL_MID_GOAL"] = Position(self.constant["FIELD_X_NEGATIVE"], 0)

                self.constant["FIELD_THEIR_GOAL_TOP_CIRCLE"] = Position(self.constant["FIELD_X_POSITIVE"], self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_THEIR_GOAL_BOTTOM_CIRCLE"] = Position(self.constant["FIELD_X_POSITIVE"], -self.constant["FIELD_GOAL_SEGMENT"] / 2)
                self.constant["FIELD_THEIR_GOAL_MID_GOAL"] = Position(self.constant["FIELD_X_POSITIVE"], 0)

            self.set_collision_body()
            return True
        return False

    def _convert_field_circular_arc(self, field_arcs):
        result = {}
        for arc in field_arcs:
            result[arc.name] = FieldCircularArc(arc)
        return result

    def _convert_field_line_segments(self, field_lines):
        result = {}
        for line in field_lines:
            result[line.name] = FieldLineSegment(line)
        return result
Esempio n. 9
0
 def __init__(self, p_world_state):
     super().__init__(p_world_state)
     self.debug_interface = DebugInterface()
     self._sanity_check_of_speed_command()