def left_knee_moving(self): lhip = self.kp[2][12] lknee = self.kp[2][13] lfoot = self.kp[2][14] angle = p3_angle(lhip, lknee, lfoot) if 170 <= angle: self.feedback["left_knee_moving"] = { 0: 2, 1: angle, 2: "무릎이 안정적으로 움직이고 있습니다.", } elif 160 <= angle: self.feedback["left_knee_moving"] = { 0: 1, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." } else: self.feedback["left_knee_moving"] = { 0: 0, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." }
def chicken_wing(self): lshoulder = self.kp[6][5] lelbow = self.kp[6][6] lwrist = self.kp[6][7] angle = p3_angle(lshoulder, lelbow, lwrist) if 160 <= angle: self.feedback["chicken_wing"] = {0: 2, 1: angle, 2: "치킨윙 체크"} elif 150 <= angle: self.feedback["chicken_wing"] = { 0: 1, 1: angle, 2: "임팩트 후 팔이 곧게 펴지는 것이 좋습니다. 릴리즈 자세에서 클럽이 손을 앞으로 당기는 느낌이 들도록 연습해보세요." } else: self.feedback["chicken_wing"] = { 0: 0, 1: angle, 2: "임팩트 후 팔이 곧게 펴지는 것이 좋습니다. 릴리즈 자세에서 클럽이 손을 앞으로 당기는 느낌이 들도록 연습해보세요." }
def bending_knee(self): lhip = self.kp[2][12] lknee = self.kp[2][13] lfoot = self.kp[2][14] angle = p3_angle(lhip, lknee, lfoot) if 140 <= angle <= 150: self.feedback["bending_knee"] = { 0: 2, 1: angle, 2: "골반 움직임이 안정적입니다." } elif 135 <= angle <= 158: self.feedback["bending_knee"] = { 0: 1, 1: angle, 2: "오른 무릎에 적당한 유연함이 필요합니다. 무릎을 너무 펴서 다리가 잠기게 되면 골반이 오른쪽으로 틀어지게 돼 스윙 궤도가 불안정해집니다." } else: self.feedback["bending_knee"] = { 0: 0, 1: angle, 2: "오른 무릎에 적당한 유연함이 필요합니다. 무릎을 너무 펴서 다리가 잠기게 되면 골반이 오른쪽으로 틀어지게 돼 스윙 궤도가 불안정해집니다." }
def back_angle(self): oue = self.kp[0][9] chukan = self.kp[0][10] sita = self.kp[0][11] angle = p3_angle(oue, chukan, sita) if 148 <= angle <= 153: self.feedback["back_angle"] = { 0: 2, 1: angle, 2: "good" } elif 144 <= angle <= 147: self.feedback["back_angle"] = { 0: 1, 1: angle, 2: "So So" } else: self.feedback["back_angle"] = { 0: 0, 1: angle, 2: "Bad" }
def left_knee_moving(self): lhip = self.kp[3][12] lknee = self.kp[3][13] lfoot = self.kp[3][14] angle = p3_angle(lhip, lknee, lfoot) if 165 <= angle: self.feedback["left_knee_moving"] = { 0: 2, 1: angle, 2: "체중 이동 시 왼 다리 이동 체크" } elif 150 <= angle: self.feedback["left_knee_moving"] = { 0: 1, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." } else: self.feedback["left_knee_moving"] = { 0: 0, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." }
def early_cocking(self): club = self.kp[1][25] # 모델이 클럽 헤드를 제대로 감지하지 못 한 경우 패스 if club[0] == 0: self.feedback["early_cocking"] = { 0: 0, 1: 0, 2: "클럽 헤드를 감지하지 못 했습니다." } return wrist = self.kp[1][4] shoulder = self.kp[1][2] angle = p3_angle(club, wrist, shoulder) if 100 <= angle: self.feedback["early_cocking"] = {0: 2, 1: angle, 2: ""} elif 90 <= angle: self.feedback["early_cocking"] = { 0: 1, 1: angle, 2: "코킹을 늦춰보세요. 이른 코킹은 비거리 손실을 가져옵니다." } else: self.feedback["early_cocking"] = { 0: 0, 1: angle, 2: "코킹을 늦춰보세요. 이른 코킹은 비거리 손실을 가져옵니다." }
def left_wrist_flat(self): lshoulder = self.kp[3][4] head = self.kp[3][25] lwrist = self.kp[3][5] angle = p3_angle(lshoulder, head, lwrist) if 0 <= angle <= 18: self.feedback["left_wrist_flat"] = {0: 2, 1: angle, 2: "손목 힌지 체크"} elif 0 <= angle <= 60: self.feedback["left_wrist_flat"] = { 0: 1, 1: angle, 2: "손목을 안쪽으로 말거나 바깥으로 접은 채 스윙 시 공에 사이드 스핀을 발생시킬 수 있어요. 적절한 손목 힌지가 공의 직진성을 높입니다." } else: self.feedback["left_wrist_flat"] = { 0: 0, 1: angle, 2: "손목을 안쪽으로 말거나 바깥으로 접은 채 스윙 시 공에 사이드 스핀을 발생시킬 수 있어요. 적절한 손목 힌지가 공의 직진성을 높입니다." }
def back_face_target(self): lshoulder = self.kp[3][5] rshoulder = self.kp[3][2] lfoot = self.kp[3][14] angle = p3_angle(lshoulder, rshoulder, lfoot) if 70 <= angle <= 80: self.feedback["back_face_target"] = {0: 2, 1: angle, 2: "적당한 회전"} elif 65 <= angle <= 88: self.feedback["back_face_target"] = { 0: 1, 1: angle, 2: "탑자세에서 어깨가 공을 바라보는 정도로 회전하는 것이 이상적입니다. 너무 느슨하거나 지나친 회전은 피해야 합니다." } else: self.feedback["back_face_target"] = { 0: 0, 1: angle, 2: "탑자세에서 어깨가 공을 바라보는 정도로 회전하는 것이 이상적입니다. 너무 느슨하거나 지나친 회전은 피해야 합니다." }
def parallel_shaft(self): rfoot = self.kp[3][11] lwrits = self.kp[3][4] club = self.kp[3][25] if club[0] == 0: self.feedback["parallel_shaft"] = { 0: 2, 1: 0, 2: "클럽 헤드를 감지하지 못 했습니다." } angle = p3_angle(rfoot, lwrits, club) if 95 <= angle <= 115: self.feedback["parallel_shaft"] = {0: 2, 1: angle, 2: "클럽이 지면과 평행"} elif 90 <= angle <= 120: self.feedback["parallel_shaft"] = { 0: 1, 1: angle, 2: "적절한 손목 힌지와 몸의 회전 시 클럽이 지면과 평행하게 되는 것이 자연스럽습니다. 너무 적거나 지나친 회전은 피해야합니다." } else: self.feedback["parallel_shaft"] = { 0: 0, 1: angle, 2: "적절한 손목 힌지와 몸의 회전 시 클럽이 지면과 평행하게 되는 것이 자연스럽습니다. 너무 적거나 지나친 회전은 피해야합니다." }
def knee_angle(self): upfoot = self.kp[0][9] middlefoot = self.kp[0][10] downfoot = self.kp[0][11] angle = p3_angle(upfoot, middlefoot, downfoot) if 154 <= angle <= 156: self.feedback["knee_angle"] = { 0: 2, 1: angle, 2: "good" } elif 150 <= angle <= 161: self.feedback["knee_angle"] = { 0: 1, 1: angle, 2: "So So" } else: self.feedback["knee_angle"] = { 0: 0, 1: angle, 2: "Bad" }
def reverse_pivot(self): lshoulder = self.kp[2][5] lfoot = self.kp[2][14] rfoot = self.kp[2][11] angle = p3_angle(lshoulder, lfoot, rfoot) if 50 <= angle <= 85: self.feedback["reverse_pivot"] = { 0: 2, 1: angle, 2: "체중 이동이 정상적입니다.", } elif 85 < angle <= 100: self.feedback["reverse_pivot"] = { 0: 1, 1: angle, 2: "백스윙 자세에서 체중이 앞발로 이동하고 있습니다. 역피봇은 볼의 윗부분을 맟출 확률을 높이고 thin shots를 유도합니다.", } else: self.feedback["reverse_pivot"] = { 0: 0, 1: angle, 2: "백스윙 자세에서 체중이 앞발로 이동하고 있습니다. 역피봇은 볼의 윗부분을 맟출 확률을 높이고 thin shots를 유도합니다.", }
def keep_triangle(self): rshoulder = self.kp[1][2] relbow = self.kp[1][3] rwrist = self.kp[1][4] angle = p3_angle(rshoulder, relbow, rwrist) if 145 <= angle <= 180: self.feedback["keep_triangle"] = { 0: 2, 1: angle, 2: "어깨, 손 삼각형 유지" } elif 140 <= angle <= 180: self.feedback["keep_triangle"] = { 0: 1, 1: angle, 2: "어드레스 때 세팅한 어깨와 손의 삼각형을 유지하세요." } else: self.feedback["keep_triangle"] = { 0: 0, 1: angle, 2: "어드레스 때 세팅한 어깨와 손의 삼각형을 유지하세요." }
def bending_left_arm(self): lshoulder = self.kp[2][2] lelbow = self.kp[2][3] lwrist = self.kp[2][4] angle = p3_angle(lshoulder, lelbow, lwrist) if 140 <= angle: self.feedback["bending_arms"] = { 0: 2, 1: angle, 2: "팔 구부러짐이 없습니다." } elif 125 <= angle: self.feedback["bending_arms"] = { 0: 1, 1: angle, 2: "손을 몸에서 멀리 밀면 클럽이 더 먼 거리를 이동하게 됩니다. 샷의 일관성 또한 향상됩니다." } else: self.feedback["bending_arms"] = { 0: 0, 1: angle, 2: "손을 몸에서 멀리 밀면 클럽이 더 먼 거리를 이동하게 됩니다. 샷의 일관성 또한 향상됩니다." }
def wrist(self): lfoot = self.kp[1][11] club = self.kp[1][25] rfoot = self.kp[1][14] if club[0] == 0: self.feedback["wrist"] = {0: 0, 1: 0, 2: "클럽 헤드를 감지하지 못 했습니다."} return angle = p3_angle(lfoot, club, rfoot) if 145 <= angle <= 180: self.feedback["wrist"] = {0: 2, 1: angle, 2: "클럽 헤드 움직임이 좋아요."} elif 140 <= angle <= 180: self.feedback["wrist"] = { 0: 1, 1: angle, 2: "테이크 어웨이 시 클럽 헤드를 볼과 평행하게 움직이세요. 클럽이 몸 안쪽이나 바깥쪽을 가리키지 않도록 하세요." } else: self.feedback["wrist"] = { 0: 0, 1: angle, 2: "테이크 어웨이 시 클럽 헤드를 볼과 평행하게 움직이세요. 클럽이 몸 안쪽이나 바깥쪽을 가리키지 않도록 하세요." }
def side_bending_arm(self): lshoulder = self.kp[3][4] head = self.kp[3][25] lwrist = self.kp[3][5] angle = p3_angle(lshoulder, head, lwrist) if 0 <= angle <= 18: self.feedback["side_bending_arm"] = {0: 2, 1: angle, 2: "good"} elif 0 <= angle <= 60: self.feedback["side_bending_arm"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["side_bending_arm"] = {0: 0, 1: angle, 2: "bad"}
def wrist_impact(self): lshoulder = self.kp[5][5] lelbow = self.kp[5][6] lwrist = self.kp[5][7] angle = p3_angle(lshoulder, lelbow, lwrist) if 160 <= angle <= 180: self.feedback["wrist_impact"] = {0: 2, 1: angle, 2: "Good."} elif 150 <= angle <= 169: self.feedback["wrist_impact"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["wrist_impact"] = {0: 0, 1: angle, 2: "bad"}
def left_foot(self): lhip = self.kp[4][12] lfoot = self.kp[4][14] line = [lfoot[5], lhip[7]] angle = p3_angle(lhip, lfoot, line) if 6 <= angle <= 12.5: self.feedback["left_foot"] = {0: 2, 1: angle, 2: "Good."} elif 2.5 <= angle <= 16: self.feedback["left_foot"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["left_foot"] = {0: 0, 1: angle, 2: "bad"}
def club_head(self): rfoot = self.kp[3][11] lwrits = self.kp[3][4] ghead = self.kp[3][25] angle = p3_angle(rfoot, lwrits, ghead) if 95 <= angle <= 115: self.feedback["club_head"] = {0: 2, 1: angle, 2: "good"} elif 90 <= angle <= 120: self.feedback["club_head"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["club_head"] = {0: 0, 1: angle, 2: "bad"}
def back_face(self): lshoulder = self.kp[3][5] rshoulder = self.kp[3][2] lfoot = self.kp[3][14] angle = p3_angle(lshoulder, rshoulder, lfoot) if 70 <= angle <= 80: self.feedback["back_face"] = {0: 2, 1: angle, 2: "good"} elif 65 <= angle <= 88: self.feedback["back_face"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["back_face"] = {0: 0, 1: angle, 2: "bad"}
def wrist(self): lfoot = self.kp[1][11] head = self.kp[1][25] rfoot = self.kp[1][14] angle = p3_angle(lfoot, head, rfoot) if 145 <= angle <= 180: self.feedback["wrist"] = {0: 2, 1: angle, 2: "good."} elif 140 <= angle <= 180: self.feedback["wrist"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["wrist"] = {0: 0, 1: angle, 2: "bad"}
def keep_triangle(self): rshoulder = self.kp[1][2] relbow = self.kp[1][3] rwrist = self.kp[1][4] angle = p3_angle(rshoulder, relbow, rwrist) if 145 <= angle <= 180: self.feedback["keep_triangle"] = {0: 2, 1: angle, 2: "good."} elif 140 <= angle <= 180: self.feedback["keep_triangle"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["keep_triangle"] = {0: 0, 1: angle, 2: "bad"}
def chicken_wing(self): lshoulder = self.kp[6][5] lelbow = self.kp[6][6] lwrist = self.kp[6][7] angle = p3_angle(lshoulder, lelbow, lwrist) if 165 <= angle <= 180: self.feedback["chicken_wing"] = {0: 2, 1: angle, 2: "Good."} elif 155 <= angle <= 180: self.feedback["chicken_wing"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["chicken_wing"] = {0: 0, 1: angle, 2: "bad"}
def back_angle(self): lshoulder = self.kp[6][1] lhip = self.kp[6][8] lwrist = self.kp[6][9] angle = p3_angle(lshoulder, lhip, lwrist) if 70 <= angle <= 85: self.feedback["back_angle"] = {0: 2, 1: angle, 2: "Good."} elif 65 <= angle <= 92: self.feedback["back_angle"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["back_angle"] = {0: 0, 1: angle, 2: "bad"}
def bending_left_arm(self): lhip = self.kp[4][12] lfoot = self.kp[2][14] line = [lfoot[0], lhip[1]] angle = p3_angle(lhip, lfoot, line) if 6 <= angle <= 12.5: self.feedback["bending_left_arm"] = {0: 2, 1: angle, 2: "Good."} elif 5 <= angle <= 16: self.feedback["bending_left_arm"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["bending_left_arm"] = {0: 0, 1: angle, 2: "bad"}
def back_angle(self): lshoulder = self.kp[5][0] lelbow = self.kp[5][8] lwrist = self.kp[5][9] angle = p3_angle(lshoulder, lelbow, lwrist) if 55 <= angle <= 65: self.feedback["back_angle"] = {0: 2, 1: angle, 2: "Good."} elif 45 <= angle <= 70: self.feedback["back_angle"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["back_angle"] = {0: 0, 1: angle, 2: "bad"}
def club_head(self): kkumchi = self.kp[4][3] lwrits = self.kp[4][4] clubhead = self.kp[4][25] angle = p3_angle(kkumchi, lwrits, clubhead) if 140 <= angle <= 170: self.feedback["club_head"] = {0: 2, 1: angle, 2: "Good."} elif 120 <= angle <= 180: self.feedback["club_head"] = {0: 1, 1: angle, 2: "So So"} else: self.feedback["club_head"] = {0: 0, 1: angle, 2: "bad"}
def bending_knee(self): lhip = self.kp[2][12] lknee = self.kp[2][13] lfoot = self.kp[2][14] angle = p3_angle(lhip, lknee, lfoot) if 140 <= angle <= 150: self.feedback["bending_knee"] = {0: 2, 1: angle, 2: "good"} elif 135 <= angle <= 158: self.feedback["bending_knee"] = { 0: 1, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." } else: self.feedback["bending_knee"] = { 0: 0, 1: angle, 2: "체중 이동 중 왼 다리가 과다하게 이동해서는 안 됩니다. 왼 무릎이 공을 바라본다고 생각하세요." }
def back_angle(self): oue = self.kp[0][9] chukan = self.kp[0][10] sita = self.kp[0][11] angle = p3_angle(oue, chukan, sita) if 148 <= angle <= 153: self.feedback["back_angle"] = {0: 2, 1: angle, 2: "척추 각도가 안정적입니다."} elif 144 <= angle <= 147: self.feedback["back_angle"] = { 0: 1, 1: angle, 2: "양손이 편하게 움직일 수 있도록 골반과 허리에 적당한 각도를 유지해주세요" } else: self.feedback["back_angle"] = { 0: 0, 1: angle, 2: "양손이 편하게 움직일 수 있도록 골반과 허리에 적당한 각도를 유지해주세요" }
def wrist_angle_downswing(self): kkumchi = self.kp[4][3] lwrits = self.kp[4][4] clubhead = self.kp[4][25] angle = p3_angle(kkumchi, lwrits, clubhead) if 55 <= angle <= 90: self.feedback["wrist_angle_downswing"] = { 0: 2, 1: angle, 2: "Good." } elif 43 <= angle <= 110: self.feedback["wrist_angle_downswing"] = { 0: 1, 1: angle, 2: "So So" } else: self.feedback["wrist_angle_downswing"] = {0: 0, 1: angle, 2: "bad"}
def wrist_angle_downswing(self): kkumchi = self.kp[4][3] lwrits = self.kp[4][4] clubhead = self.kp[4][25] angle = p3_angle(kkumchi, lwrits, clubhead) if clubhead[0] == 0: self.feedback["wrist_angle_downswing"] = { 0: 0, 1: angle, 2: "클럽 헤드를 감지하지 못 했습니다." } if angle <= 90: self.feedback["wrist_angle_downswing"] = { 0: 2, 1: angle, 2: "손목 코킹 체크" } elif angle <= 125: self.feedback["wrist_angle_downswing"] = { 0: 1, 1: angle, 2: "백스윙 시 세팅된 손목의 코킹이 다운스윙 때도 유지되어야 합니다. 임팩트 후 릴리즈 자세에서 코킹을 풀도록 연습해보세요." } else: self.feedback["wrist_angle_downswing"] = { 0: 0, 1: angle, 2: "백스윙 시 세팅된 손목의 코킹이 다운스윙 때도 유지되어야 합니다. 임팩트 후 릴리즈 자세에서 코킹을 풀도록 연습해보세요." }