def _correction_rotation(self, t, post_u, post_v, image_u, image_v):
     """
     Korrigiert die Drehung der beiden Tore nachdem die Tormittelpunkte korrigiert wurden.
     """
     # dreh winkel herausfinden
     post_distance, post_angel = convert_uv2polar(post_u, post_v)
     image_distance, image_angel = convert_uv2polar(image_u, image_v)
     # print image_angel, post_angel
     correction_angle = image_angel - post_angel
    def reset_to_own(self):
        # initilize with position in middle of our side
        config = get_config()['field']
        self.length = config['length']
        goal_width = config['goal-width']
        self.goal_posts.append(GoalPost(*convert_uv2polar(-self.length / 4, -goal_width / 2)))
        self.goal_posts.append(GoalPost(*convert_uv2polar(-self.length / 4, goal_width / 2)))
        self.goal_posts.append(GoalPost(*convert_uv2polar(self.length / 4 * 3, goal_width / 2)))
        self.goal_posts.append(GoalPost(*convert_uv2polar(self.length / 4 * 3, -goal_width / 2)))
        # am anfang sollte das Tor 0 unseres sein
        self.own_goal = config['own-goal']

        self.object_list['middle_point'] = LocalObject(*convert_uv2polar(self.length / 4, 0))
 def _match_one(self, goal_info):
     """
     Findet bei nur einem sichtbaren Torpfosten heraus welche von den
     gemerkten Positionen die zugehörige ist und korrigiert diese dann
     anhand des gesehenen Torpfostens. Auch alle anderen Torpfosten
     werden um die gleichen Werte verschoben, weil unsere Odometrie
     wohl falsche Werte geliefert hat und dies betrifft dann auch die
     anderen Pfosten.
     """
     distance, angel = convert_uv2polar(goal_info.u, goal_info.v)
     if distance < 1:
         # wenn es weniger als 1mm ist wirds unten doof
         distance = 1
     min_delta = 99999999999999
     min_goal_post = None
     # hier wird der nähste Pfosten gesucht
     for goal_post in self.goal_posts:
         # abs weil floatmagie
         delta = sqrt(abs(
             distance ** 2 + goal_post.distance ** 2 -
             2 * distance * goal_post.distance * cos(angel - goal_post.angel)))
         if delta < min_delta:
             min_delta = delta
             min_goal_post = goal_post
     delta_distance = distance - min_goal_post.distance
     delta_angel = angel - min_goal_post.angel
     # jetzt werden alle Pfosten neu lokalisiert
     if delta_distance > 1000:  # todo wert evaluieren und config
         # wir rotieren nur, wenn wir weit genug weg sind
         self.rotate(self._wrap_angel(delta_angel))
     self.move(*self._calculate_move(delta_distance, min_goal_post.angel))
    def perform(self, connector, reevaluate=False):

        # search complete goal
        connector.blackboard_capsule().set_priorities(enemy_goal_priority=0, ball_priority=0, own_goal_priority=0,
                                                      align_priority=1510)
        connector.blackboard_capsule().cancel_ball_tracking()
        connector.walking_capsule().stop_walking()
        self.do_not_reevaluate()

        # waits for result from head
        if not connector.blackboard_capsule().get_complete_goal_found() and \
                not connector.blackboard_capsule().get_cant_find_complete_goal():
            return self.push(Wait, 0.1)

        # if found
        if connector.blackboard_capsule().get_complete_goal_found():
            connector.blackboard_capsule().unset_complete_goal_found()

            goal_center = connector.blackboard_capsule().get_complete_goal_center()
            goal_distance = math.sqrt(goal_center[0] ** 2 + goal_center[1] ** 2)
            goal_polar = convert_uv2polar(goal_center[0], goal_center[1])
            goal_angle = math.degrees(goal_polar[1])
            # test if own goal
            right_goal = self.test_if_right_goal(connector, goal_distance)
            goal_v = goal_center[1]
            # compute angle to move
            if not right_goal:
                say("Do not shot on own goal")
                sign = self.sign(goal_angle)
                goal_angle += 180 * sign
                # ausgleich, wenns über 180 rüber geht, weil unsere polarwerte so funktionieren
                # math if it is more than 180, because our polarvalues work this way
                if goal_angle < -180:
                    goal_angle = 180 - (abs(goal_angle) - 180)
                elif goal_angle > 180:
                    goal_angle = -180 + (abs(goal_angle) - 180)

                if goal_v > 0:
                    goal_v -= 10000
                else:
                    goal_v += 10000

            if False:
                # if goodangle
                if abs(goal_angle) < 30:
                    # shoot
                    connector.blackboard_capsule().set_finished_align()
                    connector.blackboard_capsule().set_priorities(enemy_goal_priority=0, ball_priority=1000,
                                                                  own_goal_priority=0, align_priority=0)
                    say("kick")
                    return self.interrupt()
                # else (useful comment...)
                else:
                    say("start")
                    # feste zahl drehen
                    # turn fixed value
                    factor = 0.2
                    # chose direction
                    if self.sign(goal_angle) == 1:
                        return self.push(PlainWalkAction, [[WalkingCapsule.ZERO, WalkingCapsule.MEDIUM_ANGULAR_LEFT,
                                                            WalkingCapsule.SLOW_SIDEWARDS_RIGHT,
                                                            abs(goal_angle) * factor]])
                    else:
                        return self.push(PlainWalkAction, [[WalkingCapsule.ZERO, WalkingCapsule.MEDIUM_ANGULAR_RIGHT,
                                                            WalkingCapsule.SLOW_SIDEWARDS_LEFT,
                                                            abs(goal_angle) * factor]])
                        # warten abbuf ende der drehung nicht nötig,
                        # da wir dann einfach wieder oben anfangen und neu nach dem tor suchen

            if False:  # should work
                if goal_angle < -30:
                    say("Kick Ball right")
                    return self.push(KickBall, init_data="SRK")
                elif goal_angle > 30:
                    say("Kick Ball left")
                    return self.push(KickBall, init_data="SLK")
                else:
                    if connector.raw_vision_capsule().get_ball_info("v") <= 0:
                        say("Kick Strong")
                        return self.push(KickBall, init_data="RP")
                    else:
                        say("Kick Strong")
                        return self.push(KickBall, init_data="LP")

            if True:
                if (goal_distance > 2000 and abs(goal_angle > 30)) or (goal_distance <= 2000 and abs(goal_v) > 1000):
                    if goal_angle < 0:
                        say("Kick Ball right")
                        return self.push(KickBall, init_data="SRK")
                    elif goal_angle >= 0:
                        say("Kick Ball left")
                        return self.push(KickBall, init_data="SLK")
                else:
                    if connector.raw_vision_capsule().get_ball_info("v") <= 0:
                        say("Kick Strong")
                        return self.push(KickBall, init_data="RP")
                    else:
                        say("Kick Strong")
                        return self.push(KickBall, init_data="LP")
        else:
            connector.blackboard_capsule().unset_cant_find_complete_goal()
            # shoot, to do at least anything
            connector.blackboard_capsule().set_finished_align()
            say("Cant find goal")
            connector.blackboard_capsule().set_priorities(enemy_goal_priority=0, ball_priority=1000,
                                                          own_goal_priority=0, align_priority=0)
            if connector.raw_vision_capsule().get_ball_info("v") <= 0:
                say("Kick Strong")
                return self.push(KickBall, init_data="RP")
            else:
                say("Kick Strong")
                return self.push(KickBall, init_data="LP")
 def set_position(self, u, v):
     self.distance, self.angel = convert_uv2polar(u, v)
 def move(self, u, v):
     """
     Verschiebt die Koordinaten um u, v im Khartesischen Koordinatensystem
     """
     u1, v1 = self.get_uv()
     self.distance, self.angel = convert_uv2polar(u + u1, v + v1)
    def _match_two(self, goal_info1, goal_info2):
        """
        Funktioniert wie match_one bloß, dass der Mittelpunkt der Tore
        genommen wird um die Verschiebung zur Odometrie zu bestimmen.
        """
        distance1, angel1 = convert_uv2polar(goal_info1.u, goal_info1.v)
        distance2, angel2 = convert_uv2polar(goal_info2.u, goal_info2.v)
        if distance1 < 1:
            # wenn es weniger als 1mm ist wirds unten doof
            distance1 = 1
        if distance2 < 1:
            # wenn es weniger als 1mm ist wirds unten doof
            distance2 = 1
        # Mittelpunkt des gesehenen Tors
        avg_distance = (distance1 + distance2) / 2
        avg_angel = (angel1 + angel2) / 2

        # Mittelpunkte der gespeicherten Tore
        avg_goal1_distance, avg_goal1_angel = self._get_goal_middel_poolar(0)
        avg_goal2_distance, avg_goal2_angel = self._get_goal_middel_poolar(1)
        # Differenz zwischen gespeicherten Toren und dem gesehen
        # abs weil float magie, machmal ist der inner ausdruck endgegend
        # der Mathematik negativ
        delta1 = sqrt(abs(
            avg_distance ** 2 + avg_goal1_distance ** 2 -
            2 * avg_distance * avg_goal1_distance * cos(avg_angel - avg_goal1_angel)))
        delta2 = sqrt(abs(
            avg_distance ** 2 + avg_goal2_distance ** 2 -
            2 * avg_distance * avg_goal2_distance * cos(avg_angel - avg_goal2_angel)))


        # entscheidung welches Tor das richtige ist
        if delta1 < delta2:
            delta_distance = avg_distance - avg_goal1_distance
            delta_angel = avg_angel - avg_goal1_angel
            goal = 0
        else:
            delta_distance = avg_distance - avg_goal2_distance
            delta_angel = avg_angel - avg_goal2_angel
            goal = 1
        # korrektur der gespeicherten Daten

        self.rotate(self._wrap_angel(delta_angel))
        self.move(*self._calculate_move(delta_distance, self._get_goal_middel_poolar(goal)[1]))

        # drehung der in sich Tore korrigieren

        # rausfinden welches das gemachte tor ist

        if delta1 < delta2:
            post1 = self.goal_posts[0]
            post2 = self.goal_posts[1]
            avg_distance, avg_angel = self._get_goal_middel_poolar(0)
        else:
            post1 = self.goal_posts[2]
            post2 = self.goal_posts[3]
            avg_distance, avg_angel = self._get_goal_middel_poolar(1)
        turnpoint_u, turnpoint_v = convert_polar2uv(avg_distance, avg_angel)
        post_u, post_v = post1.get_uv()

        # schaun welche goalinfo die richtige von dem torpfosten ist
        delta1_u = abs(post_u - goal_info1.u)
        delta1_v = abs(post_v - goal_info1.v)
        delta2_u = abs(post_u - goal_info2.u)
        delta2_v = abs(post_v - goal_info2.v)

        # drehpunkt in tor mitte verschieben
        # drehpunkt u und v

        # alle pfosten transformieren
        self.move(-turnpoint_u, -turnpoint_v, False)
        post_u, post_v = post1.get_uv()
        if delta1_u + delta1_v < delta2_u + delta2_v:
            self._correction_rotation(1, post_u, post_v, goal_info1.u - turnpoint_u, goal_info1.v - turnpoint_v)
        else:
            self._correction_rotation(1, post_u, post_v, goal_info2.u - turnpoint_u, goal_info2.v - turnpoint_v)

        # Transformation rückgängig machen
        self.move(turnpoint_u, turnpoint_v, False)