class DirectFreeDefence(StrategyCalcuratorBase): """ referee_branchがDIRECT_FREE_DEFENCEの場合のCalcurator。 """ def __init__(self, objects): self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._ball_params = objects.ball self._dynamic_strategy = DynamicStrategy() self._objects = objects def calcurate(self, strategy_context=None): # type: (StrategyContext) -> StrategyBase if self._detect_enemy_kick(strategy_context): strategy_context.update("enemy_kick", True, namespace="world_model") strategy_context.update("defence_or_attack", False, namespace="world_model") active_robot_ids = self._get_active_robot_ids() active_enemy_ids = self._get_active_enemy_ids() nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball(active_enemy_ids)[0] second_nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball(active_enemy_ids)[1] for robot_id in active_robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" elif robot.get_role() == "LFW": #敵kickerとballの延長線上に移動 status.status = "move_linear" # if second_nearest_enemy_id != None: if True: # status.pid_goal_pos_x, status.pid_goal_pos_y = functions.calculate_internal_dividing_point(self._enemy[nearest_enemy_id].get_current_position()[0], self._enemy[nearest_enemy_id].get_current_position()[1], self._ball_params.get_current_position()[0], self._ball_params.get_current_position()[1], functions.distance_btw_two_points(self._enemy[nearest_enemy_id].get_current_position(), self._ball_params.get_current_position()) + 0.55, -0.55) target_pos_xy = functions.calculate_internal_dividing_point_vector_args(config.GOAL_CENTER, self._ball_params.get_current_position(), 1, 1) status.pid_goal_pos_x = target_pos_xy[0] status.pid_goal_pos_y = target_pos_xy[1] status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0]) ) elif robot.get_role() == "RFW": #フリーで最もゴールに近い敵idを返す status.status = "move_linear" free_enemy_id = self._get_free_enemy_id(4, nearest_enemy_id) status.pid_goal_pos_x = (self._ball_params.get_current_position()[0] + self._enemy[free_enemy_id].get_current_position()[0]) / 2 status.pid_goal_pos_y = (self._ball_params.get_current_position()[1] + self._enemy[free_enemy_id].get_current_position()[1]) / 2 status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0]) ) else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result
def __init__(self, objects): self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._ball_params = objects.ball self._dynamic_strategy = DynamicStrategy() self._objects = objects
def __init__(self, objects): # type: (Objects) -> None self._objects = objects # type: Objects self._robot = self._objects.robot # type: entity. self._enemy = self._objects.enemy self._ball_params = self._objects.ball self._robot_ids = self._objects.get_robot_ids() self._enemy_ids = self._objects.get_enemy_ids() self.placed_ball_position = 0 # 毎ループnewするのは重いので辞書に格納しておく self._static_strategies = { 'initial': InitialStaticStrategy(), 'stop': StopStaticStrategy() } self._dynamic_strategy = DynamicStrategy()
class PenaltyAttack(StrategyCalcuratorBase): """ referee_branchがDIRECT_FREE_ATTACKの場合のCalcurator。 """ def __init__(self, objects): self._objects = objects self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._dynamic_strategy = DynamicStrategy() self._ball_params = objects.ball self.reset() def reset(self): self.history_who_has_a_ball = ["robots" for i in range(10)] def calcurate(self, strategy_context=None, should_wait=True): #print "penalty" if self._get_who_has_a_ball() == "free": pass elif self._get_who_has_a_ball() == "robots": self.history_who_has_a_ball.pop(0) self.history_who_has_a_ball.append("robots") else: self.history_who_has_a_ball.pop(0) self.history_who_has_a_ball.append("enemy") # if self.history_who_has_a_ball.count("enemy") > 5: # strategy_context.update("penalty_finish", True, namespace="world_model") # strategy_context.update("defence_or_attack", False, namespace="world_model") active_robot_ids = self._get_active_robot_ids() for robot_id in active_robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" elif robot.get_role() == "LFW": #敵kickerとballの延長線上に移動 status.status = "move_linear" status.pid_goal_pos_x = 3.0 status.pid_goal_pos_y = 1.5 elif robot.get_role() == "RFW": status.status = "move_linear" status.pid_goal_pos_x = 3.0 status.pid_goal_pos_y = -1.5 else: status.status = "none" if robot_id == active_robot_ids[0]: if should_wait: status.status = "move_linear" status.pid_goal_pos_x = 4.5 status.pid_goal_pos_y = 0.0 else: status.status = "penalty_shoot" if functions.distance_btw_two_points( self._objects.ball.get_current_position(), self._objects.get_robot_by_id( robot_id).get_current_position()) > 1.0: strategy_context.update("penalty_finish", True, namespace="world_model") strategy_context.update("defence_or_attack", False, namespace="world_model") self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result
class IndirectFreeAttack(StrategyCalcuratorBase): """ referee_branchがINDIRECT_FREE_BLUEで自分もBLUE、または referee_branchがINDIRECT_FREE_YELLOWで自分もYELLOW の場合のCalcurator。 今回は決め打ちで作る 1. ボールの位置がハーフラインより手前にあるとき Defenderの一番近い子がAttacker1(positions_1)にボールを蹴る Defenderは蹴ったあとは守備モード Attacker1がAttacker2(positions_2)にボールを蹴る Attacker1はGoal側に走っておき(positions_3)、passモードにしておく(to Goal) Attacker2はそのままシュート 2. ボールの位置がハーフラインより奥側にあるとき Attacker1がAttacker2(positions_2)にボールを蹴る Attacker1はGoal側に走っておき(positions_3)、passモードにしておく(to Goal) Attacker2はそのままシュート """ def __init__(self, objects): self._objects = objects self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._dynamic_strategy = DynamicStrategy() self._ball_params = objects.ball self.reset() def reset(self): # パス先の決定 self._upper_positions_1 = [ [3.5, 2.5], [3.5, 2.0], [3.0, 2.0], ] self._lower_positions_1 = [ [3.5, -2.5], [3.5, -2.0], [3.0, -2.0], ] self._upper_positions_2 = [ [3.5, 2.5], [3.5, 2.0], [3.0, 2.0], ] self._lower_positions_2 = [ [3.5, -2.5], [3.5, -2.0], [3.0, -2.0], ] self._upper_positions_3 = [ [4.0, 0.5], [4.0, 0.6], [4.0, 0.4], ] self._lower_positions_3 = [ [4.0, -0.5], [4.0, -0.6], [4.0, -0.4], ] self.passed_1_flg = False self.received_1_flg = False self.passed_2_flg = False self.received_2_flg = False self.passed_3_flg = False self.received_3_flg = False self.history_who_has_a_ball = ["robots" for i in range(10)] self.ball_position_x = self._objects.ball.get_current_position()[0] self.ball_position_y = self._objects.ball.get_current_position()[1] # ボールの位置が下側のときは受け手は上側にする、逆もまたしかり # position_1はFW_1が行く場所 (ボールが2mラインより左側にいるときに利用する、右側の時は使わない) # position2はFW2が行く場所 # position3はFW1がボールを蹴ったあとに行く場所 if self.ball_position_x <= 6.5: if self.ball_position_y <= 0.: positions_1 = self._upper_positions_1 positions_2 = self._lower_positions_2 positions_3 = self._upper_positions_3 else: positions_1 = self._lower_positions_1 positions_2 = self._upper_positions_2 positions_3 = self._lower_positions_3 else: if self.ball_position_y <= 0.: positions_1 = False positions_2 = self._upper_positions_2 positions_3 = self._lower_positions_3 else: positions_1 = False positions_2 = self._lower_positions_2 positions_3 = self._upper_positions_3 if positions_1: choice_index = np.random.choice(len(positions_1)) self.position_1 = positions_1[choice_index] else: self.position_1 = False choice_index = np.random.choice(len(positions_2)) self.position_2 = positions_2[choice_index] choice_index = np.random.choice(len(positions_3)) self.position_3 = positions_3[choice_index] roles = set([ self._robot[robot_id].get_role() for robot_id in self._objects.get_active_robot_ids() ]) # position1 ~ position3の位置を決定 if self.position_1 and self.position_1[1] >= 0.: self.position_1_nearest_id = self._objects.get_robot_id_by_role( "LFW") self.position_2_nearest_id = self._objects.get_robot_id_by_role( "RFW") if "LDF" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "LDF") elif "RDF" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "RDF") elif "GK" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "GK") else: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "RFW") else: self.position_1_nearest_id = self._objects.get_robot_id_by_role( "RFW") self.position_2_nearest_id = self._objects.get_robot_id_by_role( "LFW") if "RDF" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "RDF") elif "LDF" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "LDF") elif "GK" in roles: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "GK") else: self.ball_position_nearest_id = self._objects.get_robot_id_by_role( "RFW") #self.position_2_nearest_id = self._objects.get_robot_ids_sorted_by_distance(self.position_2)[0] #self.ball_position_nearest_id = self._objects.get_robot_ids_sorted_by_distance([self.ball_position_x, self.ball_position_y])[0] self.GK_id = self._objects.get_robot_id_by_role("GK") self.LDF_id = self._objects.get_robot_id_by_role("LDF") self.RDF_id = self._objects.get_robot_id_by_role("RDF") self.last_calcurate = "calcurate_1" # indirect時、パスを回すか、shootをうつか # ここから下はdirect用 self.ckl_flg = False self.ckr_flg = False # 蹴るターゲット if "LFW" in roles and "RFW" in roles: lr = ["LFW", "RFW"] elif "LFW" in roles: lr = ["LFW"] elif "RFW" in roles: lr = ["RFW"] else: lr = ["RFW"] self.lfw_or_rfw = np.random.choice(lr) def calcurate(self, strategy_context=None): # type: (StrategyContext) -> StrategyBase if self._get_who_has_a_ball() == "free": pass elif self._get_who_has_a_ball() == "robots": self.history_who_has_a_ball.pop(0) self.history_who_has_a_ball.append("robots") else: self.history_who_has_a_ball.pop(0) self.history_who_has_a_ball.append("enemy") if self.history_who_has_a_ball.count("enemy") > 5: strategy_context.update("indirect_finish", True, namespace="world_model") strategy_context.update("defence_or_attack", False, namespace="world_model") if self._objects.ball.get_current_position()[1] >= 0.: result = self.calculate_indirect_left() else: result = self.calculate_indirect_right() return result def calculate_1(self, strategy_context=None): # print 'passed_1_flg:', self.passed_1_flg # print 'received_1_flg:', self.received_1_flg # print 'passed_2_flg:',self.passed_2_flg # print 'received_2_flg:', self.received_2_flg # print 'passed_3_flg:', self.passed_3_flg # print 'received_3_flg:', self.received_3_flg """ハーフラインより左側の戦略(の予定)""" ball_x, ball_y = self._objects.ball.get_current_position() active_enemy_ids = self._get_active_enemy_ids() nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball( active_enemy_ids)[0] for robot_id in self._robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if self.ball_position_nearest_id == robot_id: if self.passed_1_flg: # パス完了した場合 if self._objects.robot[robot_id].get_role() == "LDF": status.status = "defence4" else: status.status = "defence3" else: # パス完了する前 パス先をposition1にする、パス完了したら完了flgを立てる status.status = "pass" status.pass_target_pos_x = self._objects.get_robot_by_id( self.position_1_nearest_id).get_current_position()[0] status.pass_target_pos_y = self._objects.get_robot_by_id( self.position_1_nearest_id).get_current_position()[1] if self._objects.get_has_a_ball(robot_id): self.received_1_flg = True if self.received_1_flg and self._objects.get_has_a_ball( robot_id) == False: self.passed_1_flg = True elif robot_id == self.position_1_nearest_id: if self.received_3_flg: #シュートを打つ子がボールを受け取ったあとはこの機体もシュート体制に入る(おこぼれを狙うイメージ) #status.status = "pass" if self.position_2[1] > 0.: status.status = "shoot_left" # status.pass_target_pos_x = 6.0 # status.pass_target_pos_y = 0.55 else: status.status = "shoot_right" # status.pass_target_pos_x = 6.0 # status.pass_target_pos_y = -0.55 elif self.passed_2_flg: # 自分がパスしたあとはゴール前のposition_3に移動 status.status = "move_linear" status.pid_goal_pos_x = self.position_1[0] status.pid_goal_pos_y = self.position_1[1] status.pid_goal_theta = 0. elif self.received_2_flg: # レシーブしたあとはパスに切り替え status.status = "pass" status.pass_target_pos_x = self._objects.get_robot_by_id( self.position_2_nearest_id).get_current_position()[0] status.pass_target_pos_y = self._objects.get_robot_by_id( self.position_2_nearest_id).get_current_position()[1] if self._objects.get_has_a_ball(self.position_2_nearest_id, threshold=0.20) == True: self.passed_2_flg else: status.status = "receive" status.pid_goal_pos_x = self.position_1[0] status.pid_goal_pos_y = self.position_1[1] if self._objects.get_has_a_ball(robot_id): self.received_2_flg = True elif robot_id == self.position_2_nearest_id: if self.passed_3_flg: status.status = "move_linear" if nearest_enemy_id != None: status.pid_goal_pos_x, status.pid_goal_pos_y = functions.calculate_internal_dividing_point( self._enemy[nearest_enemy_id].get_current_position( )[0], self._enemy[nearest_enemy_id].get_current_position( )[1], self._ball_params.get_current_position()[0], self._ball_params.get_current_position()[1], functions.distance_btw_two_points( self._enemy[nearest_enemy_id]. get_current_position(), self._ball_params.get_current_position()) + 0.55, -0.55) status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - robot.get_current_position()[1]), (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) elif self.received_3_flg: # status.status = "pass" if self.position_3[1] > 0.: status.status = "shoot_left" # status.pass_target_pos_x = 6.0 # status.pass_target_pos_y = 0.55 else: status.status = "shoot_right" # status.pass_target_pos_x = 6.0 # status.pass_target_pos_y = -0.55 if self._objects.get_has_a_ball(robot_id) == False: self.passed_3_flg = True else: status.status = "receive" status.pid_goal_pos_x = self.position_2[0] status.pid_goal_pos_y = self.position_2[1] if self._objects.get_has_a_ball(robot_id): self.received_3_flg = True elif robot_id == self.GK_id: status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" else: print 'error' self._dynamic_strategy.set_robot_status(robot_id, status) return self._dynamic_strategy def calculate_defense(self, strategy_context=None): # type: (StrategyContext) -> StrategyBase active_robot_ids = self._get_active_robot_ids() active_enemy_ids = self._get_active_enemy_ids() status = Status() nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball( active_enemy_ids)[0] for robot_id in active_robot_ids: robot = self._objects.get_robot_by_id(robot_id) if robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" elif robot.get_role() == "LFW": #敵kickerとballの延長線上に移動 status.status = "move_linear" if nearest_enemy_id != None: status.pid_goal_pos_x, status.pid_goal_pos_y = functions.calculate_internal_dividing_point( self._enemy[nearest_enemy_id].get_current_position() [0], self._enemy[nearest_enemy_id].get_current_position() [1], self._ball_params.get_current_position()[0], self._ball_params.get_current_position()[1], functions.distance_btw_two_points( self._enemy[nearest_enemy_id].get_current_position( ), self._ball_params.get_current_position()) + 0.55, -0.55) status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - self._robot[3].get_current_position()[1]), (self._ball_params.get_current_position()[0] - self._robot[2].get_current_position()[0])) elif robot.get_role() == "RFW": #フリーで最もゴールに近い敵idを返す status.status = "move_linear" free_enemy_id = self._get_free_enemy_id(4, nearest_enemy_id) status.pid_goal_pos_x = ( self._ball_params.get_current_position()[0] + self._enemy[free_enemy_id].get_current_position()[0]) / 2 status.pid_goal_pos_y = ( self._ball_params.get_current_position()[1] + self._enemy[free_enemy_id].get_current_position()[1]) / 2 status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - self._robot[4].get_current_position()[1]), (self._ball_params.get_current_position()[0] - self._robot[4].get_current_position()[0])) else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result def calculate_indirect_left(self, strategy_context=None): active_robot_ids = self._get_active_robot_ids() for robot_id in active_robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if self.ball_position_nearest_id == robot_id: if self.passed_1_flg: # パス完了した場合 if self._objects.robot[robot_id].get_role() == "LDF": status.status = "defence4" else: status.status = "defence3" else: # パス完了する前 パス先をposition1にする、パス完了したら完了flgを立てる status.status = "pass" status.pass_target_pos_x = self._objects.get_robot_by_role( self.lfw_or_rfw).get_current_position()[0] status.pass_target_pos_y = self._objects.get_robot_by_role( self.lfw_or_rfw).get_current_position()[1] if self._objects.get_has_a_ball(robot_id): self.received_1_flg = True if self.received_1_flg and self._objects.get_has_a_ball( robot_id) == False: self.passed_1_flg = True elif robot_id == self.position_1_nearest_id: position = self.position_3 if self.received_2_flg: status.status = "shoot_right" if self._objects.get_has_a_ball(robot_id) == False: self.passed_2_flg = True else: status.status = "receive" status.pid_goal_pos_x = position[0] status.pid_goal_pos_y = position[1] if self._objects.get_has_a_ball(robot_id): self.received_2_flg = True elif robot_id == self.position_2_nearest_id: position = self.position_2 if self.received_3_flg: status.status = "shoot_left" if self._objects.get_has_a_ball(robot_id) == False: self.passed_3_flg = True else: status.status = "receive" status.pid_goal_pos_x = position[0] status.pid_goal_pos_y = position[1] if self._objects.get_has_a_ball(robot_id): self.received_3_flg = True elif robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result def calculate_indirect_right(self, strategy_context=None): active_robot_ids = self._get_active_robot_ids() for robot_id in active_robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if self.ball_position_nearest_id == robot_id: if self.passed_1_flg: # パス完了した場合 if self._objects.robot[robot_id].get_role() == "LDF": status.status = "defence4" else: status.status = "defence3" else: # パス完了する前 パス先をposition1にする、パス完了したら完了flgを立てる status.status = "pass" status.pass_target_pos_x = self._objects.get_robot_by_role( self.lfw_or_rfw).get_current_position()[0] status.pass_target_pos_y = self._objects.get_robot_by_role( self.lfw_or_rfw).get_current_position()[1] if self._objects.get_has_a_ball(robot_id): self.received_1_flg = True if self.received_1_flg and self._objects.get_has_a_ball( robot_id) == False: self.passed_1_flg = True elif robot_id == self.position_1_nearest_id: position = self.position_3 if self.received_2_flg: status.status = "shoot_left" if self._objects.get_has_a_ball(robot_id) == False: self.passed_2_flg = True else: status.status = "receive" status.pid_goal_pos_x = position[0] status.pid_goal_pos_y = position[1] if self._objects.get_has_a_ball(robot_id): self.received_2_flg = True elif robot_id == self.position_2_nearest_id: position = self.position_2 if self.received_3_flg: status.status = "shoot_right" if self._objects.get_has_a_ball(robot_id) == False: self.passed_3_flg = True else: status.status = "receive" status.pid_goal_pos_x = position[0] status.pid_goal_pos_y = position[1] if self._objects.get_has_a_ball(robot_id): self.received_3_flg = True elif robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result
class NormalStartPenaltyDefenceStrategyCalcurator(StrategyCalcuratorBase): """ referee_branchがPENALTY_DEFENCEの場合のCalcurator。 """ def __init__(self, objects): self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._ball_params = objects.ball self._dynamic_strategy = DynamicStrategy() self._objects = objects def calcurate(self, strategy_context=None, referee_branch="PENALTY_DEFENCE"): # type: (StrategyContext) -> StrategyBase if referee_branch == "NORMAL_START": if self._detect_enemy_kick(strategy_context): strategy_context.update("enemy_kick", True, namespace="world_model") strategy_context.update("defence_or_attack", False, namespace="world_model") else: strategy_context.update("placed_ball_position", self._ball_params.get_current_position(), namespace="world_model") active_robot_ids = self._get_active_robot_ids() active_enemy_ids = self._get_active_enemy_ids() nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball(active_enemy_ids)[0] for robot_id in active_robot_ids: status = Status() robot = self._objects.get_robot_by_id(robot_id) if robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": #固定値へ移動 status.status = "move_linear" status.pid_goal_pos_x = -4.0 status.pid_goal_pos_y = 4.0 status.pid_goal_theta = math.atan2((self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) elif robot.get_role() == "RDF": #固定値へ移動 status.status = "move_linear" status.pid_goal_pos_x = -3.5 status.pid_goal_pos_y = 4.0 status.pid_goal_theta = math.atan2((self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) elif robot.get_role() == "LFW": #固定値へ移動 status.status = "move_linear" status.pid_goal_pos_x = -3.0 status.pid_goal_pos_y = 4.0 status.pid_goal_theta = math.atan2((self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) elif robot.get_role() == "RFW": #固定値へ移動 status.status = "move_linear" status.pid_goal_pos_x = -2.5 status.pid_goal_pos_y = 4.0 status.pid_goal_theta = math.atan2((self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result
class NormalStartKickOffDefenceStrategyCalcurator(StrategyCalcuratorBase): """ referee_branchがKICKOFF_DEFENCEの場合のCalcurator。 """ def __init__(self, objects): self._robot = objects.robot self._enemy = objects.enemy self._robot_ids = objects.get_robot_ids() self._enemy_ids = objects.get_enemy_ids() self._ball_params = objects.ball self._dynamic_strategy = DynamicStrategy() self._objects = objects def calcurate(self, strategy_context=None, referee_branch="KICKOFF_DEFENCE"): # type: (StrategyContext) -> StrategyBase if referee_branch == "NORMAL_START": if self._detect_enemy_kick(strategy_context): strategy_context.update("enemy_kick", True, namespace="world_model") strategy_context.update("defence_or_attack", False, namespace="world_model") else: strategy_context.update("placed_ball_position", self._ball_params.get_current_position(), namespace="world_model") active_robot_ids = self._get_active_robot_ids() active_enemy_ids = self._get_active_enemy_ids() status = Status() nearest_enemy_id = self._objects.get_enemy_ids_sorted_by_distance_to_ball(active_enemy_ids)[0] for idx, robot_id in enumerate(active_robot_ids): robot = self._objects.get_robot_by_id(robot_id) if robot.get_role() == "GK": status.status = "keeper" elif robot.get_role() == "LDF": status.status = "defence4" elif robot.get_role() == "RDF": status.status = "defence3" elif robot.get_role() == "LFW": #敵kickerとballの延長線上に移動 status.status = "move_linear" if nearest_enemy_id != None: status.pid_goal_pos_x, status.pid_goal_pos_y = functions.calculate_internal_dividing_point( self._objects.get_enemy_by_id(nearest_enemy_id).get_current_position()[0], self._objects.get_enemy_by_id(nearest_enemy_id).get_current_position()[1], self._ball_params.get_current_position()[0], self._ball_params.get_current_position()[1], functions.distance_btw_two_points(self._objects.get_enemy_by_id(nearest_enemy_id).get_current_position(), self._ball_params.get_current_position()) + 0.8, -0.8) status.pid_goal_theta = math.atan2((self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0])) if status.pid_goal_pos_x >= -0.2 and status.pid_goal_pos_y >= 0: status.pid_goal_pos_x = -0.2 status.pid_goal_pos_y = 0.8 elif status.pid_goal_pos_x >= -0.2 and status.pid_goal_pos_y < 0: status.pid_goal_pos_x = -0.2 status.pid_goal_pos_y = -0.8 elif robot.get_role() == "RFW": #固定位置 status.status = "move_linear" free_enemy_id = self._get_free_enemy_id(4, nearest_enemy_id) status.pid_goal_pos_x = -3. status.pid_goal_pos_y = 0. status.pid_goal_theta = math.atan2( (self._ball_params.get_current_position()[1] - robot.get_current_position()[1]) , (self._ball_params.get_current_position()[0] - robot.get_current_position()[0]) ) else: status.status = "none" self._dynamic_strategy.set_robot_status(robot_id, status) result = self._dynamic_strategy return result