網球 AI Coach
利用 3D Pose AI 打造運動員的數位孿生教練。把揮拍的 3D 骨架資料,變成學習者看得懂的分數和改善建議。
- 角色
- 負責動作分析、圖表視覺化
- 技術
- PythonNumPyscikit-learnChart.jsThree.jsOpenAI API
我接手的是哪一段
前段已經能把一次揮拍變成 3D 骨架的軌跡。但原始座標對選手沒有意義,他想知道的是哪個動作哪裡有問題、先改什麼。
影片裡看到的三個畫面
1
儀表板
一次揮拍的總分、能力雷達圖,以及每個動作面向的分數和建議。

2
3D 骨架
可以播放,也可以切換正面、側面、背面、上方四種視角,對照軌跡看動作。

3
三球綜合報告
整段練習的分數和文字建議,可以列印成 A4 或簡易版。

做了什麼
我把動作拆成 8 個面向來分析:後擺、前擺、擊球、隨球、重心、拍面、擊球區、頭部穩定。每個面向是獨立的模組,用 K 近鄰把使用者的動作和專家的資料比對,再依關節角度和位置的差異寫出建議。
最後由一個整合層把各面向的分數合起來,算出總分,挑出最該先改的項目。報告和 3D 頁面也由我串在一起。
我做的動作分析
每個面向會先找出對應的時間點,例如球落地、擊球瞬間、收拍完成,再檢查那一刻的關節角度和位置,和專家資料的分布比較。
後擺(拉拍)
- 看哪個時間點
- 球落地前後
- 檢查重點
- 側身是否完整(肩線與腰線的旋轉角度)、手腕高度、拍頭朝向,以及球落地時是否已經拉拍到位
前擺(出拍)
- 看哪個時間點
- 球彈起到擊球前
- 檢查重點
- 手腕是否下放、拍頭朝後;手腕是否向前帶動球拍;擊球前拍頭朝下的角度
擊球
- 看哪個時間點
- 擊球瞬間
- 檢查重點
- 轉身的幅度;手腕高度是否在膝蓋到肩膀之間,以及相對身體朝向的位置
隨球(收拍)
- 看哪個時間點
- 擊球後到收拍完成
- 檢查重點
- 手腕是否往左肩方向收、收到接近肩膀的高度,收拍時拍頭是否朝下
重心
- 看哪個時間點
- 擊球瞬間與擊球後
- 檢查重點
- 擊球時膝蓋彎曲的程度;擊球後重心是否往前移
拍面
- 看哪個時間點
- 擊球後
- 檢查重點
- 用球飛出去的路徑和地面的夾角,推估擊球時的拍面角度
擊球區
- 看哪個時間點
- 擊球瞬間
- 檢查重點
- 擊球點在身體的上下、前後、左右位置,以骨盆寬度換算後和專家的分布比較
頭部穩定
- 看哪個時間點
- 擊球前到擊球後
- 檢查重點
- 頭部是否和身體一起平行移動;耳朵到眼睛的連線是否維持不變(眼睛有沒有盯球);有沒有揮空或打到拍框
| 面向 | 看哪個時間點 | 檢查重點 |
|---|---|---|
| 後擺(拉拍) | 球落地前後 | 側身是否完整(肩線與腰線的旋轉角度)、手腕高度、拍頭朝向,以及球落地時是否已經拉拍到位 |
| 前擺(出拍) | 球彈起到擊球前 | 手腕是否下放、拍頭朝後;手腕是否向前帶動球拍;擊球前拍頭朝下的角度 |
| 擊球 | 擊球瞬間 | 轉身的幅度;手腕高度是否在膝蓋到肩膀之間,以及相對身體朝向的位置 |
| 隨球(收拍) | 擊球後到收拍完成 | 手腕是否往左肩方向收、收到接近肩膀的高度,收拍時拍頭是否朝下 |
| 重心 | 擊球瞬間與擊球後 | 擊球時膝蓋彎曲的程度;擊球後重心是否往前移 |
| 拍面 | 擊球後 | 用球飛出去的路徑和地面的夾角,推估擊球時的拍面角度 |
| 擊球區 | 擊球瞬間 | 擊球點在身體的上下、前後、左右位置,以骨盆寬度換算後和專家的分布比較 |
| 頭部穩定 | 擊球前到擊球後 | 頭部是否和身體一起平行移動;耳朵到眼睛的連線是否維持不變(眼睛有沒有盯球);有沒有揮空或打到拍框 |