Projects/런썸(AI Runner Pose)

[RunSome 개발일지 #02] 러닝 영상 한 편으로 무릎 각도와 착지 순간(Foot Strike) 잡아내기 (MediaPipe & OpenCV)

jsummer07 2026. 10. 9. 19:29

지난 1편에서는 잦은 통증과 창업 도전의 실패를 거치며, "내 손으로 직접 러닝 자세 분석 AI를 만들겠다"고 결심한 배경과 기본 환경 구축을 다루었습니다.

기본적인 관절 스켈레톤 추출에 이어, 이번 단계에서는 스마트폰 측면 영상만으로 러닝 생체역학의 핵심 지표인 상체 기울기(Torso Lean)와 착지 순간(Foot Strike)을 자동으로 판정하는 파이프라인을 구축했습니다.


1. 러너의 부상을 예측하는 핵심 지표

러닝 자세 분석에서 중요한 것은 단순한 관절 위치가 아니라 '착지하는 순간 어떤 각도를 이루고 있는가'입니다.

  • 상체 기울기 (Torso Lean): 지면 수직선 대비 상체가 약 5°~10° 정도 자연스럽게 앞으로 기울어야 효율적인 추진력을 얻고 허리 부담을 줄입니다.
  • 착지 순간(Foot Strike) 감지: 발이 공중에 떠 있다가 지면을 딱 디디는 바로 그 프레임을 자동으로 잡아내는 기준점입니다.
  • 착지 시 무릎 각도 (Knee Angle at Strike): 발이 닿는 순간 무릎이 지나치게 펴져 있으면(160° 이상), 지면 충격이 무릎과 골반으로 바로 전달되어 부상 위험이 급증합니다.

2. 센서 없이 '착지 순간'을 감지하는 알고리즘

지면 접촉 센서 없이 2D 영상만으로 착지 시점을 잡기 위해 발목 랜드마크의 Y축 궤적 변화량을 추적했습니다.

  • 영상 좌표계는 화면 아래로 내려갈수록 Y값이 커집니다.
  • 발이 지면을 향해 내려갈 때는 발목의 Y값이 계속 증가합니다(하강).
  • 발이 지면에 닿고 몸이 앞으로 넘어가면서 다시 발을 뗄 때, Y값은 극대점을 찍고 감소하기 시작합니다(반등).
  • 즉, 발목의 하강 궤적이 멈추고 다시 위로 올라가는 극대점(Local Maximum) 순간을 착지 프레임(Foot Strike)으로 판정하도록 로직을 설계했습니다.

3. 핵심 구현 코드 (Key Code Snippets)

기존 파이프라인(1편 코드)에 추가된 핵심 알고리즘 블록 두 가지입니다.

① 수직선 대비 상체 기울기 연산

골반과 어깨 좌표의 상대적 차이(dx, dy)를 아크탄젠트로 계산하여 지면 수직선 대비 상체가 앞으로 몇 도 기울어졌는지 도출합니다.

def calculate_torso_lean(shoulder, hip):
    dx = shoulder[0] - hip[0]
    dy = hip[1] - shoulder[1]  # 화면 좌표계 반전 보정 (상단이 0)
    rad = np.arctan2(dx, dy)
    return int(np.degrees(rad))

② 발목 Y축 궤적 기반 착지 감지 및 각도 스냅샷

발목이 하강을 멈추고 반등하는 순간을 포착하여 화면에 알림을 띄우고 당시 무릎 각도를 고정 기록합니다.

# 착지 순간(Foot Strike) 감지 조건문
current_ankle_y = ankle[1]

# 1. 발목 하강 지속 여부 판정 (Y 증가)
if current_ankle_y > prev_ankle_y + 0.002:
    is_descending = True

# 2. 하강 후 지면에 닿고 다시 반등하는 순간 포착
elif is_descending and (current_ankle_y < prev_ankle_y - 0.002):
    strike_counter = 6            # 알림 문구를 유지할 프레임 수
    last_strike_knee = knee_angle # 착지 시점의 무릎 각도 스냅샷
    is_descending = False

prev_ankle_y = current_ankle_y

💡 비디오 캡처, 관절 추출, 파일 저장 등 기본 전체 코드는 지난 1편 포스팅을 참고해 주세요.


4. 분석 결과와 러닝 데이터 해석

새로운 로직을 적용해 분석 영상을 추출한 결과, 유의미한 생체역학 데이터를 확인할 수 있었습니다.

  • 상체 기울기 (Torso: 7 deg): 수직축 기준 7도 앞쪽으로 기울어져 이상적인 러닝 폼 기준(5°~10°)에 부합합니다. 체중 중심이 뒤로 처지지 않고 자연스럽게 실려 있습니다.
  • 착지 순간 무릎 각도 (Knee: 153 deg): 발바닥이 지면에 닿는 순간 정확히 FOOT STRIKE! 트리거가 발동되며 당시 무릎 각도(153°)가 캡처되었습니다.
  • 오버스트라이드 경향 관찰: 스켈레톤 연결선을 보면, 착지하는 발이 골반 중심선보다 다소 앞쪽으로 뻗어 나가면서 착지하는 패턴이 시각적으로 명확히 드러납니다.

기획서에 적어 두었던 "스마트폰 카메라 하나로 자세와 각도를 짚어주는 기능"이 모니터 위에서 실제로 검증된 순간입니다.


다음 단계: 오버스트라이드 자동 판정 로직

착지 타이밍과 상체 각도 추출까지 안정적으로 동작하므로, 다음 편에서는 '오버스트라이드(Overstride) 위험도 자동 판정'을 구현합니다.

착지 순간 골반(X)과 발목(X) 사이의 수평 거리를 계산해 충격량이 큰 위험 착지인지 여부를 화면에 실시간 경고로 띄우는 알고리즘을 연결해 보겠습니다.